<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>server &#8211; Best DevOps</title>
	<atom:link href="https://www.bestdevops.com/tag/server/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.bestdevops.com</link>
	<description>Lets Learn, Do it &#38; Share! Thats a Best DevOps!!!</description>
	<lastBuildDate>Tue, 13 Oct 2026 10:09:52 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.3</generator>
	<item>
		<title>How to create an SSH key in Gitlab?</title>
		<link>https://www.bestdevops.com/how-to-create-an-ssh-key-in-gitlab/</link>
		
		<dc:creator><![CDATA[rahulkr]]></dc:creator>
		<pubDate>Thu, 25 Nov 2021 13:16:41 +0000</pubDate>
				<category><![CDATA[DevOps]]></category>
		<category><![CDATA[command]]></category>
		<category><![CDATA[Developer]]></category>
		<category><![CDATA[gitbash]]></category>
		<category><![CDATA[GitLab]]></category>
		<category><![CDATA[key]]></category>
		<category><![CDATA[programmers]]></category>
		<category><![CDATA[server]]></category>
		<category><![CDATA[text editor]]></category>
		<guid isPermaLink="false">https://www.bestdevops.com/?p=22465</guid>

					<description><![CDATA[Hello my folks, welcome to the fascinating world of Gitlab. Nowadays, this has become a real use of every programmer/developer. [&#8230;]]]></description>
										<content:encoded><![CDATA[
<div class="wp-block-image"><figure class="aligncenter size-full is-resized"><img fetchpriority="high" decoding="async" src="https://www.bestdevops.com/wp-content/uploads/2021/11/gitlab-add-ssh-key-image-feature-800x400-1.png" alt="" class="wp-image-22467" width="738" height="369" srcset="https://www.bestdevops.com/wp-content/uploads/2021/11/gitlab-add-ssh-key-image-feature-800x400-1.png 800w, https://www.bestdevops.com/wp-content/uploads/2021/11/gitlab-add-ssh-key-image-feature-800x400-1-300x150.png 300w, https://www.bestdevops.com/wp-content/uploads/2021/11/gitlab-add-ssh-key-image-feature-800x400-1-768x384.png 768w" sizes="(max-width: 738px) 100vw, 738px" /></figure></div>



<p class="wp-block-paragraph">Hello my folks, welcome to the fascinating world of Gitlab. Nowadays, this has become a real use of every programmer/developer. You know every<a href="https://www.devopsschool.com/"> programmer</a> needs some space to situate their projects and code which have been made by them. Today, in this Gitlab mainstream, we are going to elaborate on the SSH key in this you will learn about the fact of how can you create, manage with the SSH key.</p>



<h2 class="wp-block-heading">What is an SSH key?</h2>



<p class="wp-block-paragraph">Let’s get started with SSH. SSH stands for secured shell and now, comes to the place of uses what is the use? This is used for authentication, by setting SSH you can connect to the Gitlab server without using a username and password each time. Once, you will set the SSH key so, you may skip using your username and password each time to connect your Gitlab server.</p>



<h2 class="wp-block-heading">How to set up an SSH key in Gitlab?</h2>



<p class="wp-block-paragraph">Let see, what will have to do here?</p>



<p class="wp-block-paragraph"><strong>Step 1: Run command SSH- keygen</strong></p>



<p class="wp-block-paragraph">You will have to run this command. If you are on MacBook, you can put terminal and will run the command <strong><em>SSH-keygen.</em></strong> You may enter the location or file where you have to save the key and press the enter key. So, you will have your ssh key created. This was on mac.</p>



<p class="wp-block-paragraph">On mac. &#8211; run command on terminal</p>



<p class="wp-block-paragraph">On windows – use putty or Git bash</p>



<p class="wp-block-paragraph">If you are on windows then you can use an application or a client called putty, it is ssh client that you can use on windows or you can also use Git bash to run the command. If you will have installed it before, you will go to your windows system and search for Git bash. And you will adjust fonts if you will need them. So, you will run <em><strong>$ ssh-keygen</strong></em> then it will ask you to enter the file do you want to save it then again, you will press the enter so, it will have been created. You will go to your folder from local disk to <strong><em>.ssh</em></strong> in that two files will be created in the <em>id_rsa</em> and <em>id_rsa.pub</em></p>



<p class="wp-block-paragraph">Now, step no.2 will be</p>



<p class="wp-block-paragraph"><strong>Step 2: log in to Gitlab account</strong></p>



<p class="wp-block-paragraph"><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Go to an account</strong> &gt;&gt; <strong>Settings</strong> &gt;&gt; <strong>SSH keys</strong></p>



<p class="wp-block-paragraph">So, you will go to your Gitlab and log in. you will sign in to your account if you will go to your account or profile at the top right. You would find settings there and if you will go in that. So, you will find an option for SSH key then you will click on that. You would add the content of your file id_rsa.pub. If you will go to the file and open it with any text editor like notepad and notepad++, you can copy the entire thing from there. And you will paste it to the SSH key. Suppose, you want to give a name to your key then you can add that name in the title option and switch to add key. So, you will see that everything would be edited there. There would be a key that you can use to authenticate and log in to the Gitlab server.</p>



<p class="wp-block-paragraph">Now, here step no.3 is</p>



<p class="wp-block-paragraph"><strong>Step 3: copy contents of id_rsa.pub and add key</strong></p>



<p class="wp-block-paragraph"><strong>Step 4: verify SSh key is added</strong></p>



<p class="wp-block-paragraph"> You have been seen. This is how you can add an SSH key to your Gitlab. I wish this all will be very useful for you.</p>



<h4 class="wp-block-heading">Related video:</h4>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe  id="_ytid_44834"  width="675" height="379"  data-origwidth="675" data-origheight="379" src="https://www.youtube.com/embed/QaO9aWy4rmc?enablejsapi=1&#038;autoplay=0&#038;cc_load_policy=0&#038;cc_lang_pref=&#038;iv_load_policy=1&#038;loop=0&#038;rel=1&#038;fs=1&#038;playsinline=0&#038;autohide=2&#038;theme=dark&#038;color=red&#038;controls=1&#038;disablekb=0&#038;" class="__youtube_prefs__  epyt-is-override  no-lazyload" title="YouTube player"  allow="fullscreen; accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen data-no-lazy="1" data-skipgform_ajax_framebjll=""></iframe>
</div></figure>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Configuring Virtual Hosting in Apache</title>
		<link>https://www.bestdevops.com/configuring-virtual-hosting-in-apache/</link>
		
		<dc:creator><![CDATA[pradeep]]></dc:creator>
		<pubDate>Fri, 20 Aug 2021 10:23:22 +0000</pubDate>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[server]]></category>
		<category><![CDATA[virtual host]]></category>
		<category><![CDATA[Virtual machines]]></category>
		<guid isPermaLink="false">https://www.bestdevops.com/?p=19505</guid>

					<description><![CDATA[&#8220;Virtual hosting is a method for hosting multiple domain names (with separate handling of each name) on a single server [&#8230;]]]></description>
										<content:encoded><![CDATA[
<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>&#8220;Virtual hosting is a method for hosting multiple domain names (with separate handling of each name) on a single server (or pool of servers).&#8221;</p><cite>Wikipedia</cite></blockquote>



<h2 class="wp-block-heading">How Does Apache Know Which Site to Serve?</h2>



<p class="wp-block-paragraph"><br>The short answer to your specific case: apache will serve the FIRST overlapping virtual host. Since 000-default is before fc.localhost in the alphabet the first virtualhost is loaded and served.</p>



<p class="wp-block-paragraph">To answer what i assume is the follow up question: You can host many sites on the same IP:PORT using named VirtualHosts</p>



<p class="wp-block-paragraph">T<strong>he host field in the http request header identifies which site (virtual<br>host) to serve:</strong></p>



<figure class="wp-block-image size-full is-resized"><img decoding="async" src="https://www.bestdevops.com/wp-content/uploads/2021/08/image-110.png" alt="" class="wp-image-19506" width="571" height="66" srcset="https://www.bestdevops.com/wp-content/uploads/2021/08/image-110.png 742w, https://www.bestdevops.com/wp-content/uploads/2021/08/image-110-300x35.png 300w" sizes="(max-width: 571px) 100vw, 571px" /></figure>



<p class="wp-block-paragraph"><strong>Matched against the containers in the configuration file</strong></p>



<figure class="wp-block-image size-full is-resized"><img loading="lazy" decoding="async" src="https://www.bestdevops.com/wp-content/uploads/2021/08/image-111.png" alt="" class="wp-image-19507" width="651" height="413" srcset="https://www.bestdevops.com/wp-content/uploads/2021/08/image-111.png 920w, https://www.bestdevops.com/wp-content/uploads/2021/08/image-111-300x191.png 300w, https://www.bestdevops.com/wp-content/uploads/2021/08/image-111-768x488.png 768w" sizes="auto, (max-width: 651px) 100vw, 651px" /></figure>



<h2 class="wp-block-heading">A More Complete Virtual Host Definition</h2>



<p class="wp-block-paragraph">You can put (almost) any directive inside a virtual host container For example, it&#8217;s common to write separate logs for each site</p>



<figure class="wp-block-image size-full is-resized"><img loading="lazy" decoding="async" src="https://www.bestdevops.com/wp-content/uploads/2021/08/image-113.png" alt="" class="wp-image-19509" width="608" height="166" srcset="https://www.bestdevops.com/wp-content/uploads/2021/08/image-113.png 735w, https://www.bestdevops.com/wp-content/uploads/2021/08/image-113-300x82.png 300w" sizes="auto, (max-width: 608px) 100vw, 608px" /></figure>



<h2 class="wp-block-heading">Name Resolution</h2>



<ol class="wp-block-list"><li><strong>In the &#8220;real world&#8221; our East and West sites would each have an entry in DNS (Domain Name Service)</strong></li><li><strong>Our demonstration system uses only /etc/hosts for name resolution:</strong></li></ol>



<figure class="wp-block-image size-full is-resized"><img loading="lazy" decoding="async" src="https://www.bestdevops.com/wp-content/uploads/2021/08/image-114.png" alt="" class="wp-image-19510" width="426" height="91" srcset="https://www.bestdevops.com/wp-content/uploads/2021/08/image-114.png 579w, https://www.bestdevops.com/wp-content/uploads/2021/08/image-114-300x64.png 300w" sizes="auto, (max-width: 426px) 100vw, 426px" /></figure>



<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Setup Virtual Hosts with Apache Web Server on Linux</title>
		<link>https://www.bestdevops.com/setup-virtual-hosts-with-apache-web-server-on-linux/</link>
		
		<dc:creator><![CDATA[pradeep]]></dc:creator>
		<pubDate>Mon, 09 Aug 2021 09:34:09 +0000</pubDate>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Vmware]]></category>
		<category><![CDATA[server]]></category>
		<category><![CDATA[virtualhosts]]></category>
		<guid isPermaLink="false">https://www.bestdevops.com/?p=18889</guid>

					<description><![CDATA[First thing you need to do is to install apache in your machine. Apache Installation Apache gives its functionality and [&#8230;]]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">First thing you need to do is to install apache in your machine.</h2>



<h3 class="wp-block-heading">Apache Installation</h3>



<p class="wp-block-paragraph">Apache gives its functionality and the components to individual units which can be customized and configured independently. The basic unit that describes a site or a domain is called a virtual host.</p>



<p class="wp-block-paragraph">This allows the administrator to use one server to host multiple domains or sites with a single interface or IP address by using a mechanism.</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">$ sudo apt-<span class="hljs-keyword">get</span> update
$ sudo apt-<span class="hljs-keyword">get</span> install apache2</code></span></pre>


<h3 class="wp-block-heading">Create the Directory Structure</h3>



<p class="wp-block-paragraph">A directory structure shall hold the site information and data which will be served to visitors. By default, the top-level directory for apache is /var/www and we will be setting them to the individual directories under the /var/www directory for each site/domain.</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">$ sudo mkdir -p /<span class="hljs-keyword">var</span>/www/firstSite.com
$ sudo mkdir -p /<span class="hljs-keyword">var</span>/www/secondSite.com</code></span></pre>


<h3 class="wp-block-heading">Grant Permissions</h3>



<p class="wp-block-paragraph">Our directory&#8217;s owned by our root user. If we want our normal user to be able to modify files in our web directories, then we have to change the ownership to others normal users.</p>


<pre class="wp-block-code"><span><code class="hljs language-php">$ sudo chown -R $USER:$USER /<span class="hljs-keyword">var</span>/www/firstSite.com
$ sudo chown -R $USER:$USER /<span class="hljs-keyword">var</span>/www/secondSite.com
$ sudo chmod -R <span class="hljs-number">755</span> /<span class="hljs-keyword">var</span>/www</code></span></pre>


<h3 class="wp-block-heading">Create Demo Pages for for both sites.</h3>



<p class="wp-block-paragraph">To create a file we use touch command, The <em>touch command</em> is a standard command used in UNIX/<em>Linux</em> operating system which is used to create, change and modify timestamps of a file.</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">$ touch /<span class="hljs-keyword">var</span>/www/webserver1.com/index.html</code></span></pre>


<p class="wp-block-paragraph">Then put some lines of html.</p>


<pre class="wp-block-code"><span><code class="hljs language-xml"><span class="hljs-meta">&lt;!DOCTYPE <span class="hljs-meta-keyword">html</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">html</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">head</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">title</span>&gt;</span>Site one<span class="hljs-tag">&lt;/<span class="hljs-name">title</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">head</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">body</span>&gt;</span>

<span class="hljs-tag">&lt;<span class="hljs-name">h1</span>&gt;</span>Site one heading<span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">p</span>&gt;</span>My first paragraph.<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>

<span class="hljs-tag">&lt;/<span class="hljs-name">body</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">html</span>&gt;</span>
</code></span></pre>


<p class="wp-block-paragraph">We&#8217;ll copy and past the same page for second server and modify it accordingly</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">$ cp /<span class="hljs-keyword">var</span>/www/firstSite.com/index.html /<span class="hljs-keyword">var</span>/www/secondSite.com/index.html</code></span></pre>

<pre class="wp-block-code"><span><code class="hljs language-xml">$ nano /var/www/webserver2.com/index.html
<span class="hljs-tag">&lt;<span class="hljs-name">html</span>&gt;</span>
   <span class="hljs-tag">&lt;<span class="hljs-name">head</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">title</span>&gt;</span>Welcome to secondSite.com!<span class="hljs-tag">&lt;/<span class="hljs-name">title</span>&gt;</span>
   <span class="hljs-tag">&lt;/<span class="hljs-name">head</span>&gt;</span>
   <span class="hljs-tag">&lt;<span class="hljs-name">body</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">h1</span>&gt;</span>Success!<span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
   <span class="hljs-tag">&lt;/<span class="hljs-name">body</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">html</span>&gt;</span></code></span></pre>


<h3 class="wp-block-heading">Create New Virtual Host Files</h3>


<pre class="wp-block-code"><span><code class="hljs language-javascript">$ sudo cp /etc/apache2/sites-available/<span class="hljs-number">000</span>-<span class="hljs-keyword">default</span>.conf /etc/apache2/sites-available/firstSite.conf
$ sudo nano /etc/apache2/sites-available/firstSite.com.conf</code></span></pre>

<pre class="wp-block-code"><span><code class="hljs language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">VirtualHost</span> *<span class="hljs-attr">:80</span>&gt;</span>
   ServerAdmin admin@firstSite.com
   ServerName firstSite.com
   ServerAlias www.firstSite.com
   DocumentRoot /var/www/firstSite.com/
   ErrorLog ${APACHE_LOG_DIR}/error.log
   CustomLog ${APACHE_LOG_DIR}/access.log combined
<span class="hljs-tag">&lt;/<span class="hljs-name">VirtualHost</span>&gt;</span></code></span></pre>


<p class="wp-block-paragraph">Copy First Virtual Host file and customize for Second Domain webserver2.com</p>



<pre class="wp-block-preformatted">$ sudo cp /etc/apache2/sites-available/firstSite.com.conf /etc/apache2/sites-available/secondSite.com.conf
$ sudo nano /etc/apache2/sites-available/secondSite.com.conf</pre>



<p class="wp-block-paragraph">Do the same thing for secondSite VH</p>


<pre class="wp-block-code"><span><code class="hljs language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">VirtualHost</span> *<span class="hljs-attr">:80</span>&gt;</span>
   ServerAdmin admin@secondSite.com
   ServerName secondSite.com
   ServerAlias www.secondSite.com
   DocumentRoot /var/www/secondSite.com/
   ErrorLog ${APACHE_LOG_DIR}/error.log
   CustomLog ${APACHE_LOG_DIR}/access.log combined
<span class="hljs-tag">&lt;/<span class="hljs-name">VirtualHost</span>&gt;</span></code></span></pre>


<h3 class="wp-block-heading">Enable the New Virtual Host Files</h3>


<pre class="wp-block-code"><span><code class="hljs">$ sudo a2ensite webserver1.com.conf
$ sudo a2ensite webserver2.com.conf</code></span></pre>


<p class="wp-block-paragraph">We needed to restart Apache server</p>


<pre class="wp-block-code"><span><code class="hljs">$ sudo service apache2 restart</code></span></pre>


<h3 class="wp-block-heading">Testing the Websites</h3>


<pre class="wp-block-code"><span><code class="hljs">$ sudo /etc/hosts</code></span></pre>


<pre class="wp-block-preformatted">192.168.1.84 website1.com
192.168.1.84 website1.com</pre>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Full-text search with Node.js and ElasticSearch on Docker</title>
		<link>https://www.bestdevops.com/full-text-search-with-node-js-and-elasticsearch-on-docker/</link>
					<comments>https://www.bestdevops.com/full-text-search-with-node-js-and-elasticsearch-on-docker/#respond</comments>
		
		<dc:creator><![CDATA[anil]]></dc:creator>
		<pubDate>Mon, 16 Sep 2019 05:48:32 +0000</pubDate>
				<category><![CDATA[Docker]]></category>
		<category><![CDATA[Eleastic Search]]></category>
		<category><![CDATA[codebase]]></category>
		<category><![CDATA[Database]]></category>
		<category><![CDATA[Elasticsearch]]></category>
		<category><![CDATA[Node.js]]></category>
		<category><![CDATA[server]]></category>
		<guid isPermaLink="false">http://www.bestdevops.com/?p=7747</guid>

					<description><![CDATA[Source:-blog.logrocket Full-text search can be both scary and exciting. Some popular databases such as&#160;MySql&#160;and&#160;Postgres&#160;are an amazing solution for storing data… [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Source:-blog.logrocket<br></p>



<p class="wp-block-paragraph">Full-text search can be both scary and exciting. Some popular databases such as&nbsp;<strong>MySql</strong>&nbsp;and&nbsp;<strong>Postgres</strong>&nbsp;are an amazing solution for storing data… but when it comes to full-text search performances, there’s no competition with&nbsp;<strong>ElasticSearch</strong>.</p>



<p class="wp-block-paragraph">For those who don’t know, ElasticSearch is a search engine server built on top of <strong>Lucene</strong> with an amazing distributed-architecture support. According to db-engines.com, it is currently the most used search engine out there.</p>



<p class="wp-block-paragraph">In this post, we are going to build a simple REST application called The Quotes Database which will allow us to store and search as many quotes as we want.</p>



<p class="wp-block-paragraph">I’ve prepared a JSON file containing 5000+ quotes with their authors, we’ll be using it as our starting data for populating ElasticSearch.</p>



<h2 class="wp-block-heading">Setting up Docker</h2>



<p class="wp-block-paragraph">First of all, we don’t want to install ElasticSearch on our machine. We’ll be using Docker for orchestrating both the Node.js server and the ES instance on a container, which will allow us to deploy a production-ready application with all the dependencies that it needs.</p>



<p class="wp-block-paragraph">Let’s create a&nbsp;<code>Dockerfile</code>&nbsp;inside our project root folder:</p>



<pre class="wp-block-preformatted">FROM node:10.15.3-alpine

WORKDIR /usr/src/app

COPY package*.json ./

RUN npm install
RUN npm install -g pm2

COPY . ./

EXPOSE 3000
EXPOSE 9200

CMD npm run start</pre>



<p class="wp-block-paragraph">As you can see, we’re telling Docker that we’ll run a&nbsp;<strong>Node.js 10.15.3-alpine</strong>&nbsp;runtime. We’ll also create a new working directory under&nbsp;<code>/usr/src/app</code>, where we’ll copy both the&nbsp;<code>package.json</code>&nbsp;and the&nbsp;<code>package-lock.json</code>&nbsp;files. That way, Docker will be able to run&nbsp;<code>npm install</code>&nbsp;inside our&nbsp;<code>WORKDIR</code>, installing our needed dependencies.</p>



<p class="wp-block-paragraph">We’ll also install <strong>PM2</strong> by running <code>RUN npm install -g pm2</code>. The Node.js runtime is single-threaded, so if a process crashes, the entire app needs to be restarted… <strong>PM2</strong> checks the Node.js process status and restarts it when the app goes down for any reason.</p>



<p class="wp-block-paragraph">After installing PM2, we’ll copy our codebase inside our&nbsp;<code>WORKDIR</code>&nbsp;(<code>COPY&nbsp;.&nbsp;./</code>), and we tell Docker to expose two ports,&nbsp;<code>3000</code>, which will expose our RESTful service, and&nbsp;<code>9200</code>, which exposes the ElasticSearch service (<code>EXPOSE&nbsp;3000</code>&nbsp;and&nbsp;<code>EXPOSE&nbsp;9200</code>).</p>



<p class="wp-block-paragraph">Last but not least, we tell Docker which command will start the Node.js app with&nbsp;<code>npm run start</code>.</p>



<h2 class="wp-block-heading">Setting up docker-compose</h2>



<p class="wp-block-paragraph">Now you may be saying, ‘<em>Great, I get it! But how do I handle the ElasticSearch instance inside Docker? I can’t find it in my Dockerfile!’</em>… you’re right! That’s where&nbsp;<strong>docker-compose</strong>&nbsp;becomes useful. It allows us to orchestrate multiple Docker containers and to create a connection between them. So, let’s write down the&nbsp;<code>docker-compose.yml</code>&nbsp;file, which will be stored inside our project root directory:</p>



<pre class="wp-block-preformatted">version: '3.6'
services:
  api:
    image: node:10.15.3-alpine
    container_name: tqd-node
    build: .
    ports:
      - 3000:3000
    environment:
     - NODE_ENV=local
     - ES_HOST=elasticsearch
     - NODE_PORT=3000
     - ELASTIC_URL=http://elasticsearch:9200
    volumes:
      - .:/usr/src/app/quotes
    command: npm run start
    links:
        - elasticsearch
    depends_on:
        - elasticsearch
    networks: 
      - esnet
  elasticsearch:
    container_name: tqd-elasticsearch
    image: docker.elastic.co/elasticsearch/elasticsearch:7.0.1
    volumes:
      - esdata:/usr/share/elasticsearch/data
    environment:
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
      - discovery.type=single-node
    logging:
      driver: none
    ports:
      - 9300:9300
      - 9200:9200
    networks: 
      - esnet
volumes:
  esdata:
networks:
  esnet:</pre>



<p class="wp-block-paragraph">This is a bit more complex than our Dockerfile, but let’s analyze it:</p>



<ul class="wp-block-list"><li>We declare which version of&nbsp;<code>docker-compose.yml</code>&nbsp;file we’re using (<code>3.6</code>)</li><li>We declare our services:<ul><li><code>api</code>, which is our Node.js app. Just like in our Dockerfile, it requires the&nbsp;<code>node:10.15.3-alpine</code>&nbsp;image. We also assign a name to this container&nbsp;<code>tqd-node</code>, and here we call the previously created Dockerfile using the&nbsp;<code>build&nbsp;.</code>&nbsp;command.</li><li>We need to expose the&nbsp;<code>3000</code>&nbsp;port so we write these statements as follows&nbsp;<code>3000:3000</code>. It means that we’re mapping&nbsp;<strong>from</strong>&nbsp;the port&nbsp;<code>3000</code>&nbsp;(inside our container)&nbsp;<strong>to</strong>&nbsp;the port&nbsp;<code>3000</code>&nbsp;(accessible from our machine). Then we’ll set some environment variables. The value&nbsp;<code>elasticsearch</code>&nbsp;is a variable which refers to the&nbsp;<code>elasticsearch</code>&nbsp;service inside our&nbsp;<code>docker-compose.yml</code>&nbsp;file.</li><li>We also want to mount a volume&nbsp;<code>/usr/src/app/quotes</code>. That way, once we restart our container we’ll maintain our data without losing it.</li><li>Once more, we tell Docker which command we need to execute once the container starts up, then we set a link to the&nbsp;<code>elasticsearch</code>&nbsp;service. We also tell Docker to start the&nbsp;<code>api</code>&nbsp;service after the&nbsp;<code>elasticsearch</code>&nbsp;service has booted (using the&nbsp;<code>depends_on</code>&nbsp;directive).</li><li>Last but not least, we tell Docker to connect the&nbsp;<code>api</code>&nbsp;service under the&nbsp;<code>esnet</code>&nbsp;network. That’s because every container has its own network. That way, we say that&nbsp;<code>api</code>&nbsp;and&nbsp;<code>elasticsearch</code>&nbsp;services shares the same network so they will be able to call each other with the same ports.</li><li><code>elasticsearch</code>, which is (as you may have guessed) our ES service. It’s configuration is pretty similar to the&nbsp;<code>api</code>&nbsp;service. We’ll just cut off its verbose logs setting the&nbsp;<code>logging</code>&nbsp;directive to&nbsp;<code>driver:&nbsp;none</code>&nbsp;.</li></ul></li><li>We also declare our volumes, where we store the ES data.</li><li>And we declare our network,&nbsp;<code>esnet</code>.</li></ul>



<h2 class="wp-block-heading">Bootstrapping the Node.js app</h2>



<p class="wp-block-paragraph">Now we need to create our Node.js application, so let’s get started setting up our&nbsp;<code>package.json</code>&nbsp;file:</p>



<pre class="wp-block-preformatted">npm init -y</pre>



<p class="wp-block-paragraph">Now we need to install some dependencies:</p>



<pre class="wp-block-preformatted">npm i -s @elastic/elasticsearch body-parser cors dotenv express</pre>



<p class="wp-block-paragraph">Great! Our&nbsp;<code>package.json</code>&nbsp;file should look like this:</p>



<pre class="wp-block-preformatted">{
  "name": "nodejselastic",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" &amp;&amp; exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "@elastic/elasticsearch": "^7.3.0",
    "body-parser": "^1.19.0",
    "cors": "^2.8.5",
    "dotenv": "^8.0.0",
    "express": "^4.17.1"
  }
}</pre>



<p class="wp-block-paragraph">Let’s implement our ElasticSearch connector in Node.js. First, we need to create a new&nbsp;<code>/src/elastic.js</code>&nbsp;file:</p>



<pre class="wp-block-preformatted">const { Client } = require("@elastic/elasticsearch");
                   require("dotenv").config();

const elasticUrl = process.env.ELASTIC_URL || "http://localhost:9200";
const esclient   = new Client({ node: elasticUrl });
const index      = "quotes";
const type       = "quotes";</pre>



<p class="wp-block-paragraph">As you can see, here we set some constants that will be incredibly useful. First of all, we create a new connection to ElasticSearch using its official Node.js SDK, then we define an index (<code>"quotes"</code>) and an index type(<code>"quotes"</code> again, we’ll see later what they mean).</p>



<p class="wp-block-paragraph">Now we need to create an index on ElasticSearch. You can think of “indexes” as a SQL “database” equivalent. ElasticSearch is a NoSQL database, which means that it has no tables — it just stores JSON documents. An index is a logical namespace which maps to one or more primary shards and can have zero or more replica shards. You can read more about ElasticSearch indexes here.</p>



<p class="wp-block-paragraph">Let’s now define a function that will create our index:</p>



<pre class="wp-block-preformatted">async function createIndex(index) { 
  try {
    await esclient.indices.create({ index });
    console.log(`Created index ${index}`);
  } catch (err) {
    console.error(`An error occurred while creating the index ${index}:`);
    console.error(err);
  }
}</pre>



<p class="wp-block-paragraph">Now we need another function that creates the mapping for our quotes. The mapping defines the schema and types of our document:</p>



<pre class="wp-block-preformatted">async function setQuotesMapping () {
  try {
    const schema = {
      quote: {
        type: "text" 
      },
      author: {
        type: "text"
      }
    };

    await esclient.indices.putMapping({ 
      index, 
      type,
      include_type_name: true,
      body: { 
        properties: schema 
      } 
    })

    console.log("Quotes mapping created successfully");
  } catch (err) {
    console.error("An error occurred while setting the quotes mapping:");
    console.error(err);
  }
}</pre>



<p class="wp-block-paragraph">As you can see, we’re defining the schema for our documents, and we’re inserting it inside our&nbsp;<code>index</code>.</p>



<p class="wp-block-paragraph">Now let’s consider that ElasticSearch is a huge system and can take some seconds to boot up. We can’t connect to ES until it is ready, so we need a function that checks when the ES server is ready:</p>



<pre class="wp-block-preformatted">function checkConnection() {
  return new Promise(async (resolve) =&gt; {
    console.log("Checking connection to ElasticSearch...");
    let isConnected = false;
    while (!isConnected) {
      try {
        await esclient.cluster.health({});
        console.log("Successfully connected to ElasticSearch");
        isConnected = true;
      // eslint-disable-next-line no-empty
      } catch (_) {
      }
    }
    resolve(true);
  });
}</pre>



<p class="wp-block-paragraph">As you can see, we’re returning a promise. That’s because by using&nbsp;<code>async/await</code>&nbsp;we’re able to stop the entire Node.js process until this promise resolves, and it won’t do it until it connects to ES. That way, we force our Node.js to wait for ES before booting up.</p>



<p class="wp-block-paragraph">We’re done with ElasticSearch! Now let’s export our functions:</p>



<pre class="wp-block-preformatted">module.exports = {
  esclient,
  setQuotesMapping,
  checkConnection,
  createIndex,
  index,
  type
};</pre>



<p class="wp-block-paragraph">Great! Let’s see the entire&nbsp;<code>elastic.js</code>&nbsp;file:</p>



<pre class="wp-block-preformatted">const { Client } = require("@elastic/elasticsearch");
                   require("dotenv").config();
const elasticUrl = process.env.ELASTIC_URL || "http://localhost:9200";
const esclient   = new Client({ node: elasticUrl });
const index      = "quotes";
const type       = "quotes";
/**
 * @function createIndex
 * @returns {void}
 * @description Creates an index in ElasticSearch.
 */
async function createIndex(index) {
  try {
    await esclient.indices.create({ index });
    console.log(`Created index ${index}`);
  } catch (err) {
    console.error(`An error occurred while creating the index ${index}:`);
    console.error(err);
  }
}
/**
 * @function setQuotesMapping,
 * @returns {void}
 * @description Sets the quotes mapping to the database.
 */
async function setQuotesMapping () {
  try {
    const schema = {
      quote: {
        type: "text" 
      },
      author: {
        type: "text"
      }
    };
  
    await esclient.indices.putMapping({ 
      index, 
      type,
      include_type_name: true,
      body: { 
        properties: schema 
      } 
    })
    
    console.log("Quotes mapping created successfully");
  
  } catch (err) {
    console.error("An error occurred while setting the quotes mapping:");
    console.error(err);
  }
}
/**
 * @function checkConnection
 * @returns {Promise&lt;Boolean&gt;}
 * @description Checks if the client is connected to ElasticSearch
 */
function checkConnection() {
  return new Promise(async (resolve) =&gt; {
    console.log("Checking connection to ElasticSearch...");
    let isConnected = false;
    while (!isConnected) {
      try {
        await esclient.cluster.health({});
        console.log("Successfully connected to ElasticSearch");
        isConnected = true;
      // eslint-disable-next-line no-empty
      } catch (_) {
      }
    }
    resolve(true);
  });
}
module.exports = {
  esclient,
  setQuotesMapping,
  checkConnection,
  createIndex,
  index,
  type
};</pre>



<h2 class="wp-block-heading">Populating ElasticSearch with quotes</h2>



<p class="wp-block-paragraph">Now we need to populate our ES instance with our quotes. This may sound easy, but believe me, it can be tricky.</p>



<p class="wp-block-paragraph">Let’s create a new file in&nbsp;<code>/src/data/index.js</code>:</p>



<pre class="wp-block-preformatted">const elastic = require("../elastic");
const quotes  = require("./quotes.json");

const esAction = {
  index: {
    _index: elastic.index,
    _type: elastic.type
  }
};</pre>



<p class="wp-block-paragraph">As you can see, we’re importing the&nbsp;<code>elastic</code>&nbsp;module we just created and our quotes from a JSON file stored in&nbsp;<code>/src/data/quotes.json</code>. We’re also creating an object called&nbsp;<code>esAction</code>, which will tell ES how to index a document once we insert it.</p>



<p class="wp-block-paragraph">Now we need a script to populate our database. We also need to create an array of Object with the following structure:</p>



<pre class="wp-block-preformatted">[
  {
    index: {
      _index: elastic.index,
      _type:  elastic.type
    }
  },
  {
    author: "quote author",
    quote:  "quote"
  },
  ...
]</pre>



<p class="wp-block-paragraph">As you can see, for each quote we’re gonna insert, we need to set its mapping to ElasticSearch. So that’s what we’ll do:</p>



<pre class="wp-block-preformatted">async function populateDatabase() {
  const docs = [];
  for (const quote of quotes) {
    docs.push(esAction);
    docs.push(quote);
  }
  return elastic.esclient.bulk({ body: docs });
}</pre>



<p class="wp-block-paragraph">Great! Now let’s create our main file in&nbsp;<code>/src/main.js</code>&nbsp;and see how we’ll structure everything we’ve written so far:</p>



<pre class="wp-block-preformatted">const elastic = require("./elastic");
const data    = require("./data");
                require("dotenv").config();

(async function main() {

  const isElasticReady = await elastic.checkConnection();
  if (isElasticReady) {
    const elasticIndex = await elastic.esclient.indices.exists({index: elastic.index});

    if (!elasticIndex.body) {
      await elastic.createIndex(elastic.index);
      await elastic.setQuotesMapping();
      await data.populateDatabase()
    }
  }

})();</pre>



<p class="wp-block-paragraph">Let’s analyze the code above. We create a self-executing main function which will check for the ES connection. The code execution won’t proceed until ES is connected. When ES is ready, we’ll check if the&nbsp;<code>quotes</code>&nbsp;index exists. If it doesn’t, we’ll create it, we’ll set its mapping and will populate the database. Obviously, we’ll do so only the first time we start up our server!</p>



<h2 class="wp-block-heading">Creating a RESTful API</h2>



<p class="wp-block-paragraph">Now we need to create our RESTful server. We’ll be using Express.js, which is the most popular Node.js framework out there for building servers.</p>



<p class="wp-block-paragraph">We’ll start with the&nbsp;<code>/src/server/index.js</code>&nbsp;file:</p>



<pre class="wp-block-preformatted">const express      = require("express");
const cors         = require("cors");
const bodyParser   = require("body-parser");
const routes       = require("./routes");
                     require("dotenv").config();

const app  = express();
const port = process.env.NODE_PORT || 3000;

function start() {
  return  app.use(cors())
             .use(bodyParser.urlencoded({ extended: false }))
             .use(bodyParser.json())
             .use("/quotes",routes)
             .use((_req, res) =&gt; res.status(404).json({ success: false,error: "Route not found" }))
             .listen(port, () =&gt; console.log(`Server ready on port ${port}`));
}

module.exports = {
  start
};</pre>



<p class="wp-block-paragraph">As you can see, it is just a standard Express.js server, we won’t spend much time on that.</p>



<p class="wp-block-paragraph">Let’s see our&nbsp;<code>/src/server/routes/index.js</code>&nbsp;file:</p>



<pre class="wp-block-preformatted">const express    = require("express");
const controller = require("../controllers");
const routes     = express.Router();

routes.route("/").get(controller.getQuotes);
routes.route("/new").post(controller.addQuote);

module.exports = routes;</pre>



<p class="wp-block-paragraph">We just create two endpoints:</p>



<ol class="wp-block-list"><li><code>GET&nbsp;/</code>, will return a list of quotes matching our query string parameters.</li><li><code>POST&nbsp;/new/</code>, will allow us to post a new quote storing it inside ElasticSearch.</li></ol>



<p class="wp-block-paragraph">So now let’s see our&nbsp;<code>/src/server/controllers/index.js</code>&nbsp;file:</p>



<pre class="wp-block-preformatted">const model = require("../models");

async function getQuotes(req, res) {
  const query  = req.query;
  if (!query.text) {
    res.status(422).json({
      error: true,
      data: "Missing required parameter: text"
    });
    return;
  }
  try {
    const result = await model.getQuotes(req.query);
    res.json({ success: true, data: result });
  } catch (err) {
    res.status(500).json({ success: false, error: "Unknown error."});
  }
}

async function addQuote(req, res) {
  const body = req.body;
  if (!body.quote || !body.author) {
    res.status(422).json({
      error: true,
      data: "Missing required parameter(s): 'body' or 'author'"
    });
    return;
  }
  try {
    const result = await model.insertNewQuote(body.quote, body.author);
    res.json({ 
      success: true, 
      data: {
        id:     result.body._id,
        author: body.author,
        quote:  body.quote
      } 
    });
  } catch (err) {
    res.status(500).json({ success: false, error: "Unknown error."});
  }
}
module.exports = {
  getQuotes,
  addQuote
};</pre>



<p class="wp-block-paragraph">Here we’re basically defining two functions:</p>



<ol class="wp-block-list"><li><code>getQuotes</code>, which requires at least one querystring parameter –&nbsp;<code>text</code></li><li><code>addQuote</code>, which require two parameters –&nbsp;<code>author</code>&nbsp;and&nbsp;<code>quote</code></li></ol>



<p class="wp-block-paragraph">The ElasticSearch interface is delegated to our&nbsp;<code>/src/server/models/index.js</code>. This structure helps us maintain a MVC-ish architecture.</p>



<p class="wp-block-paragraph">Let’s see our model:</p>



<pre class="wp-block-preformatted">const { esclient, index, type } = require("../../elastic");

async function getQuotes(req) {
  const query = {
    query: {
      match: {
        quote: {
          query: req.text,
          operator: "and",
          fuzziness: "auto"
        }
      }
    }
  }

  const { body: { hits } } = await esclient.search({
    from:  req.page  || 0,
    size:  req.limit || 100,
    index: index, 
    type:  type,
    body:  query
  });

  const results = hits.total.value;
  const values  = hits.hits.map((hit) =&gt; {
    return {
      id:     hit._id,
      quote:  hit._source.quote,
      author: hit._source.author,
      score:  hit._score
    }
  });

  return {
    results,
    values
  }
}</pre>



<p class="wp-block-paragraph">As you can see, we’re composing our ElasticSearch query by selecting every quote that includes a given word or phrase.</p>



<p class="wp-block-paragraph">Then, we spawn the query, setting both&nbsp;<code>page</code>&nbsp;and&nbsp;<code>limit</code>&nbsp;values we can pass them in a query string, for instance&nbsp;<code>http://localhost:3000/quotes?text=love&amp;page=1&amp;limit=100</code>. If these values are not passed via querystring, we’ll fall back to their default values.</p>



<p class="wp-block-paragraph">ElasticSearch returns an incredibly big amount of data, but we just need four things:</p>



<ol class="wp-block-list"><li>Quote ID</li><li>The quote itself</li><li>Quote author</li><li>Score</li></ol>



<p class="wp-block-paragraph">The score represents how close the quote is to our search term. Once we have these values, we return them with the total results number, which may be useful when paginating the results on the front end.</p>



<p class="wp-block-paragraph">Now we need to create the last function for our model&nbsp;<code>insertNewQuote</code>:</p>



<pre class="wp-block-preformatted">async function insertNewQuote(quote, author) {
  return esclient.index({
    index,
    type,
    body: {
      quote,
      author
    }
  })
}</pre>



<p class="wp-block-paragraph">This function is really simple, we just post the quote and the author to our index and return the query result back to the controller.</p>



<p class="wp-block-paragraph">Now the complete&nbsp;<code>/src/server/models/index.js</code>&nbsp;file should look like this:</p>



<pre class="wp-block-preformatted">const { esclient, index, type } = require("../../elastic");

async function getQuotes(req) {
  const query = {
    query: {
      match: {
        quote: {
          query: req.text,
          operator: "and",
          fuzziness: "auto"
        }
      }
    }
  }

  const { body: { hits } } = await esclient.search({
    from:  req.page  || 0,
    size:  req.limit || 100,
    index: index, 
    type:  type,
    body:  query
  });

  const results = hits.total.value;

  const values  = hits.hits.map((hit) =&gt; {
    return {
      id:     hit._id,
      quote:  hit._source.quote,
      author: hit._source.author,
      score:  hit._score
    }
  });

  return {
    results,
    values
  }
}

async function insertNewQuote(quote, author) {
  return esclient.index({
    index,
    type,
    body: {
      quote,
      author
    }
  })
}

module.exports = {
  getQuotes,
  insertNewQuote
}</pre>



<p class="wp-block-paragraph">And we’re done! We just need to setup our start script inside out&nbsp;<code>package.json</code>&nbsp;file and we’re ready to go:</p>



<pre class="wp-block-preformatted">"scripts": {
  "start": "pm2-runtime start ./src/main.js --name node_app",
  "stop": "pm2-runtime stop node_app "
}</pre>



<p class="wp-block-paragraph">We also need to update our&nbsp;<code>/src/main.js</code>&nbsp;script in order to start up our Express.js server once ElasticSearch has been connected:</p>



<pre class="wp-block-preformatted">const elastic = require("./elastic");
const server  = require("./server");
const data    = require("./data");
                require("dotenv").config();

(async function main() {
  const isElasticReady = await elastic.checkConnection();

  if (isElasticReady) {
    const elasticIndex = await elastic.esclient.indices.exists({index: elastic.index});

    if (!elasticIndex.body) {
      await elastic.createIndex(elastic.index);
      await elastic.setQuotesMapping();
      await data.populateDatabase()
    }

    server.start();
  }
})();</pre>



<h2 class="wp-block-heading">Launching the application</h2>



<p class="wp-block-paragraph">We’re now ready to start our application using&nbsp;<strong>docker-compose</strong>!</p>



<p class="wp-block-paragraph">Just run the following command:</p>



<pre class="wp-block-preformatted">docker-compose up</pre>



<p class="wp-block-paragraph">You’ll need to wait until Docker downloads both the ElasticSearch and Node.js images, then it will boot up your server and you’ll be ready to query against your REST endpoints!</p>



<p class="wp-block-paragraph">Let’s test with a couple of cURL calls:</p>



<pre class="wp-block-preformatted">curl localhost:3000/quotes?text=love&amp;limit=3

{
  "success": true,
  "data": {
    "results": 716,
    "values": [
      {
        "id": "JDE3kGwBuLHMiUvv1itT",
        "quote": "There is only one happiness in life, to love and be loved.",
        "author": "George Sand",
        "score": 6.7102118
      },
      {
        "id": "JjE3kGwBuLHMiUvv1itT",
        "quote": "Live through feeling and you will live through love. For feeling is the language of the soul, and feeling is truth.",
        "author": "Matt Zotti",
        "score": 6.2868223
      },
      {
        "id": "NTE3kGwBuLHMiUvv1iFO",
        "quote": "Genuine love should first be directed at oneself if we do not love ourselves, how can we love others?",
        "author": "Dalai Lama",
        "score": 5.236455
      }
    ]
  }
}</pre>



<p class="wp-block-paragraph">So as you can see, we decided to limit our results to&nbsp;<code>3</code>, but there are over 713 quotes!</p>



<p class="wp-block-paragraph">We can easily get the next three quotes by calling:</p>



<pre class="wp-block-preformatted">curl localhost:3000/quotes?text=love&amp;limit=3&amp;page=2

{
  "success": true,
  "data": {
    "results": 716,
    "values": [
      {
        "id": "SsyHkGwBrOFNsaVmePwE",
        "quote": "Forgiveness is choosing to love. It is the first skill of self-giving love.",
        "author": "Mohandas Gandhi",
        "score": 4.93597
      },
      {
        "id": "rDE3kGwBuLHMiUvv1idS",
        "quote": "Neither a lofty degree of intelligence nor imagination nor both together go to the making of genius. Love, love, love, that is the soul of genius.",
        "author": "Wolfgang Amadeus Mozart",
        "score": 4.7821507
      },
      {
        "id": "TjE3kGwBuLHMiUvv1h9K",
        "quote": "Speak low, if you speak love.",
        "author": "William Shakespeare",
        "score": 4.6697206
      }
    ]
  }
}</pre>



<p class="wp-block-paragraph">And what if you need to insert a new quote? Just call the&nbsp;<code>/quotes/new</code>&nbsp;endpoint!</p>



<pre class="wp-block-preformatted">curl --request POST \
     --url http://localhost:3000/quotes/new \
     --header 'content-type: application/json' \
     --data '{
        "author": "Michele Riva",
        "quote": "Using Docker and ElasticSearch is challenging, but totally worth it."
}'</pre>



<p class="wp-block-paragraph">and the response will be:</p>



<pre class="wp-block-preformatted">{
  "success": true,
  "data": {
    "id": "is2QkGwBrOFNsaVmFAi8",
    "author": "Michele Riva",
    "quote": "Using Docker and ElasticSearch is challenging, but totally worth it."
  }
}</pre>



<h2 class="wp-block-heading">Conclusion</h2>



<p class="wp-block-paragraph">Docker makes it incredibly easy to manage our dependencies and their deployment. From that point, we could host our application on Heroku, AWS ECS, Google Cloud Container or any other Docker-based service with ease, without struggling to setup our server with their super-complex configurations.</p>



<p class="wp-block-paragraph">Next steps?</p>



<ul class="wp-block-list"><li>Learn how to use Kubernetes in order to scale your container and orchestrate more ElasticSearch Instances!</li><li>Create a new endpoint that will allow you to update an existing quote. Mistakes can happen!</li><li>And what about deleting a quote? How would you implement that endpoint?</li><li>It would be great to save your quotes with tags (for instances, quotes about love, health, art)… try to update your <code>quotes</code> index!</li></ul>



<p class="wp-block-paragraph">Software development is fun. With Docker, Node, and ElasticSearch it’s even better!</p>



<h2 class="wp-block-heading">Plug: LogRocket, a DVR for web apps</h2>



<figure class="wp-block-image"><a href="https://logrocket.com/signup/" target="_blank" rel="noreferrer noopener"><img decoding="async" src="https://i2.wp.com/blog.logrocket.com/wp-content/uploads/2017/03/1d0cd-1s_rmyo6nbrasp-xtvbaxfg.png?resize=1200%2C677&amp;ssl=1" alt="LogRocket Dashboard Free Trial Banner" class="wp-image-46"/></a></figure>



<p class="wp-block-paragraph">LogRocket is a frontend logging tool that lets you replay problems as if they happened in your own browser. Instead of guessing why errors happen, or asking users for screenshots and log dumps, LogRocket lets you replay the session to quickly understand what went wrong. It works perfectly with any app, regardless of framework, and has plugins to log additional context from Redux, Vuex, and @ngrx/store.</p>



<p class="wp-block-paragraph">In addition to logging Redux actions and state, LogRocket records console logs, JavaScript errors, stacktraces, network requests/responses with headers + bodies, browser metadata, and custom logs. It also instruments the DOM to record the HTML and CSS on the page, recreating pixel-perfect videos of even the most complex single-page apps.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bestdevops.com/full-text-search-with-node-js-and-elasticsearch-on-docker/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Server Management Software Market Overview 2019–2026: Key Vendors, Segments, and Growth Drivers</title>
		<link>https://www.bestdevops.com/global-server-management-software-market-analysis-size-share-growth-trends-and-forecast-2019-2026-datadog-solarwinds-msp-manageengine-microsoft-bmc-software/</link>
					<comments>https://www.bestdevops.com/global-server-management-software-market-analysis-size-share-growth-trends-and-forecast-2019-2026-datadog-solarwinds-msp-manageengine-microsoft-bmc-software/#respond</comments>
		
		<dc:creator><![CDATA[anil]]></dc:creator>
		<pubDate>Mon, 12 Aug 2019 07:06:08 +0000</pubDate>
				<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[BMC]]></category>
		<category><![CDATA[Datadog]]></category>
		<category><![CDATA[server]]></category>
		<guid isPermaLink="false">http://www.bestdevops.com/?p=6900</guid>

					<description><![CDATA[An overview of the global server management software market covering leading vendors such as Datadog, SolarWinds MSP, ManageEngine, Microsoft, and BMC Software, along with key market segments, regional breakdown, and growth drivers through 2026.]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph"><em>This article is based on a market research report summary originally published on bunburymail.com (August 2019). Specific figures, CAGR values, and forecasts are drawn from that third-party report and have not been independently verified.</em></p>



<h2 class="wp-block-heading">What Is Server Management Software?</h2>



<p class="wp-block-paragraph">Server management software is a category of IT operations tooling that enables administrators to monitor, configure, automate, and maintain physical and virtual servers across on-premises data centres and cloud environments. Core capabilities typically include performance monitoring, patch management, alerting, capacity planning, remote access, and log aggregation. As infrastructure scales and hybrid cloud adoption grows, demand for unified server management platforms has increased significantly across enterprise and mid-market segments.</p>



<h2 class="wp-block-heading">Market Landscape and Leading Vendors</h2>



<p class="wp-block-paragraph">The global server management software market is served by a mix of large platform vendors, specialist monitoring tools, and managed-service-oriented products. The research report in question highlights the following key players:</p>



<ul class="wp-block-list">
<li><strong>Datadog</strong> – Cloud-scale infrastructure and application monitoring with deep integrations across public cloud providers.</li>
<li><strong>SolarWinds MSP</strong> – Remote monitoring and management (RMM) platform targeted at managed service providers.</li>
<li><strong>ManageEngine (Zoho Corp)</strong> – Broad IT management suite including OpManager for network and server monitoring.</li>
<li><strong>Microsoft</strong> – System Center suite and Azure Monitor for hybrid Windows and Linux server management.</li>
<li><strong>BMC Software</strong> – Enterprise-grade IT operations management including TrueSight and Helix platforms.</li>
<li><strong>Central Solutions</strong> – Targeted server administration and patch management tooling.</li>
<li><strong>Server Density</strong> – SaaS-based server and website monitoring (later acquired by StackPath).</li>
<li><strong>Percona</strong> – Open-source database and server management, particularly for MySQL and MongoDB environments.</li>
<li><strong>Infrascale</strong> – Backup and disaster recovery with server management integration.</li>
<li><strong>Adaxes (Softerra)</strong> – Active Directory and Windows Server administration automation.</li>
</ul>



<p class="wp-block-paragraph">The competitive landscape is characterised by significant R&amp;D investment from both private vendors and, in some regions, government-backed technology initiatives aimed at modernising public-sector infrastructure management.</p>



<h2 class="wp-block-heading">Market Segmentation</h2>



<h3 class="wp-block-heading">By Deployment Type</h3>



<ul class="wp-block-list">
<li><strong>On-premises</strong> – Traditional deployment within a customer&#8217;s own data centre, favoured in regulated industries.</li>
<li><strong>Cloud / SaaS</strong> – Vendor-hosted platforms offering faster deployment, elastic scaling, and lower upfront cost.</li>
<li><strong>Hybrid</strong> – A combination of local agents and cloud-based dashboards, increasingly common in enterprise environments.</li>
</ul>



<h3 class="wp-block-heading">By Access Terminal</h3>



<ul class="wp-block-list">
<li><strong>PC / Web Terminal</strong> – Browser-based or desktop consoles used by operations teams for day-to-day server administration.</li>
<li><strong>Mobile Terminal</strong> – Native mobile apps and responsive dashboards enabling on-call engineers to respond to alerts remotely.</li>
</ul>



<h3 class="wp-block-heading">By End-User Application</h3>



<ul class="wp-block-list">
<li>Large enterprises requiring centralised visibility across thousands of nodes.</li>
<li>Small and medium-sized businesses (SMBs) leveraging managed service providers for outsourced server operations.</li>
<li>Managed service providers (MSPs) needing multi-tenant, white-label management platforms.</li>
<li>Public sector and government organisations with strict compliance and audit requirements.</li>
</ul>



<h2 class="wp-block-heading">Regional Market Breakdown</h2>



<p class="wp-block-paragraph">The report analyses market size and growth across five key regions:</p>



<ul class="wp-block-list">
<li><strong>North America</strong> – The largest regional market, driven by high cloud adoption, mature IT operations practices, and a dense concentration of software vendors.</li>
<li><strong>Europe</strong> – Steady growth supported by GDPR-driven infrastructure visibility requirements and increasing hybrid cloud deployments.</li>
<li><strong>Asia Pacific</strong> – The fastest-growing region, with large-scale digital transformation programmes in China, India, Japan, South Korea, and Southeast Asia.</li>
<li><strong>Middle East &amp; Africa</strong> – Emerging growth, with government-led smart-city and e-government initiatives driving data centre investment.</li>
<li><strong>South America</strong> – Gradual adoption, led by Brazil and other economies investing in cloud and colocation infrastructure.</li>
</ul>



<h2 class="wp-block-heading">Key Growth Drivers</h2>



<ul class="wp-block-list">
<li><strong>Hybrid and multi-cloud adoption</strong> – As workloads span on-premises and multiple cloud providers, unified management tools become essential.</li>
<li><strong>Infrastructure complexity</strong> – Growing virtualisation and containerisation (Kubernetes, Docker) require more sophisticated server orchestration and monitoring.</li>
<li><strong>Security and compliance requirements</strong> – Regulatory frameworks such as GDPR, HIPAA, and PCI-DSS demand detailed audit trails and patch compliance reporting.</li>
<li><strong>Rise of MSPs</strong> – The managed services model shifts server management responsibility to specialist providers, creating sustained demand for RMM platforms.</li>
<li><strong>Automation and AIOps</strong> – AI-driven anomaly detection and automated remediation reduce mean time to resolution (MTTR) and lower operational overhead.</li>
<li><strong>Remote workforce</strong> – Distributed teams require robust remote server access and monitoring capabilities available from any device.</li>
</ul>



<h2 class="wp-block-heading">Market Challenges and Restraints</h2>



<ul class="wp-block-list">
<li><strong>Vendor lock-in concerns</strong> – Organisations are cautious about deep integration with proprietary platforms that are difficult to migrate away from.</li>
<li><strong>Integration complexity</strong> – Heterogeneous environments (mixed OS, legacy hardware, multi-cloud) complicate unified tooling.</li>
<li><strong>Cost of enterprise licences</strong> – High licensing fees for full-featured platforms can be prohibitive for SMBs.</li>
<li><strong>Skills shortage</strong> – A global shortage of qualified DevOps and systems administration professionals limits effective tool adoption.</li>
</ul>



<h2 class="wp-block-heading">Report Structure: Chapter Summary</h2>



<p class="wp-block-paragraph">The underlying market research report is structured across 15 chapters covering the full scope of the market analysis:</p>



<ol class="wp-block-list">
<li><strong>Chapters 1–2:</strong> Market definitions, product classifications, manufacturing cost structures, and supply chain overview.</li>
<li><strong>Chapter 3:</strong> Technical data, manufacturing plant analysis, R&amp;D status, and raw material sourcing.</li>
<li><strong>Chapter 4:</strong> Overall market capacity, sales analysis, and pricing by company segment.</li>
<li><strong>Chapters 5–6:</strong> Regional market breakdown including the United States, China, Europe, Japan, South Korea, and Taiwan; segmentation by product type.</li>
<li><strong>Chapters 7–8:</strong> Segmentation by application; major manufacturer profiles.</li>
<li><strong>Chapter 9:</strong> Market trend analysis by product type and access terminal (PC vs. mobile).</li>
<li><strong>Chapter 10:</strong> Regional marketing strategies, international trade analysis, supply chain structure.</li>
<li><strong>Chapter 11:</strong> Consumer analysis — buyer personas, purchasing patterns, and decision criteria.</li>
<li><strong>Chapter 12:</strong> Research findings, conclusions, methodology, and data sources.</li>
<li><strong>Chapters 13–15:</strong> Sales channel analysis, distributor and dealer networks, final conclusions, and appendix.</li>
</ol>



<h2 class="wp-block-heading">Why Server Management Software Matters for DevOps Teams</h2>



<p class="wp-block-paragraph">For DevOps practitioners, choosing the right server management platform directly affects deployment velocity, system reliability, and incident response time. When evaluating vendors, engineering teams should consider:</p>



<ul class="wp-block-list">
<li><strong>API and automation depth</strong> – Does the platform expose APIs that integrate with CI/CD pipelines, Infrastructure as Code tooling (Terraform, Ansible), and incident management platforms (PagerDuty, Opsgenie)?</li>
<li><strong>Agent footprint</strong> – Lightweight, low-overhead agents are critical for high-density environments.</li>
<li><strong>Alerting granularity</strong> – Threshold-based and anomaly-based alerting with suppression and correlation capabilities reduce alert fatigue.</li>
<li><strong>Scalability and pricing model</strong> – Ensure pricing scales predictably as infrastructure grows; per-host models can become expensive at scale.</li>
<li><strong>Compliance reporting</strong> – Built-in audit and compliance reporting reduces manual work for regulated workloads.</li>
</ul>



<p class="wp-block-paragraph">The server management software market continues to consolidate, with larger observability and AIOps platforms absorbing point solutions. Engineering leaders tracking this space should monitor acquisition activity and open-source alternatives (such as Prometheus, Nagios, and Zabbix) alongside commercial offerings.</p>



<p class="wp-block-paragraph"><em>Original report summary sourced from bunburymail.com, August 2019. Market data and forecasts reflect the state of the market at the time of publication.</em></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bestdevops.com/global-server-management-software-market-analysis-size-share-growth-trends-and-forecast-2019-2026-datadog-solarwinds-msp-manageengine-microsoft-bmc-software/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Microsoft Azure Dedicated Host: Single-Tenant Private Cloud Servers Explained</title>
		<link>https://www.bestdevops.com/microsoft-launches-massive-private-cloud-server-service-in-azure/</link>
					<comments>https://www.bestdevops.com/microsoft-launches-massive-private-cloud-server-service-in-azure/#respond</comments>
		
		<dc:creator><![CDATA[anil]]></dc:creator>
		<pubDate>Mon, 05 Aug 2019 12:21:39 +0000</pubDate>
				<category><![CDATA[Azure]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[machines]]></category>
		<category><![CDATA[Private]]></category>
		<category><![CDATA[server]]></category>
		<guid isPermaLink="false">http://www.bestdevops.com/?p=6722</guid>

					<description><![CDATA[Microsoft Azure Dedicated Host gives businesses exclusive access to physical servers in the cloud, isolating workloads for compliance, licensing, and security requirements. Here is what engineers need to know.]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph"><em>This article is based on reporting originally published at ibtimes.com (August 2019) covering the announcement of Azure Dedicated Host.</em></p>



<h2 class="wp-block-heading">What Is Azure Dedicated Host?</h2>



<p class="wp-block-paragraph">Microsoft announced <strong>Azure Dedicated Host</strong>, a service that provisions single-tenant physical servers inside Azure data centers. Unlike standard virtual machines, which run on shared physical hardware alongside other customers&#8217; workloads, an Azure Dedicated Host gives your organization exclusive use of the underlying physical machine. You then deploy your Azure VMs onto that dedicated hardware just as you would on any other Azure compute resource.</p>



<p class="wp-block-paragraph">This is a meaningful architectural shift for enterprises that need hardware-level isolation rather than the logical isolation that ordinary virtual machines provide.</p>



<h2 class="wp-block-heading">Why Hardware Isolation Matters</h2>



<p class="wp-block-paragraph">Standard multi-tenant cloud infrastructure is cost-effective, but it is not always appropriate. Common drivers for dedicated hardware include:</p>



<ul class="wp-block-list">
<li><strong>Regulatory compliance</strong> – Industries such as finance, healthcare, and government often require demonstrable hardware-level isolation to satisfy auditors and regulators.</li>
<li><strong>Bring-your-own-license (BYOL)</strong> – Certain software vendors (notably Microsoft itself for Windows Server and SQL Server) allow existing on-premises per-core or per-socket licenses to be reused only on dedicated hardware.</li>
<li><strong>Security posture</strong> – Eliminating shared physical hardware removes a class of side-channel attack vectors (such as speculative-execution exploits) that are difficult to fully mitigate in multi-tenant environments.</li>
<li><strong>Controlled maintenance windows</strong> – On dedicated hosts, Azure exposes maintenance control options that let teams schedule host-level updates rather than accepting platform-driven restarts.</li>
</ul>



<h2 class="wp-block-heading">Supported Workloads and Operating Systems</h2>



<p class="wp-block-paragraph">Azure Dedicated Host supports virtual machines running <strong>Windows Server</strong>, <strong>Linux</strong>, and <strong>SQL Server</strong>. Hosts are available in different SKU families (for example, general-purpose, compute-optimized, or memory-optimized) that map to the underlying physical server specifications. The VM sizes you can deploy on a given host are determined by the host SKU you select.</p>



<h2 class="wp-block-heading">Pricing Model</h2>



<p class="wp-block-paragraph">Azure Dedicated Host is billed <strong>per physical host</strong>, not per individual virtual machine. This means you pay for the entire host regardless of how many VMs are running on it. The practical implication is that the service becomes more cost-efficient the more densely you pack VMs onto the host. Pricing varies by host SKU and Azure region. Microsoft also offers <strong>Reserved Instances</strong> for Dedicated Hosts to reduce costs when committing to one- or three-year terms.</p>



<h2 class="wp-block-heading">Host Groups: Organizing Dedicated Infrastructure</h2>



<p class="wp-block-paragraph">Azure allows you to create <strong>Host Groups</strong>, logical containers for multiple Dedicated Hosts. Host Groups operate within a single Azure region and can span multiple Availability Zones. This lets teams:</p>



<ul class="wp-block-list">
<li>Distribute workloads across hosts for fault tolerance.</li>
<li>Manage related hosts as a single administrative unit.</li>
<li>Optionally enable automatic VM placement so Azure selects the best available host within the group.</li>
</ul>



<h2 class="wp-block-heading">How Azure Dedicated Host Compares to Isolated VM Sizes</h2>



<p class="wp-block-paragraph">Azure already offered <strong>isolated VM sizes</strong> (such as the Standard_M128ms or certain Lsv2 sizes) that guarantee a VM occupies an entire physical host by virtue of consuming all available resources. Azure Dedicated Host is a different mechanism: you explicitly provision and manage the host, choose which VM sizes to run on it, and retain visibility into the physical layer. Isolated VM sizes are simpler but offer less control; Dedicated Host trades simplicity for greater flexibility and licensing transparency.</p>



<h2 class="wp-block-heading">Competitive Landscape</h2>



<p class="wp-block-paragraph">Azure Dedicated Host entered a market where dedicated single-tenant hardware was already available from major cloud providers:</p>



<ul class="wp-block-list">
<li><strong>Amazon Web Services</strong> offers <em>EC2 Dedicated Hosts</em> and <em>Dedicated Instances</em>, with similar per-host billing and BYOL support.</li>
<li><strong>Google Cloud</strong> provides <em>Sole-Tenant Nodes</em>, which operate on the same principle of exclusive physical server access within GCP&#8217;s infrastructure.</li>
</ul>



<p class="wp-block-paragraph">Microsoft&#8217;s entry strengthens Azure&#8217;s credibility with enterprise customers who have strict compliance requirements and had previously viewed the dedicated-hardware option as a reason to favor AWS.</p>



<h2 class="wp-block-heading">Security and Compliance Considerations</h2>



<p class="wp-block-paragraph">Microsoft positions Dedicated Host as part of its broader enterprise compliance story. Because your organization controls which VMs run on the host, you can demonstrate to auditors that no other customer&#8217;s workloads co-reside on the same physical hardware. Azure&#8217;s standard security controls — including disk encryption, network security groups, Azure Defender, and Azure Policy — all apply to VMs running on Dedicated Hosts.</p>



<h2 class="wp-block-heading">Key Takeaways for DevOps and Platform Teams</h2>



<ul class="wp-block-list">
<li>Azure Dedicated Host is appropriate when compliance mandates, software licensing, or security policy require physical isolation — not simply logical isolation.</li>
<li>Cost modelling should account for the per-host billing model; under-utilized hosts are expensive.</li>
<li>Host Groups and Availability Zone support make it feasible to build resilient architectures on dedicated hardware.</li>
<li>Existing Azure tooling (ARM templates, Terraform&#8217;s AzureRM provider, Bicep) supports Dedicated Host provisioning, so it integrates into standard IaC workflows.</li>
<li>Evaluate BYOL eligibility carefully with your licensing team; the savings can be significant for SQL Server and Windows Server workloads at scale.</li>
</ul>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bestdevops.com/microsoft-launches-massive-private-cloud-server-service-in-azure/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Using Ansible for Windows System Management: What You Need to Know</title>
		<link>https://www.bestdevops.com/can-i-install-ansible-for-windows-system-management/</link>
					<comments>https://www.bestdevops.com/can-i-install-ansible-for-windows-system-management/#respond</comments>
		
		<dc:creator><![CDATA[anil]]></dc:creator>
		<pubDate>Sat, 03 Aug 2019 12:05:13 +0000</pubDate>
				<category><![CDATA[Ansible]]></category>
		<category><![CDATA[install]]></category>
		<category><![CDATA[server]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Windows]]></category>
		<guid isPermaLink="false">http://www.bestdevops.com/?p=6702</guid>

					<description><![CDATA[Ansible can manage Windows hosts, but the setup is more involved than on Linux. Learn how WinRM, PowerShell, and WSL fit into the picture—and what limitations to expect.]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph"><strong>Original source reference:</strong> searchitoperations.techtarget.com (2019)</p>



<h2 class="wp-block-heading">Can Ansible Manage Windows Systems?</h2>



<p class="wp-block-paragraph">Ansible is a widely used configuration management and automation tool with deep roots in the Linux ecosystem. However, it can also target Windows hosts for configuration, provisioning, and application lifecycle management. The catch: the setup process is noticeably more complex than it is on Linux, and there are meaningful constraints on how Windows machines can participate in an Ansible environment.</p>



<h2 class="wp-block-heading">How Ansible Communicates with Windows Hosts</h2>



<p class="wp-block-paragraph">On Linux, Ansible uses SSH to communicate with managed nodes. Because SSH is available by default on most Linux distributions, getting Ansible to control a Linux host is relatively straightforward.</p>



<p class="wp-block-paragraph">Windows is different. Rather than SSH, Ansible communicates with Windows hosts over <strong>WinRM (Windows Remote Management)</strong> using PowerShell. To prepare a Windows host for Ansible management, the following minimum requirements must be met on the managed node:</p>



<ul class="wp-block-list">
<li><strong>PowerShell 3.0 or higher</strong></li>
<li><strong>.NET Framework 4.0 or higher</strong></li>
<li>WinRM configured and enabled</li>
</ul>



<p class="wp-block-paragraph">Ansible&#8217;s official documentation includes a <code>ConfigureRemotingForAnsible.ps1</code> script that automates much of the WinRM setup on Windows managed nodes. Running this script is typically one of the first steps when onboarding a Windows host.</p>



<h2 class="wp-block-heading">Where the Ansible Control Node Must Run</h2>



<p class="wp-block-paragraph">A critical architectural point: <strong>the Ansible control node—including Ansible Tower (now AWX/Red Hat Ansible Automation Platform)—must run on Linux</strong>. Ansible itself cannot natively execute on a Windows host as the control machine.</p>



<p class="wp-block-paragraph">If your only available machine is a Windows server, you have two realistic options:</p>



<ul class="wp-block-list">
<li><strong>Run a Linux virtual machine</strong> on the Windows host and use that VM as the Ansible control node.</li>
<li><strong>Use Windows Subsystem for Linux (WSL)</strong>—a Microsoft feature available since Windows 10 that allows native Linux command-line tools to run on Windows. WSL can be installed from the Microsoft Store.</li>
</ul>



<p class="wp-block-paragraph">It is important to note that <strong>Ansible does not officially support WSL for production use</strong>. WSL may be suitable for development, testing, or learning purposes, but relying on it in a production environment is not recommended based on Ansible&#8217;s own guidance.</p>



<h2 class="wp-block-heading">What Windows Can and Cannot Do in an Ansible Environment</h2>



<p class="wp-block-paragraph">Understanding the role Windows can play helps set accurate expectations:</p>



<figure class="wp-block-table"><table><thead><tr><th>Capability</th><th>Windows Host</th></tr></thead><tbody><tr><td>Act as a <strong>managed node</strong> (receive and apply playbooks)</td><td>✅ Supported</td></tr><tr><td>Act as an <strong>Ansible control node</strong> (send playbooks to other hosts)</td><td>❌ Not natively supported</td></tr><tr><td>Run <strong>Python modules</strong> directly on the host</td><td>❌ Not supported</td></tr><tr><td>Run <strong>PowerShell modules</strong></td><td>✅ Supported</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">Because Python modules cannot run directly on Windows managed nodes, teams that rely heavily on Python-based Ansible modules need to account for this. A common workaround is to run those modules on the Ansible controller itself using the <code>delegate_to: localhost</code> directive in a playbook task.</p>



<h2 class="wp-block-heading">Setting Up Ansible to Manage a Windows Host: Key Steps</h2>



<p class="wp-block-paragraph">Unlike Linux, where a single <code>apt-get install ansible</code> or <code>dnf install ansible</code> command gets you most of the way there, managing Windows with Ansible requires several configuration steps across both the control node and the managed Windows host.</p>



<h3 class="wp-block-heading">On the Windows Managed Node</h3>



<ol class="wp-block-list">
<li>Verify PowerShell 3.0+ and .NET 4.0+ are installed.</li>
<li>Enable and configure WinRM (use the Ansible-provided setup script for convenience).</li>
<li>Configure firewall rules to allow WinRM traffic (typically TCP 5985 for HTTP, 5986 for HTTPS).</li>
<li>Set up an appropriate authentication method (Basic, NTLM, Kerberos, or CredSSP depending on your environment).</li>
</ol>



<h3 class="wp-block-heading">On the Ansible Control Node (Linux)</h3>



<ol class="wp-block-list">
<li>Install Ansible on your Linux control node.</li>
<li>Install the <code>pywinrm</code> Python library, which Ansible requires to communicate with Windows hosts over WinRM: <code>pip install pywinrm</code></li>
<li>Define Windows hosts in your inventory file with the correct connection variables:</li>
</ol>


<pre class="wp-block-code"><span><code class="hljs">&#91;windows]
win-server-01 ansible_host=192.168.1.10

&#91;windows:vars]
ansible_user=Administrator
ansible_password=YourPassword
ansible_connection=winrm
ansible_winrm_transport=ntlm
ansible_winrm_server_cert_validation=ignore</code></span></pre>


<p class="wp-block-paragraph">Always store credentials securely using <strong>Ansible Vault</strong> rather than plaintext in inventory files.</p>



<h2 class="wp-block-heading">Why Windows Teams Should Still Consider Ansible</h2>



<p class="wp-block-paragraph">Despite the added complexity, Ansible offers real value for organizations running Windows infrastructure:</p>



<ul class="wp-block-list">
<li><strong>Unified tooling:</strong> A single configuration management platform can manage both Linux and Windows infrastructure, reducing the number of tools teams need to learn and maintain.</li>
<li><strong>Agentless architecture:</strong> Like Linux, Windows managed nodes do not require an Ansible agent installed—only WinRM must be configured.</li>
<li><strong>Rich Windows module library:</strong> Ansible ships with many Windows-specific modules covering tasks such as managing IIS, Active Directory, Windows features, registry keys, services, and software packages.</li>
<li><strong>DevOps and automation adoption:</strong> Teams can use the same playbook-based workflows for Windows application lifecycle management as they do for Linux workloads.</li>
</ul>



<h2 class="wp-block-heading">Summary</h2>



<p class="wp-block-paragraph">Ansible can absolutely be used to manage Windows systems—but Windows is strictly a <em>managed node</em>, not a control node. The Ansible controller must run on Linux (directly, via VM, or via WSL for non-production use). Windows managed nodes communicate via WinRM and PowerShell rather than SSH. The setup involves more steps than a typical Linux Ansible deployment, but the payoff is a unified automation platform capable of managing your entire infrastructure regardless of operating system.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bestdevops.com/can-i-install-ansible-for-windows-system-management/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>AWS S3 Misconfiguration Exposed Data from Fortune 100 Clients of Attunity</title>
		<link>https://www.bestdevops.com/aws-s3-server-leaks-information-from-fortune-100-firms/</link>
					<comments>https://www.bestdevops.com/aws-s3-server-leaks-information-from-fortune-100-firms/#respond</comments>
		
		<dc:creator><![CDATA[anil]]></dc:creator>
		<pubDate>Tue, 02 Jul 2019 04:53:11 +0000</pubDate>
				<category><![CDATA[AWS]]></category>
		<category><![CDATA[Amazon Web Services]]></category>
		<category><![CDATA[information]]></category>
		<category><![CDATA[Network]]></category>
		<category><![CDATA[server]]></category>
		<guid isPermaLink="false">http://www.bestdevops.com/?p=5792</guid>

					<description><![CDATA[Three publicly accessible AWS S3 buckets belonging to data management firm Attunity exposed sensitive information from clients including Ford, Netflix, and TD Bank. Here is what happened and what DevOps teams can learn from it.]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph"><em>Original reporting credited to ZDNet and UpGuard Research. Source reference: dqindia.com (July 2019).</em></p>



<h2 class="wp-block-heading">What Happened</h2>



<p class="wp-block-paragraph">In May 2019, security researchers at UpGuard discovered that Attunity — an Israeli data management, warehousing, and replication company — had left three AWS S3 buckets publicly accessible without authentication. The buckets were discovered on May 13, 2019, and were secured approximately three days later.</p>



<p class="wp-block-paragraph">Attunity counts many of the world&#8217;s largest enterprises among its customers. The exposed buckets contained not only Attunity&#8217;s own internal data but also sensitive information belonging to prominent Fortune 100 clients, including Ford, Netflix, and TD Bank.</p>



<h2 class="wp-block-heading">What Data Was Exposed</h2>



<p class="wp-block-paragraph">According to the UpGuard research team, the exposed S3 buckets contained a wide range of highly sensitive data. The categories of leaked information included:</p>



<ul class="wp-block-list">
  <li>Backups of employee OneDrive accounts</li>
  <li>Internal email correspondence</li>
  <li>System passwords and private keys for production systems</li>
  <li>Sales and marketing contact information</li>
  <li>Project specifications and technical documentation</li>
  <li>Employee personal data</li>
  <li>Credentials for internal applications belonging to Attunity and at least one named client, Netflix</li>
  <li>Job account passwords and credentials related to manufacturing systems at unnamed client companies</li>
</ul>



<p class="wp-block-paragraph">UpGuard researchers noted that the 1 TB sample they downloaded was likely only a fraction of the total data stored in the exposed buckets. The actual volume of exposed data was almost certainly larger.</p>



<h2 class="wp-block-heading">Why This Incident Was Especially Serious</h2>



<p class="wp-block-paragraph">Beyond the sheer volume and sensitivity of the exposed records, the incident carried significant lateral risk. Because the leaked data included private keys, system passwords, and credentials for internal applications, a malicious actor who found these buckets before researchers did could potentially have used them as a launchpad to access Attunity&#8217;s own internal network — and from there, potentially pivot into the networks of its enterprise clients.</p>



<p class="wp-block-paragraph">This is a textbook example of supply-chain risk: a third-party vendor&#8217;s misconfiguration creating a potential entry point into the systems of the world&#8217;s largest companies.</p>



<h2 class="wp-block-heading">Root Cause: Misconfigured S3 Bucket Permissions</h2>



<p class="wp-block-paragraph">The underlying cause was a misconfigured AWS S3 bucket access policy. By default, S3 buckets created today are private, but historically it was straightforward to accidentally set a bucket&#8217;s ACL (Access Control List) or bucket policy to allow public reads. Organizations that store sensitive data in S3 must explicitly audit bucket permissions to ensure no buckets are inadvertently world-readable.</p>



<p class="wp-block-paragraph">Common reasons S3 buckets end up publicly exposed include:</p>



<ul class="wp-block-list">
  <li>Developers setting permissive ACLs for testing and never reverting them</li>
  <li>Misconfigured bucket policies that grant <code>s3:GetObject</code> to <code>*</code> (all principals)</li>
  <li>Lack of automated scanning and alerting on bucket permission changes</li>
  <li>No enforcement of an AWS Organizations Service Control Policy (SCP) that blocks public bucket access account-wide</li>
</ul>



<h2 class="wp-block-heading">How to Prevent S3 Data Exposure: Practical Steps for DevOps Teams</h2>



<p class="wp-block-paragraph">The Attunity incident is far from unique — misconfigured S3 buckets have been responsible for numerous high-profile breaches. The following controls are considered baseline hygiene for any AWS environment that stores sensitive data.</p>



<h3 class="wp-block-heading">1. Enable S3 Block Public Access at the Account Level</h3>



<p class="wp-block-paragraph">AWS provides a <strong>Block Public Access</strong> setting that can be enforced at both the individual bucket level and the AWS account level. Enabling all four Block Public Access options at the account level prevents any bucket in the account from being made public, regardless of bucket policy or ACL settings. This is the single most effective safeguard against accidental public exposure.</p>



<h3 class="wp-block-heading">2. Apply Least-Privilege Bucket Policies</h3>



<p class="wp-block-paragraph">Every S3 bucket policy should grant only the minimum permissions required. Avoid wildcard principals (<code>"Principal": "*"</code>) in bucket policies unless you specifically intend public access. Scope policies to specific IAM roles or AWS account IDs.</p>



<h3 class="wp-block-heading">3. Use AWS Config Rules or Security Hub to Detect Drift</h3>



<p class="wp-block-paragraph">AWS Config includes managed rules such as <code>s3-bucket-public-read-prohibited</code> and <code>s3-bucket-public-write-prohibited</code> that continuously evaluate your buckets and alert you when a bucket becomes publicly accessible. AWS Security Hub aggregates these findings for centralized visibility.</p>



<h3 class="wp-block-heading">4. Enable Server-Side Encryption and Enforce It via Policy</h3>



<p class="wp-block-paragraph">Encryption at rest does not prevent public exposure, but it does protect data if physical storage media is compromised. Use a bucket policy <code>Condition</code> that denies any <code>PutObject</code> request that does not include server-side encryption headers (<code>aws:SecureTransport</code> and <code>s3:x-amz-server-side-encryption</code>).</p>



<h3 class="wp-block-heading">5. Enable S3 Access Logging and CloudTrail Data Events</h3>



<p class="wp-block-paragraph">S3 server access logs and CloudTrail data events record every request made to a bucket. This provides an audit trail that can reveal whether a bucket was accessed by unauthorized parties before a misconfiguration was corrected.</p>



<h3 class="wp-block-heading">6. Audit Third-Party Vendor Cloud Posture</h3>



<p class="wp-block-paragraph">The Attunity breach underscores that your security posture is only as strong as the vendors who handle your data. Include cloud security configuration requirements in vendor contracts and assess vendor posture as part of third-party risk management programs.</p>



<h2 class="wp-block-heading">Key Takeaways</h2>



<ul class="wp-block-list">
  <li>Three misconfigured, unauthenticated AWS S3 buckets exposed Attunity&#8217;s internal data and data belonging to major Fortune 100 clients including Ford, Netflix, and TD Bank.</li>
  <li>The exposure included passwords, private keys, and credentials that could have enabled further network intrusion.</li>
  <li>UpGuard researchers found the buckets on May 13, 2019; they were secured within three days.</li>
  <li>Enabling AWS S3 Block Public Access at the account level is the most effective single control to prevent this class of incident.</li>
  <li>Continuous compliance monitoring (AWS Config, Security Hub) and robust third-party vendor assessments are essential components of a mature cloud security program.</li>
</ul>



<p class="wp-block-paragraph"><em>DevOps and cloud engineering teams should treat S3 bucket permission audits as a recurring operational task, not a one-time setup step. Permission drift is a real and well-documented risk.</em></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bestdevops.com/aws-s3-server-leaks-information-from-fortune-100-firms/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Server Management Software: Key Platforms, Market Segments, and What to Evaluate in 2024</title>
		<link>https://www.bestdevops.com/server-management-software-market-explore-future-growth-2019-2025/</link>
					<comments>https://www.bestdevops.com/server-management-software-market-explore-future-growth-2019-2025/#respond</comments>
		
		<dc:creator><![CDATA[anil]]></dc:creator>
		<pubDate>Tue, 25 Jun 2019 05:24:51 +0000</pubDate>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[future]]></category>
		<category><![CDATA[Growth]]></category>
		<category><![CDATA[management]]></category>
		<category><![CDATA[Market]]></category>
		<category><![CDATA[server]]></category>
		<guid isPermaLink="false">http://www.bestdevops.com/?p=5605</guid>

					<description><![CDATA[An overview of the server management software landscape, covering leading platforms, regional adoption, and the key capabilities DevOps and IT operations teams should evaluate when choosing a solution.]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph"><em>This article is based on a market summary originally sourced from openpr.com regarding the global Server Management Software market. Specific forecast figures and citations from the original third-party report have not been independently verified and are not reproduced here. The content below is an independent technical overview of the server management software category.</em></p>



<h2 class="wp-block-heading">What Is Server Management Software?</h2>



<p class="wp-block-paragraph">Server management software encompasses tools that allow IT operations and DevOps teams to monitor, configure, maintain, and secure physical and virtual servers from a centralized interface. These platforms typically combine real-time performance monitoring, alerting, patch management, remote access, log aggregation, and capacity planning into a single pane of glass.</p>



<p class="wp-block-paragraph">As infrastructure grows in complexity — spanning on-premises hardware, cloud VMs, containers, and hybrid environments — server management software has become a foundational layer of any mature operations practice. The market has expanded significantly alongside the adoption of DevOps, site reliability engineering (SRE), and cloud-native architectures.</p>



<h2 class="wp-block-heading">Leading Platforms in the Server Management Software Space</h2>



<p class="wp-block-paragraph">Several well-established vendors and open-source projects compete in this space. The following platforms are widely used by enterprise and mid-market operations teams:</p>



<ul class="wp-block-list">
  <li><strong>Datadog</strong> — A cloud-native monitoring and observability platform supporting infrastructure metrics, APM, log management, and synthetic monitoring across hybrid environments.</li>
  <li><strong>SolarWinds</strong> — Offers a broad portfolio including Server &amp; Application Monitor (SAM), providing deep Windows and Linux server visibility, alerting, and capacity forecasting.</li>
  <li><strong>ManageEngine OpManager</strong> — A network and server monitoring tool from Zoho&#8217;s ManageEngine division, widely adopted in mid-market and enterprise IT departments.</li>
  <li><strong>LogicMonitor</strong> — A SaaS-based infrastructure monitoring platform with agentless collection via collectors, strong for MSPs and distributed enterprise environments.</li>
  <li><strong>Kaseya VSA</strong> — A remote monitoring and management (RMM) platform popular with managed service providers (MSPs) for endpoint and server management.</li>
  <li><strong>ConnectWise Automate</strong> — Another RMM platform targeting MSPs, offering scripting, patch management, and remote control capabilities.</li>
  <li><strong>Netwrix</strong> — Focuses on auditing, change tracking, and compliance reporting across Windows Server, Active Directory, and file systems.</li>
  <li><strong>TeamViewer</strong> — Primarily known for remote access and support, with server monitoring features available in its business-tier offerings.</li>
  <li><strong>Scalyr (now Dataset by Sentinels)</strong> — A high-performance log management and observability platform designed for large-scale operational data ingestion.</li>
  <li><strong>MMSOFT Design (Pulseway)</strong> — A mobile-first server and network monitoring tool with a strong emphasis on real-time alerting and remote management from mobile devices.</li>
</ul>



<p class="wp-block-paragraph">Each platform occupies a different niche. The right choice depends on team size, existing toolchain, budget, and whether the environment is primarily on-premises, cloud, or hybrid.</p>



<h2 class="wp-block-heading">Regional Adoption Patterns</h2>



<p class="wp-block-paragraph">Demand for server management software is global, but adoption patterns differ by region due to regulatory environments, infrastructure maturity, and cloud penetration rates:</p>



<ul class="wp-block-list">
  <li><strong>United States</strong> — The largest market, driven by a mature enterprise IT sector, high cloud adoption, and strong regulatory requirements (HIPAA, SOC 2, PCI-DSS) that make audit and compliance features critical.</li>
  <li><strong>European Union</strong> — GDPR compliance requirements have increased demand for tools with strong data residency controls, audit logging, and access management.</li>
  <li><strong>China</strong> — Rapid infrastructure buildout and local sovereignty requirements have spurred domestic platform development alongside adoption of international tools.</li>
  <li><strong>Japan</strong> — A conservative enterprise IT market with high demand for stability, vendor support SLAs, and on-premises deployment options.</li>
  <li><strong>India</strong> — A fast-growing market driven by IT services outsourcing, a large MSP ecosystem, and increasing cloud adoption.</li>
  <li><strong>Southeast Asia</strong> — Emerging adoption, particularly in financial services and telecommunications, with growing interest in cloud-native monitoring platforms.</li>
</ul>



<h2 class="wp-block-heading">Core Capabilities to Evaluate</h2>



<p class="wp-block-paragraph">When assessing server management platforms, operations teams should evaluate the following functional areas:</p>



<h3 class="wp-block-heading">1. Performance Monitoring and Alerting</h3>



<p class="wp-block-paragraph">Real-time visibility into CPU, memory, disk I/O, and network throughput is table stakes. Look for configurable alert thresholds, anomaly detection, and integrations with incident management tools like PagerDuty or Opsgenie.</p>



<h3 class="wp-block-heading">2. Patch Management</h3>



<p class="wp-block-paragraph">Automated patching workflows reduce the manual burden of keeping servers current. Evaluate scheduling flexibility, rollback capabilities, and support for both Windows and Linux distributions.</p>



<h3 class="wp-block-heading">3. Remote Access and Control</h3>



<p class="wp-block-paragraph">Secure remote shell access, file transfer, and session recording are essential for distributed teams. Ensure the solution supports MFA and maintains audit logs of all remote sessions.</p>



<h3 class="wp-block-heading">4. Log Management and Audit Trails</h3>



<p class="wp-block-paragraph">Centralized log aggregation enables faster troubleshooting and supports compliance requirements. Evaluate retention periods, search performance at scale, and integration with SIEM platforms.</p>



<h3 class="wp-block-heading">5. Asset Inventory and Configuration Management</h3>



<p class="wp-block-paragraph">Automatic discovery and inventory of servers, installed software, and hardware specifications provides the foundation for capacity planning and configuration drift detection.</p>



<h3 class="wp-block-heading">6. Scalability and Multi-Tenancy</h3>



<p class="wp-block-paragraph">MSPs and large enterprises need platforms that support multiple tenants or organizational units with role-based access control (RBAC) and isolated dashboards.</p>



<h2 class="wp-block-heading">Deployment Models: SaaS vs. On-Premises vs. Hybrid</h2>



<p class="wp-block-paragraph">Most modern server management platforms are available as SaaS offerings, which reduces operational overhead but may introduce data sovereignty concerns for regulated industries. On-premises deployments remain common in government, healthcare, and financial services. Many vendors now offer hybrid models where agents send data to either a cloud-hosted or self-hosted collector, giving teams flexibility over where data resides.</p>



<h2 class="wp-block-heading">Integration with the Broader DevOps Toolchain</h2>



<p class="wp-block-paragraph">Server management software does not operate in isolation. The most effective implementations integrate with:</p>



<ul class="wp-block-list">
  <li><strong>CI/CD pipelines</strong> — Triggering deployment health checks post-release</li>
  <li><strong>Configuration management tools</strong> — Ansible, Puppet, Chef, or SaltStack for enforcing desired state</li>
  <li><strong>Cloud provider APIs</strong> — AWS CloudWatch, Azure Monitor, and GCP Cloud Monitoring for hybrid visibility</li>
  <li><strong>Ticketing systems</strong> — Jira, ServiceNow, or Freshservice for automated incident creation</li>
  <li><strong>Communication platforms</strong> — Slack or Microsoft Teams for alert notifications</li>
</ul>



<h2 class="wp-block-heading">Key Takeaways for DevOps and IT Operations Teams</h2>



<ul class="wp-block-list">
  <li>The server management software market includes both broad observability platforms (Datadog, SolarWinds) and specialized tools focused on MSP workflows (Kaseya, ConnectWise) or compliance (Netwrix).</li>
  <li>Evaluate platforms against your specific environment: OS mix, cloud footprint, team size, and compliance requirements.</li>
  <li>SaaS-based platforms generally offer faster time-to-value, while on-premises options provide greater data control.</li>
  <li>Integration depth with your existing DevOps toolchain is often a stronger differentiator than raw feature lists.</li>
  <li>Regional regulatory requirements — particularly GDPR in the EU and sector-specific mandates in the US — should influence your data residency and audit logging requirements.</li>
</ul>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bestdevops.com/server-management-software-market-explore-future-growth-2019-2025/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Monitoring Your IT Services Beyond Nagios: Key Capabilities to Look For</title>
		<link>https://www.bestdevops.com/monitoring-your-it-services-beyond-nagios/</link>
					<comments>https://www.bestdevops.com/monitoring-your-it-services-beyond-nagios/#respond</comments>
		
		<dc:creator><![CDATA[anil]]></dc:creator>
		<pubDate>Fri, 21 Apr 2017 12:59:14 +0000</pubDate>
				<category><![CDATA[DevOps]]></category>
		<category><![CDATA[IT trends]]></category>
		<category><![CDATA[Auto discovery]]></category>
		<category><![CDATA[Automation]]></category>
		<category><![CDATA[IT services]]></category>
		<category><![CDATA[Mobile Apps]]></category>
		<category><![CDATA[Nagios]]></category>
		<category><![CDATA[Network Mapping]]></category>
		<category><![CDATA[server]]></category>
		<category><![CDATA[Windows Monitoring]]></category>
		<guid isPermaLink="false">http://www.bestdevops.com/?p=1349</guid>

					<description><![CDATA[Nagios Core is a powerful free monitoring tool, but complex enterprise environments often demand more. Here is a practical breakdown of the capabilities that go beyond Nagios and what to evaluate when choosing a more capable monitoring platform.]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Nagios Core has been a foundational IT monitoring tool for decades, and its open-source nature makes it attractive for teams getting started with infrastructure monitoring. However, as environments grow in scale and complexity—spanning on-premise servers, virtualised workloads, cloud services, and distributed networks—Nagios Core&#8217;s limitations become harder to work around. This article examines the capabilities that enterprise teams commonly need beyond a bare Nagios installation, using Opsview as a reference example of a Nagios-based platform that addresses these gaps.</p>




<p class="wp-block-paragraph"><strong>Attribution:</strong> This article is based on content originally published by Opsview (opsview.com). Product claims reflect Opsview&#8217;s own documentation and marketing materials as of the original publish date (April 2017) and may not reflect the current product. Readers should verify current feature availability directly with the vendor.</p>




<h2 class="wp-block-heading">Why Nagios Core Has Limits for Complex Environments</h2>



<p class="wp-block-paragraph">Nagios Core is free, flexible, and has a vast plugin ecosystem—but those strengths come with trade-offs. Configuration is entirely file-based, and a single syntax error can halt all monitoring activity. There is no built-in graphical configuration interface, no native SNMP trap handling, and no out-of-the-box SLA reporting. For a small, relatively static environment managed by an experienced Nagios administrator, these gaps are manageable. For larger, fast-changing environments with multiple teams and stakeholders, they become significant operational burdens.</p>



<p class="wp-block-paragraph">The sections below cover the key capabilities that organisations typically need once they move beyond a basic Nagios deployment.</p>



<h2 class="wp-block-heading">Usable Configuration Interface</h2>



<p class="wp-block-paragraph">One of the most immediate pain points with Nagios Core is its configuration model. Hosts, services, contacts, and escalation rules are all defined in flat text files. There is no validation layer beyond what Nagios checks at startup, and a misconfiguration silently breaks monitoring until it is fixed and the daemon is restarted.</p>



<p class="wp-block-paragraph">Platforms built on top of Nagios—such as Opsview, Icinga, or Naemon—typically provide a web-based configuration UI that abstracts away the raw config files. This lowers the barrier to entry, reduces the risk of configuration errors, and allows non-expert team members to manage monitoring without needing to understand Nagios internals.</p>



<h2 class="wp-block-heading">Role-Based Dashboards</h2>



<p class="wp-block-paragraph">Nagios Core&#8217;s default web interface presents a unified view of host and service states that is functional but not tailored to different audiences. In practice, a Windows systems administrator, a Linux administrator, a network engineer, and a business manager all need different views of monitoring data.</p>



<p class="wp-block-paragraph">Enterprise monitoring platforms address this with role-based, customisable dashboards. Common capabilities include:</p>



<ul class="wp-block-list">
<li><strong>Drag-and-drop dashboard builders</strong> that let administrators compose views from widgets such as service summary panels, performance graphs, and gauges.</li>
<li><strong>Role assignment</strong> so that a user logging in sees only the dashboards and data relevant to their responsibilities.</li>
<li><strong>Business service grouping</strong> that maps low-level host and service checks to higher-level business outcomes, often visualised with simple traffic-light status indicators.</li>
<li><strong>Read-only dashboard sharing</strong> for non-technical stakeholders such as executives or external clients who need visibility into service health without access to configuration.</li>
</ul>



<p class="wp-block-paragraph">Managed service providers (MSPs) can use role-based dashboards to give individual clients a view of their own SLA data without exposing other tenants&#8217; information.</p>



<h2 class="wp-block-heading">Auto-Discovery</h2>



<p class="wp-block-paragraph">In Nagios Core, every host and service must be defined manually in configuration files. In dynamic environments—where virtual machines are spun up and torn down regularly, or cloud workloads scale in and out—keeping configuration in sync with reality is a significant maintenance task.</p>



<p class="wp-block-paragraph">Auto-discovery features scan networks, query cloud provider APIs, or inspect virtualisation platforms to detect new hosts and services automatically, then import them into the monitoring configuration. This is particularly valuable for:</p>



<ul class="wp-block-list">
<li>Initial onboarding of large existing environments.</li>
<li>Keeping monitoring current in environments with frequent infrastructure changes.</li>
<li>Reducing the manual effort of configuring monitoring for cloud or virtualised workloads.</li>
</ul>



<h2 class="wp-block-heading">Distributed Monitoring</h2>



<p class="wp-block-paragraph">When infrastructure spans multiple data centres, office locations, or cloud regions, a single central Nagios server may not be able to reach all monitored endpoints, and network latency can distort check results. Distributed monitoring architectures address this by placing monitoring nodes (variously called pollers, collectors, or slave servers) close to the resources they monitor.</p>



<p class="wp-block-paragraph">While Nagios Core can participate in distributed setups using passive checks and NSCA, the configuration and maintenance of this is complex. More capable platforms provide managed distributed architectures where:</p>



<ul class="wp-block-list">
<li>Remote collector nodes are configured and managed centrally.</li>
<li>Results are aggregated at a master server without requiring administrators to manually manage NSCA pipelines.</li>
<li>The architecture can scale by adding additional collector nodes without restructuring the entire monitoring setup.</li>
</ul>



<h2 class="wp-block-heading">High Availability: Slave and Master Server Clustering</h2>



<p class="wp-block-paragraph">A standalone Nagios instance is a single point of failure. If the monitoring server goes down, you lose visibility across your entire infrastructure—exactly when you may most need it.</p>



<p class="wp-block-paragraph">Enterprise platforms typically offer two layers of high availability:</p>



<ul class="wp-block-list">
<li><strong>Collector/slave clustering:</strong> Multiple collector nodes can be grouped so that monitoring load is automatically balanced across them. If one collector fails, its checks are redistributed to remaining nodes without manual intervention.</li>
<li><strong>Master server clustering:</strong> The central management and reporting server can itself be clustered for redundancy, ensuring that configuration management and dashboards remain available even if a master node fails.</li>
</ul>



<h2 class="wp-block-heading">Agentless Windows Monitoring</h2>



<p class="wp-block-paragraph">Monitoring Windows hosts with Nagios Core typically requires installing an agent such as NSClient++ on each Windows machine. This is workable but introduces agent lifecycle management overhead—agents must be deployed, kept up to date, and monitored themselves.</p>



<p class="wp-block-paragraph">Agentless Windows monitoring uses WMI (Windows Management Instrumentation) to query Windows hosts remotely without any software installed on the target machine. The practical advantages are:</p>



<ul class="wp-block-list">
<li>No agent deployment or maintenance overhead on Windows hosts.</li>
<li>Easier onboarding of Windows machines in environments where software installation approval processes are slow.</li>
<li>Flexibility to run agent-based monitoring where higher-frequency or more detailed checks are needed, and agentless monitoring everywhere else.</li>
</ul>



<h2 class="wp-block-heading">Flexible Host and Service Grouping</h2>



<p class="wp-block-paragraph">Nagios Core supports hostgroups and servicegroups for organising monitored resources, but these are static groupings defined in configuration files. In complex environments you often need to slice and filter monitored resources in multiple dimensions—by location, by business criticality, by application, by team ownership.</p>



<p class="wp-block-paragraph">Tagging or keyword systems (as Opsview calls them) allow free-form labels to be applied to hosts and services. A host can carry multiple tags simultaneously, and operators can filter the monitoring view to show only hosts and services matching a particular tag or combination of tags. This provides flexibility that static group membership cannot easily replicate.</p>



<h2 class="wp-block-heading">Host Attributes for Templated Service Configuration</h2>



<p class="wp-block-paragraph">When you need to monitor the same type of resource across many hosts—for example, a specific disk partition name that differs between servers—Nagios requires either separate service definitions for each host or complex use of custom variables. Host attribute features in more capable platforms let you define a set of variable parameters at the host level and then create service check templates that reference those parameters. The result is that a single service template can generate correctly configured checks across many hosts with different attribute values, dramatically reducing configuration duplication.</p>



<h2 class="wp-block-heading">Distributed Alerting</h2>



<p class="wp-block-paragraph">In a distributed monitoring architecture, notification reliability matters. If the link between a remote collector and the central master server is lost, you still need alerts to be generated for issues detected at the remote site.</p>



<p class="wp-block-paragraph">Distributed alerting allows remote collector nodes to send notifications autonomously when they cannot reach the master, ensuring that on-call engineers receive alerts regardless of WAN connectivity issues between monitoring tiers.</p>



<h2 class="wp-block-heading">Network Mapping and Visualisation</h2>



<p class="wp-block-paragraph">Understanding parent-child relationships between network devices helps engineers quickly determine whether a downstream failure is caused by a genuine problem with that device or is a consequence of a parent device being unreachable. Nagios Core supports parent-child host relationships in its configuration, but visualisation is limited.</p>



<p class="wp-block-paragraph">Network mapping features in enterprise platforms render these relationships graphically, showing device topology alongside real-time status. This makes it much faster to perform root cause analysis during an incident, particularly in complex multi-tier network environments.</p>



<h2 class="wp-block-heading">SNMP Trap Processing</h2>



<p class="wp-block-paragraph">Nagios Core is a poll-based monitoring system: it initiates checks against targets on a schedule. It does not natively receive or process SNMP traps, which are unsolicited notifications sent by network devices when specific events occur (such as a link going down or a threshold being crossed).</p>



<p class="wp-block-paragraph">For environments with significant network infrastructure—routers, switches, UPS units, and other SNMP-capable devices—trap processing is important because it provides near-real-time event notification that poll-based checking cannot match. Platforms with integrated SNMP engines can receive traps, parse them against MIB definitions, apply filtering rules, and translate them into monitoring alerts through the same interface used for all other checks.</p>



<h2 class="wp-block-heading">Configuration Cloning</h2>



<p class="wp-block-paragraph">When adding hosts or services that are similar to existing ones, being able to clone an existing configuration and modify only the differing attributes saves significant time compared to building each configuration from scratch. This is especially useful during onboarding of new infrastructure where many similar devices need to be added quickly.</p>



<h2 class="wp-block-heading">SLA and Availability Reporting</h2>



<p class="wp-block-paragraph">Nagios Core logs state history, but generating formatted SLA and availability reports from that data requires additional tooling. In practice, many teams end up manually compiling availability figures from log data—an error-prone and time-consuming process.</p>



<p class="wp-block-paragraph">Enterprise monitoring platforms typically include reporting engines that can:</p>



<ul class="wp-block-list">
<li>Generate availability and SLA reports for specified hosts, services, or business service groups over configurable time periods.</li>
<li>Schedule automatic report delivery by email.</li>
<li>Export reports in multiple formats (PDF, HTML, spreadsheet formats) suitable for different audiences.</li>
</ul>



<h2 class="wp-block-heading">Service Desk Integration</h2>



<p class="wp-block-paragraph">When monitoring generates an alert, the typical operational response is to create a ticket in a service desk system. Doing this manually for every alert introduces delay and relies on on-call staff to act immediately. Automated service desk integration allows monitoring alerts to trigger ticket creation directly in ITSM platforms, eliminating the manual step and ensuring that every alert has an associated ticket for tracking and audit purposes.</p>



<p class="wp-block-paragraph">Common integration targets include platforms such as ServiceNow, Atlassian Jira Service Management, and similar ITSM tools. The specific integrations supported vary by monitoring platform and version.</p>



<h2 class="wp-block-heading">Flexible Notification Profiles</h2>



<p class="wp-block-paragraph">Nagios Core supports notification escalations and time-period-based notification suppression, but configuring fine-grained notification routing is complex. The result in many Nagios deployments is that teams receive too many alerts, or alerts go to the wrong people, leading to alert fatigue and missed incidents.</p>



<p class="wp-block-paragraph">Notification profile systems let administrators configure rules such as:</p>



<ul class="wp-block-list">
<li>Send email alerts for a specific service only during business hours.</li>
<li>Send SMS alerts for critical e-commerce services at any hour.</li>
<li>Route alerts for Windows services to the Windows team, and Linux service alerts to the Linux team.</li>
<li>Automatically create service desk tickets for high-severity alerts and assign them to the relevant engineer group.</li>
</ul>



<h2 class="wp-block-heading">APIs for Automation and Integration</h2>



<p class="wp-block-paragraph">In modern DevOps and infrastructure-as-code workflows, monitoring configuration needs to be manageable programmatically—not only through a web UI. REST APIs for monitoring platforms allow teams to:</p>



<ul class="wp-block-list">
<li>Automate the addition and removal of hosts and services as infrastructure changes (for example, integrating with Terraform or Ansible).</li>
<li>Query current monitoring state from other tooling or dashboards.</li>
<li>Trigger configuration reloads or acknowledgements from CI/CD pipelines.</li>
<li>Integrate monitoring data into broader IT management or observability platforms.</li>
</ul>



<h2 class="wp-block-heading">Mobile Access</h2>



<p class="wp-block-paragraph">On-call engineers need to check monitoring status and acknowledge alerts from mobile devices. While Nagios Core&#8217;s web interface can be accessed via a mobile browser, dedicated mobile applications provide a better experience with features such as push notifications that alert engineers even when the app is not in the foreground.</p>



<h2 class="wp-block-heading">Commercial Support</h2>



<p class="wp-block-paragraph">Nagios Core is community-supported. For test environments and non-critical monitoring this is generally acceptable, but for monitoring that underpins production infrastructure, having access to vendor support with defined response times is important. Commercial monitoring platforms built on Nagios foundations typically offer tiered support plans backed by engineers familiar with the product internals.</p>



<h2 class="wp-block-heading">Evaluating Your Options</h2>



<p class="wp-block-paragraph">Nagios Core remains a viable starting point for many environments, and a significant ecosystem of Nagios-compatible tools, plugins, and extensions exists. However, the features described in this article—configuration UI, role-based dashboards, auto-discovery, distributed monitoring, HA clustering, agentless Windows monitoring, SNMP trap processing, SLA reporting, service desk integration, and automation APIs—represent a meaningful capability gap between bare Nagios Core and what most production IT operations teams need.</p>



<p class="wp-block-paragraph">When evaluating whether to extend Nagios Core with additional tooling or move to a more complete platform, map your operational requirements against these capabilities and assess both the initial configuration cost and the ongoing maintenance burden of each approach.</p>



<p class="wp-block-paragraph">Alternatives in the Nagios ecosystem and broader monitoring space include Icinga 2, Naemon, Zabbix, Opsview, and others. Each has different strengths, licensing models, and integration ecosystems. The right choice depends on your infrastructure scale, team skills, and budget.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bestdevops.com/monitoring-your-it-services-beyond-nagios/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
