<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Clivern</title>
    <description>The latest articles on DEV Community by Clivern (@clivern).</description>
    <link>https://dev.to/clivern</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F238334%2Fbaf11c47-8057-47dc-a8f5-23d6d7599bee.png</url>
      <title>DEV Community: Clivern</title>
      <link>https://dev.to/clivern</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/clivern"/>
    <language>en</language>
    <item>
      <title>Lynx - A Fast, Secure and Reliable Terraform Backend</title>
      <dc:creator>Clivern</dc:creator>
      <pubDate>Sat, 22 Jun 2024 19:43:01 +0000</pubDate>
      <link>https://dev.to/clivern/lynx-a-fast-secure-and-reliable-terraform-backend-4fi0</link>
      <guid>https://dev.to/clivern/lynx-a-fast-secure-and-reliable-terraform-backend-4fi0</guid>
      <description>&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/Clivern/Lynx" rel="noopener noreferrer"&gt;Lynx&lt;/a&gt; is a Fast, Secure and Reliable Terraform Backend. It is built in Elixir with Phoenix framework.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Features:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Simplified Setup: Easy installation and maintenance for hassle-free usage.&lt;/li&gt;
&lt;li&gt;Team Collaboration: Manage multiple teams and users seamlessly.&lt;/li&gt;
&lt;li&gt;User-Friendly Interface: Enjoy a visually appealing dashboard for intuitive navigation.&lt;/li&gt;
&lt;li&gt;Project Flexibility: Support for multiple projects within each team.&lt;/li&gt;
&lt;li&gt;Environment Management: Create and manage multiple environments per project.&lt;/li&gt;
&lt;li&gt;State Versioning: Keep track of Terraform state versions for better control.&lt;/li&gt;
&lt;li&gt;Rollback Capability: Easily revert to previous states for efficient infrastructure management.&lt;/li&gt;
&lt;li&gt;Terraform Locking Support: The project also supports Terraform locking, ensuring state integrity and preventing concurrent operations that could lead to data corruption&lt;/li&gt;
&lt;li&gt;RESTful Endpoints: for seamless teams, users, projects, environments, and snapshots management.&lt;/li&gt;
&lt;li&gt;Snapshots Support: for both projects and environments to ensure data integrity and provide recovery options at specific points in time.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/Clivern/terraform-provider-lynx" rel="noopener noreferrer"&gt;Terraform Provider&lt;/a&gt;: Automate creation/updates of teams, users, projects, environments and snapshots with terraform.&lt;/li&gt;
&lt;li&gt;Single Sign-On (SSO): Support for OAuth2 Providers like Azure AD OAuth, Keycloak, Okta … etc&lt;/li&gt;
&lt;/ul&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/Clivern" rel="noopener noreferrer"&gt;
        Clivern
      &lt;/a&gt; / &lt;a href="https://github.com/Clivern/Lynx" rel="noopener noreferrer"&gt;
        Lynx
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      🐺 A Fast, Secure and Reliable Terraform Backend, Set up in Minutes.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;p&gt;
    &lt;a rel="noopener noreferrer" href="https://github.com/Clivern/Lynx/assets/img/logo.png?v=0.12.3"&gt;&lt;img alt="Lynx Logo" src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FClivern%2FLynx%2Fassets%2Fimg%2Flogo.png%3Fv%3D0.12.3" width="400"&gt;&lt;/a&gt;
    &lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Lynx&lt;/h3&gt;
&lt;/div&gt;
    &lt;p&gt;A Fast, Secure and Reliable Terraform Backend, Set up in Minutes.&lt;/p&gt;
    &lt;p&gt;
        &lt;a href="https://github.com/Clivern/Lynx/actions/workflows/ci.yml" rel="noopener noreferrer"&gt;
            &lt;img src="https://github.com/Clivern/Lynx/actions/workflows/server_ci.yml/badge.svg"&gt;
        &lt;/a&gt;
        &lt;a href="https://github.com/Clivern/Lynx/releases" rel="noopener noreferrer"&gt;
            &lt;img src="https://camo.githubusercontent.com/fcba3dfae0904e5f1bd25dbf6763dce345c3d3babfe8e6fc32b5f070473dd438/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f56657273696f6e2d302e31322e332d3161626339632e737667"&gt;
        &lt;/a&gt;
        &lt;a href="https://hub.docker.com/r/clivern/lynx/tags" rel="nofollow noopener noreferrer"&gt;
            &lt;img src="https://camo.githubusercontent.com/f7cdfbecd39e2b541f71caf60a16c33a3369b1ee56bf875ff09e50dc54df15a6/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f446f636b65722d302e31322e332d3161626339632e737667"&gt;
        &lt;/a&gt;
        &lt;a href="https://github.com/Clivern/terraform-provider-lynx" rel="noopener noreferrer"&gt;
            &lt;img src="https://camo.githubusercontent.com/072b8d972c976feaee8c5e37063a4896d4534f7f2175788a1394aa7a5f640305/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5465727261666f726d2d50726f76696465722d79656c6c6f772e737667"&gt;
        &lt;/a&gt;
        &lt;a href="https://github.com/Clivern/Lynx/blob/main/LICENSE" rel="noopener noreferrer"&gt;
            &lt;img src="https://camo.githubusercontent.com/bbc70ea904cf6138e668d47c0180490a8fe451395805898ea28e476bfe518de1/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c4943454e53452d4d49542d6f72616e67652e737667"&gt;
        &lt;/a&gt;
    &lt;/p&gt;
&lt;br&gt;
&lt;p&gt;Lynx is a Fast, Secure and Reliable Terraform Backend. It is built in Elixir with Phoenix framework.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h4 class="heading-element"&gt;Features:&lt;/h4&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Simplified Setup: Easy installation and maintenance for hassle-free usage.&lt;/li&gt;
&lt;li&gt;Team Collaboration: Manage multiple teams and users seamlessly.&lt;/li&gt;
&lt;li&gt;User-Friendly Interface: Enjoy a visually appealing dashboard for intuitive navigation.&lt;/li&gt;
&lt;li&gt;Project Flexibility: Support for multiple projects within each team.&lt;/li&gt;
&lt;li&gt;Environment Management: Create and manage multiple environments per project.&lt;/li&gt;
&lt;li&gt;State Versioning: Keep track of Terraform state versions for better control.&lt;/li&gt;
&lt;li&gt;Rollback Capability: Easily revert to previous states for efficient infrastructure management.&lt;/li&gt;
&lt;li&gt;Terraform Locking Support: The project also supports Terraform locking, ensuring state integrity and preventing concurrent operations that could lead to data corruption&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://lynx.apidocumentation.com/reference" rel="nofollow noopener noreferrer"&gt;RESTful Endpoints&lt;/a&gt;: for seamless teams, users, projects, environments, and snapshots management.&lt;/li&gt;
&lt;li&gt;Snapshots Support: for both projects and environments to ensure data integrity and provide recovery options at specific points in…&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Clivern/Lynx" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


</description>
      <category>devops</category>
      <category>terraform</category>
      <category>elixir</category>
    </item>
    <item>
      <title>How To Manage Your Applications Go Environment with Goenv</title>
      <dc:creator>Clivern</dc:creator>
      <pubDate>Wed, 13 Jul 2022 22:05:42 +0000</pubDate>
      <link>https://dev.to/clivern/how-to-manage-your-applications-go-environment-with-goenv-567d</link>
      <guid>https://dev.to/clivern/how-to-manage-your-applications-go-environment-with-goenv-567d</guid>
      <description>&lt;p&gt;Goenv helps you to work with multiple golang versions at the same time whether on mac or linux operating system. It supports both global and per-application version configuration.&lt;/p&gt;

&lt;p&gt;Here is a demo of goenv in action&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/nC344VXoFs4"&gt;
&lt;/iframe&gt;
&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/Clivern" rel="noopener noreferrer"&gt;
        Clivern
      &lt;/a&gt; / &lt;a href="https://github.com/Clivern/Goenv" rel="noopener noreferrer"&gt;
        Goenv
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      🐺 Manage Your Applications Go Environment.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;p&gt;
    &lt;a rel="noopener noreferrer" href="https://github.com/Clivern/Goenv/static/logo.png?v=1.17.0"&gt;&lt;img alt="Goenv Logo" src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FClivern%2FGoenv%2Fstatic%2Flogo.png%3Fv%3D1.17.0" width="200"&gt;&lt;/a&gt;
    &lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Goenv&lt;/h3&gt;
&lt;/div&gt;
    &lt;p&gt;Manage Your Applications Go Environment&lt;/p&gt;
    &lt;p&gt;
        &lt;a href="https://github.com/clivern/Goenv/actions/workflows/build.yml" rel="noopener noreferrer"&gt;
            &lt;img src="https://github.com/clivern/Goenv/actions/workflows/build.yml/badge.svg"&gt;
        &lt;/a&gt;
        &lt;a href="https://github.com/clivern/Goenv/releases" rel="noopener noreferrer"&gt;
            &lt;img src="https://camo.githubusercontent.com/bc0594091bb54ba420b96784ee1705feaacb8d6e6f2013f1552d9fb6d7d814c9/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f56657273696f6e2d76312e31372e302d7265642e737667"&gt;
        &lt;/a&gt;
        &lt;a href="https://goreportcard.com/report/github.com/clivern/Goenv" rel="nofollow noopener noreferrer"&gt;
            &lt;img src="https://camo.githubusercontent.com/a0361a4d377550613382492994b5a2c9cab10ad851c0bb47d0db56ccb33831ab/68747470733a2f2f676f7265706f7274636172642e636f6d2f62616467652f6769746875622e636f6d2f636c697665726e2f476f656e763f763d312e31372e30"&gt;
        &lt;/a&gt;
        &lt;a href="https://godoc.org/github.com/clivern/goenv" rel="nofollow noopener noreferrer"&gt;
            &lt;img src="https://camo.githubusercontent.com/40585039d899b1b0904b71c45eee1f16455763098fb26602c6efc954bb22712c/68747470733a2f2f676f646f632e6f72672f6769746875622e636f6d2f636c697665726e2f676f656e763f7374617475732e737667"&gt;
        &lt;/a&gt;
        &lt;a href="https://github.com/clivern/Goenv/blob/main/LICENSE" rel="noopener noreferrer"&gt;
            &lt;img src="https://camo.githubusercontent.com/bbc70ea904cf6138e668d47c0180490a8fe451395805898ea28e476bfe518de1/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c4943454e53452d4d49542d6f72616e67652e737667"&gt;
        &lt;/a&gt;
    &lt;/p&gt;
&lt;br&gt;
&lt;p&gt;
    &lt;a href="https://www.youtube.com/watch?v=nC344VXoFs4" rel="nofollow noopener noreferrer"&gt;
        &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FClivern%2FGoenv%2Fstatic%2Fscreenshot-1.png" width="95%"&gt;
    &lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Goenv helps you to work with multiple &lt;code&gt;golang&lt;/code&gt; versions at the same time whether on mac or linux operating system. It supports both global and per-application version configuration.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Usage&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;Download &lt;a href="https://github.com/clivern/Goenv/releases" rel="noopener noreferrer"&gt;the latest &lt;code&gt;goenv&lt;/code&gt; binary&lt;/a&gt;. Make it executable from everywhere.&lt;/p&gt;

&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;$ &lt;span class="pl-k"&gt;export&lt;/span&gt; GOENV_LATEST_VERSION=&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;$(&lt;/span&gt;curl --silent &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;https://api.github.com/repos/clivern/Goenv/releases/latest&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt; &lt;span class="pl-k"&gt;|&lt;/span&gt; jq &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;'&lt;/span&gt;.tag_name&lt;span class="pl-pds"&gt;'&lt;/span&gt;&lt;/span&gt; &lt;span class="pl-k"&gt;|&lt;/span&gt; sed -E &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;'&lt;/span&gt;s/.*"([^"]+)".*/\1/&lt;span class="pl-pds"&gt;'&lt;/span&gt;&lt;/span&gt; &lt;span class="pl-k"&gt;|&lt;/span&gt; tr -d v&lt;span class="pl-pds"&gt;)&lt;/span&gt;&lt;/span&gt;

&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; For Linux&lt;/span&gt;
$ curl -sL https://github.com/clivern/Goenv/releases/download/v{&lt;span class="pl-smi"&gt;$GOENV_LATEST_VERSION&lt;/span&gt;}/goenv_Linux_x86_64.tar.gz &lt;span class="pl-k"&gt;|&lt;/span&gt; tar xz

&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; For Mac&lt;/span&gt;
$ curl -sL https://github.com/clivern/Goenv/releases/download/v{&lt;span class="pl-smi"&gt;$GOENV_LATEST_VERSION&lt;/span&gt;}/goenv_Darwin_x86_64.tar.gz &lt;span class="pl-k"&gt;|&lt;/span&gt; tar xz&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Configure the goenv using the following command&lt;/p&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;$ goenv config&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Add &lt;code&gt;goenv&lt;/code&gt; shims to &lt;code&gt;PATH&lt;/code&gt; using the following command. also append it to &lt;code&gt;~/.profile&lt;/code&gt; file to make it permanent.&lt;/p&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;$ &lt;span class="pl-k"&gt;export&lt;/span&gt; PATH=&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;span class="pl-smi"&gt;$HOME&lt;/span&gt;/.goenv/shims:&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span class="pl-smi"&gt;$PATH&lt;/span&gt;

&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; OR&lt;/span&gt;

$ &lt;span class="pl-c1"&gt;eval&lt;/span&gt; &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;$(&lt;/span&gt;goenv init&lt;span class="pl-pds"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Install a new &lt;code&gt;go&lt;/code&gt; version &lt;code&gt;1.18&lt;/code&gt; and set…&lt;/p&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Clivern/Goenv" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;



&lt;h2&gt;
  
  
  Usage
&lt;/h2&gt;

&lt;p&gt;Download &lt;a href="https://github.com/spacewalkio/Goenv/releases" rel="noopener noreferrer"&gt;the latest &lt;code&gt;goenv&lt;/code&gt; binary&lt;/a&gt;. Make it executable from everywhere.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;GOENV_LATEST_VERSION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;curl &lt;span class="nt"&gt;--silent&lt;/span&gt; &lt;span class="s2"&gt;"https://api.github.com/repos/spacewalkio/Goenv/releases/latest"&lt;/span&gt; | jq &lt;span class="s1"&gt;'.tag_name'&lt;/span&gt; | &lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="nt"&gt;-E&lt;/span&gt; &lt;span class="s1"&gt;'s/.*"([^"]+)".*/\1/'&lt;/span&gt; | &lt;span class="nb"&gt;tr&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; v&lt;span class="si"&gt;)&lt;/span&gt;

&lt;span class="c"&gt;# For Linux&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;curl &lt;span class="nt"&gt;-sL&lt;/span&gt; https://github.com/spacewalkio/Goenv/releases/download/v&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$GOENV_LATEST_VERSION&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;/goenv_&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$GOENV_LATEST_VERSION&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;_Linux_x86_64.tar.gz | &lt;span class="nb"&gt;tar &lt;/span&gt;xz

&lt;span class="c"&gt;# For Mac&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;curl &lt;span class="nt"&gt;-sL&lt;/span&gt; https://github.com/spacewalkio/Goenv/releases/download/v&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$GOENV_LATEST_VERSION&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;/goenv_&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$GOENV_LATEST_VERSION&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;_Darwin_x86_64.tar.gz | &lt;span class="nb"&gt;tar &lt;/span&gt;xz


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Configure the goenv using the following command&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

&lt;span class="nv"&gt;$ &lt;/span&gt;goenv config


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Add &lt;code&gt;goenv&lt;/code&gt; shims to &lt;code&gt;PATH&lt;/code&gt; using the following command. also append it to &lt;code&gt;~/.profile&lt;/code&gt; file to make it permanent.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/.goenv/shims:"&lt;/span&gt;&lt;span class="nv"&gt;$PATH&lt;/span&gt;

&lt;span class="c"&gt;# OR&lt;/span&gt;

&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;eval&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;goenv init&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Install a new &lt;code&gt;go&lt;/code&gt; version &lt;code&gt;1.18&lt;/code&gt; and set as a global&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

&lt;span class="nv"&gt;$ &lt;/span&gt;goenv &lt;span class="nb"&gt;install &lt;/span&gt;1.18
&lt;span class="nv"&gt;$ &lt;/span&gt;goenv global 1.18


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;To configure a local version different from the global&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

&lt;span class="nv"&gt;$ &lt;/span&gt;goenv &lt;span class="nb"&gt;local &lt;/span&gt;1.18


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;To Uninstall a version&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

&lt;span class="nv"&gt;$ &lt;/span&gt;goenv uninstall 1.18


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Show the used version either from current directory or parent directories or the global version.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

&lt;span class="nv"&gt;$ &lt;/span&gt;goenv version


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;To list all installed versions&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

&lt;span class="nv"&gt;$ &lt;/span&gt;goenv versions


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;for a list of all available commands&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

&lt;span class="nv"&gt;$ &lt;/span&gt;goenv &lt;span class="nt"&gt;--help&lt;/span&gt;

🐺 Manage Your Applications Go Environment.

If you have any suggestions, bug reports, or annoyances please report
them to our issue tracker at &amp;lt;https://github.com/spacewalkio/goenv/issues&amp;gt;

Usage:
  goenv &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;command&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;

Available Commands:
  completion  Generate the autocompletion script &lt;span class="k"&gt;for &lt;/span&gt;the specified shell
  config      Configure the goenv application.
  &lt;span class="nb"&gt;exec        &lt;/span&gt;Show the current go version.
  global      Set or show the global go version.
  &lt;span class="nb"&gt;help        &lt;/span&gt;Help about any &lt;span class="nb"&gt;command
  &lt;/span&gt;info        Print the goenv version
  init        Init the import path &lt;span class="k"&gt;for &lt;/span&gt;goenv shims.
  &lt;span class="nb"&gt;install     &lt;/span&gt;Install a go version.
  license     Print the license
  &lt;span class="nb"&gt;local       &lt;/span&gt;Set or show the &lt;span class="nb"&gt;local &lt;/span&gt;application-specific go version.
  rehash      Refresh binaries under goenv shim directory.
  uninstall   Uninstall a specific go version.
  version     Show the current go version.
  versions    List installed go versions.

Flags:
  &lt;span class="nt"&gt;-h&lt;/span&gt;, &lt;span class="nt"&gt;--help&lt;/span&gt;   &lt;span class="nb"&gt;help &lt;/span&gt;&lt;span class="k"&gt;for &lt;/span&gt;goenv

Use &lt;span class="s2"&gt;"goenv [command] --help"&lt;/span&gt; &lt;span class="k"&gt;for &lt;/span&gt;more information about a command.


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h2&gt;
  
  
  Under The Hood
&lt;/h2&gt;

&lt;p&gt;Goenv is inspired by and works like &lt;code&gt;rbenv&lt;/code&gt;. At a high level, &lt;code&gt;goenv&lt;/code&gt; intercepts &lt;code&gt;Go&lt;/code&gt; commands using &lt;code&gt;shim&lt;/code&gt; executables injected into your &lt;code&gt;PATH&lt;/code&gt;, determines which Go version has been specified by your application or globally, and passes your commands to the correct &lt;code&gt;Go&lt;/code&gt; installation &lt;code&gt;bin&lt;/code&gt; folder.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Understanding PATH&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When you run a command like &lt;code&gt;go&lt;/code&gt; or &lt;code&gt;gofmt&lt;/code&gt;, your operating system searches through a list of directories to find an executable file with that name. This list of directories lives in an environment variable called &lt;code&gt;PATH&lt;/code&gt;, with each directory in the list separated by a colon:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

/usr/local/bin:/usr/bin:/bin


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Directories in &lt;code&gt;PATH&lt;/code&gt; are searched from left to right, so a matching executable in a directory at the beginning of the list takes precedence over another one at the end. In this example, the &lt;code&gt;/usr/local/bin&lt;/code&gt; directory will be searched first, then &lt;code&gt;/usr/bin&lt;/code&gt;, then &lt;code&gt;/bin&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Understanding Shims&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;goenv&lt;/code&gt; works by inserting a directory of shims at the front of your &lt;code&gt;PATH&lt;/code&gt;:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

~/.goenv/shims:/usr/local/bin:/usr/bin:/bin


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Through a process called rehashing, &lt;code&gt;goenv&lt;/code&gt; maintains shims in that directory to match every &lt;code&gt;Go&lt;/code&gt; command across every installed version of &lt;code&gt;go&lt;/code&gt; like &lt;code&gt;gofmt&lt;/code&gt; and so on.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;shims&lt;/code&gt; are lightweight executables that simply pass your command to the right binary under the current go version, your operating system will do the following:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Search your &lt;code&gt;PATH&lt;/code&gt; for an executable file named &lt;code&gt;gofmt&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Find the goenv shim named &lt;code&gt;gofmt&lt;/code&gt; at the beginning of your &lt;code&gt;PATH&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Run the shim named &lt;code&gt;gofmt&lt;/code&gt;, which in turn fetch the target go version and use the &lt;code&gt;gofmt&lt;/code&gt; inside &lt;code&gt;go/bin&lt;/code&gt; directory.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Choosing the Go Version&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When you execute a shim, &lt;code&gt;goenv&lt;/code&gt; determines which Go version to use by reading it from the following sources, in this order:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The first &lt;code&gt;.go-version&lt;/code&gt;file found by searching the current working directory and each of its parent directories until reaching the root of your filesystem. You can modify the &lt;code&gt;.go-version&lt;/code&gt; file in the current working directory with the &lt;code&gt;goenv local x.x.x&lt;/code&gt; command.&lt;/li&gt;
&lt;li&gt;The global &lt;code&gt;$HOME/.goenv/.go-version&lt;/code&gt; file. You can modify this file using the &lt;code&gt;goenv global x.x.x&lt;/code&gt; command.&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>go</category>
      <category>programming</category>
      <category>rbenv</category>
      <category>cli</category>
    </item>
    <item>
      <title>Getting Started With Apache Kafka and Java</title>
      <dc:creator>Clivern</dc:creator>
      <pubDate>Thu, 01 Jul 2021 14:12:46 +0000</pubDate>
      <link>https://dev.to/clivern/getting-started-with-apache-kafka-and-java-40p5</link>
      <guid>https://dev.to/clivern/getting-started-with-apache-kafka-and-java-40p5</guid>
      <description>&lt;h2&gt;
  
  
  Installation
&lt;/h2&gt;

&lt;p&gt;To add a dependency using Maven, use the following:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;com.clivern&lt;span class="nt"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;kafka-sdk&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;version&amp;gt;&lt;/span&gt;0.1.0&lt;span class="nt"&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To add a dependency using Gradle, use the following:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dependencies {
    compile 'com.clivern:kafka-sdk:0.1.0'
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To add a dependency using Scala SBT, use the following:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;libraryDependencies += "com.clivern" % "kafka-sdk" % "0.1.0"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To Create a Kafka Topic:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.util.HashMap&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;com.clivern.kafka.Configs&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;com.clivern.kafka.Utils&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;


&lt;span class="nc"&gt;HashMap&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;map&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;HashMap&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;();&lt;/span&gt;
&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"bootstrap.servers"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"localhost:9092"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="nc"&gt;Utils&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;createTopic&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"clivern"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Configs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;fromMap&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Kafka Producer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;com.clivern.kafka.Configs&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;com.clivern.kafka.Producer&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;com.clivern.kafka.Kafka&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.apache.kafka.clients.producer.ProducerConfig&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.apache.kafka.clients.producer.ProducerRecord&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.apache.kafka.common.serialization.StringSerializer&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;


&lt;span class="nc"&gt;Configs&lt;/span&gt; &lt;span class="n"&gt;configs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Configs&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;span class="n"&gt;configs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;ProducerConfig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;BOOTSTRAP_SERVERS_CONFIG&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"localhost:9092"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;configs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;ProducerConfig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;KEY_SERIALIZER_CLASS_CONFIG&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;StringSerializer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;configs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;ProducerConfig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;VALUE_SERIALIZER_CLASS_CONFIG&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;StringSerializer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

&lt;span class="nc"&gt;Producer&lt;/span&gt; &lt;span class="n"&gt;producer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Kafka&lt;/span&gt;&lt;span class="o"&gt;()).&lt;/span&gt;&lt;span class="na"&gt;newProducer&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;configs&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;ProducerRecord&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;record&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
            &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ProducerRecord&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;gt;(&lt;/span&gt;&lt;span class="s"&gt;"clivern"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Hello World "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

    &lt;span class="n"&gt;producer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;send&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;record&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;flush&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;producer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;close&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Kafka Consumer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;com.clivern.kafka.Configs&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;com.clivern.kafka.Consumer&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;com.clivern.kafka.Kafka&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;com.clivern.kafka.HandlerCallbackInterface&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;com.clivern.kafka.FailureCallbackInterface&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;com.clivern.kafka.SuccessCallbackInterface&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;com.clivern.kafka.exception.MissingHandler&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.apache.kafka.clients.consumer.ConsumerConfig&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.apache.kafka.common.serialization.StringDeserializer&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.apache.kafka.clients.consumer.ConsumerRecord&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;


&lt;span class="nc"&gt;Configs&lt;/span&gt; &lt;span class="n"&gt;configs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Configs&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;span class="n"&gt;configs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;ConsumerConfig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;BOOTSTRAP_SERVERS_CONFIG&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"localhost:9092"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;configs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;ConsumerConfig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;GROUP_ID_CONFIG&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"clivern"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;configs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;ConsumerConfig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;KEY_DESERIALIZER_CLASS_CONFIG&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;StringDeserializer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;configs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;ConsumerConfig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;VALUE_DESERIALIZER_CLASS_CONFIG&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;StringDeserializer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;configs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;ConsumerConfig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;AUTO_OFFSET_RESET_CONFIG&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"earliest"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;configs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;ConsumerConfig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ENABLE_AUTO_COMMIT_CONFIG&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

&lt;span class="nc"&gt;Consumer&lt;/span&gt; &lt;span class="n"&gt;consumer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Kafka&lt;/span&gt;&lt;span class="o"&gt;()).&lt;/span&gt;&lt;span class="na"&gt;newConsumer&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;configs&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

&lt;span class="nc"&gt;HandlerCallbackInterface&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;ConsumerRecord&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;handler&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
        &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;record&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Message Received: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;record&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;

            &lt;span class="c1"&gt;// Throw error if message has error&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;record&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;equals&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"error"&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Exception&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Error!"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
            &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="o"&gt;};&lt;/span&gt;

&lt;span class="nc"&gt;SuccessCallbackInterface&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;ConsumerRecord&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;onSuccess&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
        &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;record&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Message Succeeded: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;record&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
        &lt;span class="o"&gt;};&lt;/span&gt;

&lt;span class="nc"&gt;FailureCallbackInterface&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;ConsumerRecord&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;onFailure&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
        &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;record&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;exception&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
                    &lt;span class="s"&gt;"Message "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;record&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;" Failed: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;exception&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getMessage&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
        &lt;span class="o"&gt;};&lt;/span&gt;

&lt;span class="n"&gt;consumer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;subscribe&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"clivern"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;handler&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;handler&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;onSuccess&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;onSuccess&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;onFailure&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;onFailure&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Please don't forget to replace &lt;code&gt;localhost&lt;/code&gt; with kafka host.&lt;/p&gt;

&lt;p&gt;For starters, don't miss this tutorial &lt;a href="https://dev.to/clivern/getting-started-with-kafka-3mbi"&gt;https://dev.to/clivern/getting-started-with-kafka-3mbi&lt;/a&gt;&lt;/p&gt;

</description>
      <category>microservices</category>
      <category>docker</category>
      <category>kafka</category>
      <category>java</category>
    </item>
    <item>
      <title>Getting Started With Apache Kafka</title>
      <dc:creator>Clivern</dc:creator>
      <pubDate>Fri, 18 Jun 2021 23:06:54 +0000</pubDate>
      <link>https://dev.to/clivern/getting-started-with-kafka-3mbi</link>
      <guid>https://dev.to/clivern/getting-started-with-kafka-3mbi</guid>
      <description>&lt;p&gt;Apache Kafka is an open-source distributed event streaming platform used by thousands of companies for high-performance data pipelines, streaming analytics, data integration, and mission-critical applications.&lt;/p&gt;

&lt;p&gt;Let's first run a single kafka node with docker and docker-compose.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create a docker-compose.yaml file
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;3'&lt;/span&gt;

&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;zookeeper&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;confluentinc/cp-zookeeper:6.1.1&lt;/span&gt;
    &lt;span class="na"&gt;hostname&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;zookeeper&lt;/span&gt;
    &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;zookeeper&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2181:2181"&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;ZOOKEEPER_CLIENT_PORT&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2181&lt;/span&gt;
      &lt;span class="na"&gt;ZOOKEEPER_TICK_TIME&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2000&lt;/span&gt;

  &lt;span class="na"&gt;broker&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;confluentinc/cp-server:6.1.1&lt;/span&gt;
    &lt;span class="na"&gt;hostname&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;broker&lt;/span&gt;
    &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;broker&lt;/span&gt;
    &lt;span class="na"&gt;depends_on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;zookeeper&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;9092:9092"&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;9101:9101"&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;KAFKA_BROKER_ID&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
      &lt;span class="na"&gt;KAFKA_ZOOKEEPER_CONNECT&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;zookeeper:2181'&lt;/span&gt;
      &lt;span class="na"&gt;KAFKA_LISTENER_SECURITY_PROTOCOL_MAP&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT&lt;/span&gt;
      &lt;span class="na"&gt;KAFKA_ADVERTISED_LISTENERS&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;PLAINTEXT://broker:29092,PLAINTEXT_HOST://localhost:9092&lt;/span&gt;
      &lt;span class="na"&gt;KAFKA_METRIC_REPORTERS&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;io.confluent.metrics.reporter.ConfluentMetricsReporter&lt;/span&gt;
      &lt;span class="na"&gt;KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
      &lt;span class="na"&gt;KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;
      &lt;span class="na"&gt;KAFKA_CONFLUENT_LICENSE_TOPIC_REPLICATION_FACTOR&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
      &lt;span class="na"&gt;KAFKA_CONFLUENT_BALANCER_TOPIC_REPLICATION_FACTOR&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
      &lt;span class="na"&gt;KAFKA_TRANSACTION_STATE_LOG_MIN_ISR&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
      &lt;span class="na"&gt;KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
      &lt;span class="na"&gt;KAFKA_JMX_PORT&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;9101&lt;/span&gt;
      &lt;span class="na"&gt;KAFKA_JMX_HOSTNAME&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;localhost&lt;/span&gt;
      &lt;span class="na"&gt;CONFLUENT_METRICS_REPORTER_BOOTSTRAP_SERVERS&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;broker:29092&lt;/span&gt;
      &lt;span class="na"&gt;CONFLUENT_METRICS_REPORTER_TOPIC_REPLICAS&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
      &lt;span class="na"&gt;CONFLUENT_METRICS_ENABLE&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;true'&lt;/span&gt;
      &lt;span class="na"&gt;CONFLUENT_SUPPORT_CUSTOMER_ID&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;anonymous'&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;After installing docker and docker-compose, Start kafka and zookeeper containers with the following command
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;docker-compose up &lt;span class="nt"&gt;-d&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Get kafka container id to run some commands inside the container.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;docker ps

&lt;span class="nv"&gt;$ &lt;/span&gt;docker &lt;span class="nb"&gt;exec&lt;/span&gt; &lt;span class="nt"&gt;-it&lt;/span&gt; &lt;span class="nv"&gt;$ID&lt;/span&gt; bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To create a kafka topic &lt;code&gt;clivern&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /bin
&lt;span class="nv"&gt;$ &lt;/span&gt;kafka-topics &lt;span class="nt"&gt;--create&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--bootstrap-server&lt;/span&gt; localhost:9092 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--topic&lt;/span&gt; clivern
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To run a consumer&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /bin
&lt;span class="nv"&gt;$ &lt;/span&gt;kafka-console-consumer &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--bootstrap-server&lt;/span&gt; localhost:9092 &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--topic&lt;/span&gt; clivern
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To run a producer&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /bin
&lt;span class="nv"&gt;$ &lt;/span&gt;kafka-console-producer &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--bootstrap-server&lt;/span&gt; localhost:9092 &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--topic&lt;/span&gt; clivern
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To list all topics&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /bin
&lt;span class="nv"&gt;$ &lt;/span&gt;kafka-topics &lt;span class="nt"&gt;--bootstrap-server&lt;/span&gt; localhost:9092 &lt;span class="nt"&gt;--list&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>microservices</category>
      <category>kafka</category>
      <category>broker</category>
      <category>docker</category>
    </item>
    <item>
      <title>Getting Started with Hashicorp Nomad</title>
      <dc:creator>Clivern</dc:creator>
      <pubDate>Thu, 13 May 2021 13:46:56 +0000</pubDate>
      <link>https://dev.to/clivern/getting-started-with-hashicorp-nomad-58a2</link>
      <guid>https://dev.to/clivern/getting-started-with-hashicorp-nomad-58a2</guid>
      <description>&lt;h4&gt;
  
  
  Basic Setup (Not Recommended):
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Download nomad binary &amp;amp; make it executable:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;wget https://releases.hashicorp.com/nomad/1.0.5/nomad_1.0.5_linux_amd64.zip
&lt;span class="nv"&gt;$ &lt;/span&gt;unzip nomad_1.0.5_linux_amd64.zip
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;mv &lt;/span&gt;nomad /usr/local/bin/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Create configs directory &amp;amp; data directory:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo mkdir&lt;/span&gt; &lt;span class="nt"&gt;--parents&lt;/span&gt; /opt/nomad
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo mkdir&lt;/span&gt; &lt;span class="nt"&gt;--parents&lt;/span&gt; /opt/data/redis
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo mkdir&lt;/span&gt; &lt;span class="nt"&gt;--parents&lt;/span&gt; /etc/nomad.d
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo chmod &lt;/span&gt;700 /etc/nomad.d
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo chmod &lt;/span&gt;700 /opt/data

&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo touch&lt;/span&gt; /etc/nomad.d/nomad.hcl
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo touch&lt;/span&gt; /etc/nomad.d/server.hcl
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo touch&lt;/span&gt; /etc/nomad.d/client.hcl
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Add this configuration to the &lt;code&gt;/etc/nomad.d/nomad.hcl&lt;/code&gt; configuration file
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;datacenter &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"dc1"&lt;/span&gt;
data_dir &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"/opt/nomad"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Add this configuration to the &lt;code&gt;/etc/nomad.d/client.hcl&lt;/code&gt; configuration file
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hcl"&gt;&lt;code&gt;&lt;span class="nx"&gt;client&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;enabled&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;

  &lt;span class="nx"&gt;host_volume&lt;/span&gt; &lt;span class="s2"&gt;"redis_data"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;path&lt;/span&gt;      &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"/opt/data/redis"&lt;/span&gt;
    &lt;span class="nx"&gt;read_only&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;plugin&lt;/span&gt; &lt;span class="s2"&gt;"docker"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;config&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;volumes&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;enabled&lt;/span&gt;      &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
      &lt;span class="nx"&gt;selinuxlabel&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"z"&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Add this configuration to the &lt;code&gt;/etc/nomad.d/server.hcl&lt;/code&gt; configuration file
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hcl"&gt;&lt;code&gt;&lt;span class="nx"&gt;acl&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;enabled&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nx"&gt;server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;enabled&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
  &lt;span class="nx"&gt;bootstrap_expect&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Create a nomad service file
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo touch&lt;/span&gt; /etc/systemd/system/nomad.service
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Add this configuration to the nomad service file &lt;code&gt;/etc/systemd/system/nomad.service&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;[&lt;/span&gt;Unit]
&lt;span class="nv"&gt;Description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;Nomad
&lt;span class="nv"&gt;Documentation&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;https://nomadproject.io/docs/

&lt;span class="o"&gt;[&lt;/span&gt;Service]
&lt;span class="nv"&gt;ExecStart&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/usr/local/bin/nomad agent &lt;span class="nt"&gt;-config&lt;/span&gt; /etc/nomad.d
&lt;span class="nv"&gt;Restart&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;on-failure
&lt;span class="nv"&gt;RestartSec&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;2

&lt;span class="o"&gt;[&lt;/span&gt;Install]
&lt;span class="nv"&gt;WantedBy&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;multi-user.target
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Start nomad
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;nomad
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl start nomad
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl status nomad
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Genertal ACL secrets
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;nomad acl bootstrap
Accessor ID  &lt;span class="o"&gt;=&lt;/span&gt; a8b724ef-b5eb-21c0-1a68-b0d3616e1e62
Secret ID    &lt;span class="o"&gt;=&lt;/span&gt; 07fe0ee6-59bc-8ea0-aeeb-9b4e9edcb555
Name         &lt;span class="o"&gt;=&lt;/span&gt; Bootstrap Token
Type         &lt;span class="o"&gt;=&lt;/span&gt; management
Global       &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;true
&lt;/span&gt;Policies     &lt;span class="o"&gt;=&lt;/span&gt; n/a
Create Time  &lt;span class="o"&gt;=&lt;/span&gt; 2021-05-10 21:05:21.498072284 +0000 UTC
Create Index &lt;span class="o"&gt;=&lt;/span&gt; 10
Modify Index &lt;span class="o"&gt;=&lt;/span&gt; 10

&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;NOMAD_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;07fe0ee6-59bc-8ea0-aeeb-9b4e9edcb555
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Create your first job to deploy a stateless container from the server ui &lt;code&gt;http://127.0.0.1:4646/ui&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hcl"&gt;&lt;code&gt;&lt;span class="nx"&gt;job&lt;/span&gt; &lt;span class="s2"&gt;"api"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;datacenters&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"dc1"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

  &lt;span class="nx"&gt;group&lt;/span&gt; &lt;span class="s2"&gt;"example"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;task&lt;/span&gt; &lt;span class="s2"&gt;"server"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;driver&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"docker"&lt;/span&gt;

      &lt;span class="nx"&gt;config&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;image&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"hashicorp/http-echo:0.2.1"&lt;/span&gt;

        &lt;span class="nx"&gt;args&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
          &lt;span class="s2"&gt;"-listen"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;":5678"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"-text"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"hello world"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;]&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;

      &lt;span class="nx"&gt;resources&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;network&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="nx"&gt;mbits&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;

          &lt;span class="nx"&gt;port&lt;/span&gt; &lt;span class="s2"&gt;"http"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nx"&gt;static&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"5678"&lt;/span&gt;
          &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;And another one for stateful container
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hcl"&gt;&lt;code&gt;&lt;span class="nx"&gt;job&lt;/span&gt; &lt;span class="s2"&gt;"cache"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;datacenters&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"dc1"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

  &lt;span class="nx"&gt;group&lt;/span&gt; &lt;span class="s2"&gt;"redis"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="nx"&gt;volume&lt;/span&gt; &lt;span class="s2"&gt;"redis_data"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;type&lt;/span&gt;      &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"host"&lt;/span&gt;
      &lt;span class="nx"&gt;read_only&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
      &lt;span class="nx"&gt;source&lt;/span&gt;    &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"redis_data"&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nx"&gt;task&lt;/span&gt; &lt;span class="s2"&gt;"server"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;driver&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"docker"&lt;/span&gt;

      &lt;span class="nx"&gt;volume_mount&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;volume&lt;/span&gt;      &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"redis_data"&lt;/span&gt;
        &lt;span class="nx"&gt;destination&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"/data"&lt;/span&gt;
        &lt;span class="nx"&gt;read_only&lt;/span&gt;   &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;

      &lt;span class="nx"&gt;config&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;image&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"redis:4-alpine"&lt;/span&gt;

        &lt;span class="nx"&gt;labels&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"sh.hippo.service"&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"redis"&lt;/span&gt;
          &lt;span class="s2"&gt;"sh.hippo.service_type"&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"cache"&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="nx"&gt;port_map&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="nx"&gt;http&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;6379&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="nx"&gt;command&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"redis-server"&lt;/span&gt;

        &lt;span class="nx"&gt;args&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
          &lt;span class="s2"&gt;"--requirepass"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"mystery"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;]&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;

      &lt;span class="nx"&gt;env&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;HEALTHY_FOR&lt;/span&gt;    &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;-1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;

      &lt;span class="nx"&gt;resources&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;cpu&lt;/span&gt;    &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;
        &lt;span class="nx"&gt;memory&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;256&lt;/span&gt;

        &lt;span class="nx"&gt;network&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="nx"&gt;mbits&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;

          &lt;span class="nx"&gt;port&lt;/span&gt; &lt;span class="s2"&gt;"http"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nx"&gt;static&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"6379"&lt;/span&gt;
          &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Multi Nodes Setup (Recommended):
&lt;/h4&gt;

&lt;p&gt;To fully understand how nomad cluster should look like, please &lt;a href="https://www.nomadproject.io/docs/internals/architecture#high-level-overview"&gt;check this guide!&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Assuming we have two servers, one for the nomad server (Leader) and another for the client. Both servers are in &lt;code&gt;DC1&lt;/code&gt;. The leader server has public IP &lt;code&gt;$SERVER_PUBLIC_IP&lt;/code&gt; and private IP &lt;code&gt;$SERVER_PRIVATE_IP&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;First we run the leader or the nomad server by following the next steps:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Download nomad binary &amp;amp; make it executable:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;wget https://releases.hashicorp.com/nomad/1.0.5/nomad_1.0.5_linux_amd64.zip
&lt;span class="nv"&gt;$ &lt;/span&gt;unzip nomad_1.0.5_linux_amd64.zip
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;mv &lt;/span&gt;nomad /usr/local/bin/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Create configs directory &amp;amp; data directory:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo mkdir&lt;/span&gt; &lt;span class="nt"&gt;--parents&lt;/span&gt; /opt/nomad
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo mkdir&lt;/span&gt; &lt;span class="nt"&gt;--parents&lt;/span&gt; /opt/data/redis
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo mkdir&lt;/span&gt; &lt;span class="nt"&gt;--parents&lt;/span&gt; /etc/nomad.d
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo chmod &lt;/span&gt;700 /etc/nomad.d
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo chmod &lt;/span&gt;700 /opt/data

&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo touch&lt;/span&gt; /etc/nomad.d/nomad.hcl
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo touch&lt;/span&gt; /etc/nomad.d/server.hcl
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Add this configuration to the &lt;code&gt;/etc/nomad.d/nomad.hcl&lt;/code&gt; configuration file
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;datacenter &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"dc1"&lt;/span&gt;
data_dir &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"/opt/nomad"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Add this configuration to the &lt;code&gt;/etc/nomad.d/server.hcl&lt;/code&gt; configuration file
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hcl"&gt;&lt;code&gt;&lt;span class="nx"&gt;acl&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;enabled&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;enabled&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
  &lt;span class="nx"&gt;bootstrap_expect&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;bind_addr&lt;/span&gt; &lt;span class="err"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"$SERVER_PUBLIC_IP"&lt;/span&gt;

&lt;span class="nx"&gt;addresses&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;http&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"$SERVER_PUBLIC_IP"&lt;/span&gt;
  &lt;span class="nx"&gt;rpc&lt;/span&gt;  &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"$SERVER_PRIVATE_IP"&lt;/span&gt;
  &lt;span class="nx"&gt;serf&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"$SERVER_PRIVATE_IP"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;advertise&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;http&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"$SERVER_PUBLIC_IP:4646"&lt;/span&gt;
  &lt;span class="nx"&gt;rpc&lt;/span&gt;  &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"$SERVER_PRIVATE_IP:4647"&lt;/span&gt;
  &lt;span class="nx"&gt;serf&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"$SERVER_PRIVATE_IP:4648"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Create a nomad service file
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo touch&lt;/span&gt; /etc/systemd/system/nomad.service
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Add this configuration to the nomad service file &lt;code&gt;/etc/systemd/system/nomad.service&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;[&lt;/span&gt;Unit]
&lt;span class="nv"&gt;Description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;Nomad
&lt;span class="nv"&gt;Documentation&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;https://nomadproject.io/docs/

&lt;span class="o"&gt;[&lt;/span&gt;Service]
&lt;span class="nv"&gt;ExecStart&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/usr/local/bin/nomad agent &lt;span class="nt"&gt;-config&lt;/span&gt; /etc/nomad.d
&lt;span class="nv"&gt;Restart&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;on-failure
&lt;span class="nv"&gt;RestartSec&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;2

&lt;span class="o"&gt;[&lt;/span&gt;Install]
&lt;span class="nv"&gt;WantedBy&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;multi-user.target
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Start nomad
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;nomad
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl start nomad
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl status nomad
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Genertal ACL secrets
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;nomad acl bootstrap &lt;span class="nt"&gt;-address&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://&lt;span class="nv"&gt;$SERVER_PUBLIC_IP&lt;/span&gt;:4646
Accessor ID  &lt;span class="o"&gt;=&lt;/span&gt; a8b724ef-b5eb-21c0-1a68-b0d3616e1e62
Secret ID    &lt;span class="o"&gt;=&lt;/span&gt; 07fe0ee6-59bc-8ea0-aeeb-9b4e9edcb555
Name         &lt;span class="o"&gt;=&lt;/span&gt; Bootstrap Token
Type         &lt;span class="o"&gt;=&lt;/span&gt; management
Global       &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;true
&lt;/span&gt;Policies     &lt;span class="o"&gt;=&lt;/span&gt; n/a
Create Time  &lt;span class="o"&gt;=&lt;/span&gt; 2021-05-10 21:05:21.498072284 +0000 UTC
Create Index &lt;span class="o"&gt;=&lt;/span&gt; 10
Modify Index &lt;span class="o"&gt;=&lt;/span&gt; 10

&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;NOMAD_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;07fe0ee6-59bc-8ea0-aeeb-9b4e9edcb555
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then we run the client by following the next steps:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Download nomad binary &amp;amp; make it executable:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;wget https://releases.hashicorp.com/nomad/1.0.5/nomad_1.0.5_linux_amd64.zip
&lt;span class="nv"&gt;$ &lt;/span&gt;unzip nomad_1.0.5_linux_amd64.zip
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;mv &lt;/span&gt;nomad /usr/local/bin/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Create configs directory &amp;amp; data directory:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo mkdir&lt;/span&gt; &lt;span class="nt"&gt;--parents&lt;/span&gt; /opt/nomad
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo mkdir&lt;/span&gt; &lt;span class="nt"&gt;--parents&lt;/span&gt; /opt/data/redis
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo mkdir&lt;/span&gt; &lt;span class="nt"&gt;--parents&lt;/span&gt; /etc/nomad.d
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo chmod &lt;/span&gt;700 /etc/nomad.d
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo chmod &lt;/span&gt;700 /opt/data

&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo touch&lt;/span&gt; /etc/nomad.d/nomad.hcl
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo touch&lt;/span&gt; /etc/nomad.d/client.hcl
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Add this configuration to the &lt;code&gt;/etc/nomad.d/nomad.hcl&lt;/code&gt; configuration file
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;datacenter &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"dc1"&lt;/span&gt;
data_dir &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"/opt/nomad"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Add this configuration to the &lt;code&gt;/etc/nomad.d/client.hcl&lt;/code&gt; configuration file
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hcl"&gt;&lt;code&gt;&lt;span class="nx"&gt;client&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;enabled&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;

  &lt;span class="nx"&gt;servers&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"$SERVER_PRIVATE_IP:4647"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

  &lt;span class="nx"&gt;host_volume&lt;/span&gt; &lt;span class="s2"&gt;"redis_data"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;path&lt;/span&gt;      &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"/opt/data/redis"&lt;/span&gt;
    &lt;span class="nx"&gt;read_only&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;plugin&lt;/span&gt; &lt;span class="s2"&gt;"docker"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;config&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;volumes&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;enabled&lt;/span&gt;      &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
      &lt;span class="nx"&gt;selinuxlabel&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"z"&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Create a nomad service file
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo touch&lt;/span&gt; /etc/systemd/system/nomad.service
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Add this configuration to the nomad service file &lt;code&gt;/etc/systemd/system/nomad.service&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;[&lt;/span&gt;Unit]
&lt;span class="nv"&gt;Description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;Nomad
&lt;span class="nv"&gt;Documentation&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;https://nomadproject.io/docs/

&lt;span class="o"&gt;[&lt;/span&gt;Service]
&lt;span class="nv"&gt;ExecStart&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/usr/local/bin/nomad agent &lt;span class="nt"&gt;-config&lt;/span&gt; /etc/nomad.d
&lt;span class="nv"&gt;Restart&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;on-failure
&lt;span class="nv"&gt;RestartSec&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;2

&lt;span class="o"&gt;[&lt;/span&gt;Install]
&lt;span class="nv"&gt;WantedBy&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;multi-user.target
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Start nomad
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;nomad
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl start nomad
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl status nomad
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  CNI Plugins in Nomad
&lt;/h4&gt;

&lt;p&gt;Nomad uses CNI plugins when bridge networking is used. To install CNI plugins:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;curl &lt;span class="nt"&gt;-L&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; cni-plugins.tgz https://github.com/containernetworking/plugins/releases/download/v0.8.0/cni-plugins-linux-amd64-v0.8.0.tgz
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; /opt/cni/bin
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;tar&lt;/span&gt; &lt;span class="nt"&gt;-C&lt;/span&gt; /opt/cni/bin &lt;span class="nt"&gt;-xzf&lt;/span&gt; cni-plugins.tgz
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hcl"&gt;&lt;code&gt;&lt;span class="nx"&gt;job&lt;/span&gt; &lt;span class="s2"&gt;"clivern"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;datacenters&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"dc1"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

  &lt;span class="nx"&gt;group&lt;/span&gt; &lt;span class="s2"&gt;"services"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="nx"&gt;network&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

      &lt;span class="nx"&gt;port&lt;/span&gt; &lt;span class="s2"&gt;"toad0_srv"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;static&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;8080&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;

      &lt;span class="nx"&gt;port&lt;/span&gt; &lt;span class="s2"&gt;"toad1_srv"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;static&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;8081&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nx"&gt;task&lt;/span&gt; &lt;span class="s2"&gt;"toad0"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;driver&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"docker"&lt;/span&gt;

      &lt;span class="nx"&gt;config&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;image&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"clivern/toad:release-0.2.4"&lt;/span&gt;

        &lt;span class="nx"&gt;labels&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"com.clivern.service"&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"toad"&lt;/span&gt;
          &lt;span class="s2"&gt;"com.clivern.service_type"&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"web"&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="nx"&gt;ports&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"toad0_srv"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

        &lt;span class="nx"&gt;command&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"./toad"&lt;/span&gt;

        &lt;span class="nx"&gt;args&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
          &lt;span class="s2"&gt;"--port"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"${NOMAD_PORT_toad0_srv}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;]&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;

      &lt;span class="nx"&gt;env&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;IS_STATEFUL&lt;/span&gt;    &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"false"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nx"&gt;TOAD0_ADDR&lt;/span&gt;     &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"${NOMAD_HOST_ADDR_toad0_srv}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nx"&gt;TOAD1_ADDR&lt;/span&gt;     &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"${NOMAD_HOST_ADDR_toad1_srv}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;

      &lt;span class="nx"&gt;resources&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;network&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="nx"&gt;mbits&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nx"&gt;task&lt;/span&gt; &lt;span class="s2"&gt;"toad1"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;driver&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"docker"&lt;/span&gt;

      &lt;span class="nx"&gt;config&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;image&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"clivern/toad:release-0.2.3"&lt;/span&gt;

        &lt;span class="nx"&gt;labels&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"com.clivern.service"&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"toad"&lt;/span&gt;
          &lt;span class="s2"&gt;"com.clivern.service_type"&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"web"&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="nx"&gt;ports&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"toad1_srv"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

        &lt;span class="nx"&gt;command&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"./toad"&lt;/span&gt;

        &lt;span class="nx"&gt;args&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
          &lt;span class="s2"&gt;"--port"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"${NOMAD_PORT_toad1_srv}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;]&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;

      &lt;span class="nx"&gt;env&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;IS_STATEFUL&lt;/span&gt;    &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"false"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nx"&gt;TOAD0_ADDR&lt;/span&gt;     &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"${NOMAD_HOST_ADDR_toad0_srv}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nx"&gt;TOAD1_ADDR&lt;/span&gt;     &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"${NOMAD_HOST_ADDR_toad1_srv}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;

      &lt;span class="nx"&gt;resources&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;network&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="nx"&gt;mbits&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  References:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.nomadproject.io/docs"&gt;Nomad Docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.hashicorp.com/collections/nomad/get-started"&gt;Learn Nomad&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>docker</category>
      <category>devops</category>
      <category>microservices</category>
      <category>kubernetes</category>
    </item>
    <item>
      <title>How to Backup your Applications Data to S3 with Walrus</title>
      <dc:creator>Clivern</dc:creator>
      <pubDate>Sat, 13 Feb 2021 13:59:47 +0000</pubDate>
      <link>https://dev.to/clivern/how-to-backup-your-applications-data-to-s3-with-walrus-4l2o</link>
      <guid>https://dev.to/clivern/how-to-backup-your-applications-data-to-s3-with-walrus-4l2o</guid>
      <description>&lt;p&gt;👋 there!&lt;/p&gt;

&lt;p&gt;I have been working lately to build a reliable and lightweight system for automated backups. Finally it is released 2 weeks ago 🚀&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--A9-wwsHG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/Clivern"&gt;
        Clivern
      &lt;/a&gt; / &lt;a href="https://github.com/Clivern/Walrus"&gt;
        Walrus
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      🔥 Fast, Secure and Reliable System Backup, Set up in Minutes.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;p&gt;
    &lt;a rel="noopener noreferrer nofollow" href="https://raw.githubusercontent.com/Clivern/Walrus/main/static/gopher.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Nt7om6gU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://raw.githubusercontent.com/Clivern/Walrus/main/static/gopher.png" width="230"&gt;&lt;/a&gt;
    &lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Walrus&lt;/h3&gt;
&lt;/div&gt;
    &lt;p&gt;Fast, Secure and Reliable System Backup, Set up in Minutes.&lt;/p&gt;
    &lt;p&gt;
        &lt;a href="https://github.com/Clivern/Walrus/actions/workflows/api.yml"&gt;
            &lt;img src="https://github.com/Clivern/Walrus/actions/workflows/api.yml/badge.svg"&gt;
        &lt;/a&gt;
        &lt;a href="https://github.com/Clivern/Walrus/actions/workflows/ui.yml"&gt;
            &lt;img src="https://github.com/Clivern/Walrus/actions/workflows/ui.yml/badge.svg"&gt;
        &lt;/a&gt;
        &lt;a href="https://github.com/Clivern/Walrus/actions"&gt;
            &lt;img src="https://github.com/Clivern/Walrus/workflows/Release/badge.svg"&gt;
        &lt;/a&gt;
        &lt;a href="https://github.com/Clivern/Walrus/releases"&gt;
            &lt;img src="https://camo.githubusercontent.com/2788d105fa46d0b0d30847722525226c292cb0cc8e8752191c5258ba5db5f654/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f56657273696f6e2d312e322e362d7265642e737667"&gt;
        &lt;/a&gt;
        &lt;a href="https://goreportcard.com/report/github.com/Clivern/Walrus" rel="nofollow"&gt;
            &lt;img src="https://camo.githubusercontent.com/046fc039db13e56ea00204a5d8bd85d9f95d4e48078f19a859e93d36d7fb3fe8/68747470733a2f2f676f7265706f7274636172642e636f6d2f62616467652f6769746875622e636f6d2f436c697665726e2f57616c7275733f763d312e322e36"&gt;
        &lt;/a&gt;
        &lt;a href="https://godoc.org/github.com/clivern/walrus" rel="nofollow"&gt;
            &lt;img src="https://camo.githubusercontent.com/6b327db5ff55665ff745d70942eaf78730b67afca499e9f03dd1c24072992b01/68747470733a2f2f676f646f632e6f72672f6769746875622e636f6d2f636c697665726e2f77616c7275733f7374617475732e737667"&gt;
        &lt;/a&gt;
        &lt;a href="https://hub.docker.com/r/clivern/walrus" rel="nofollow"&gt;
            &lt;img src="https://camo.githubusercontent.com/1dd5dc81e3b2074cf5782ff11360b054e737af4998ba3c4e2aeb3772a31d09d2/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f446f636b65722d4c61746573742d677265656e"&gt;
        &lt;/a&gt;
        &lt;a href="https://github.com/Clivern/Walrus/blob/master/LICENSE"&gt;
            &lt;img src="https://camo.githubusercontent.com/2dd8a038b3ce943b516fc1e3698631cfe9e832a41908c1251ad492e445cd4a9b/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c4943454e53452d4d49542d6f72616e67652e737667"&gt;
        &lt;/a&gt;
    &lt;/p&gt;
&lt;br&gt;
&lt;p&gt;
    &lt;a rel="noopener noreferrer nofollow" href="https://raw.githubusercontent.com/Clivern/Walrus/main/static/chart.png?v=1.2.6"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KvlcALPm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://raw.githubusercontent.com/Clivern/Walrus/main/static/chart.png%3Fv%3D1.2.6" width="80%"&gt;&lt;/a&gt;
&lt;/p&gt;


&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Dashboard Screenshots&lt;/h3&gt;
&lt;/div&gt;
    &lt;p&gt;
        &lt;a rel="noopener noreferrer nofollow" href="https://raw.githubusercontent.com/Clivern/Walrus/main/static/screenshot_02.png?v=1.2.6"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--x5CGB9tn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://raw.githubusercontent.com/Clivern/Walrus/main/static/screenshot_02.png%3Fv%3D1.2.6" width="90%"&gt;&lt;/a&gt;
        &lt;a rel="noopener noreferrer nofollow" href="https://raw.githubusercontent.com/Clivern/Walrus/main/static/screenshot_03.png?v=1.2.6"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_lFh0JDj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://raw.githubusercontent.com/Clivern/Walrus/main/static/screenshot_03.png%3Fv%3D1.2.6" width="90%"&gt;&lt;/a&gt;
    &lt;/p&gt;

&lt;p&gt;Walrus is a fast, secure and reliable backup system suitable for modern infrastructure. With walrus, you can backup services like SQLite, MySQL, PostgreSQL, Redis, etcd or a complete directory with a short interval and low overhead. It supports AWS S3, digitalocean spaces and any S3-compatible object storage service.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Documentation&lt;/h2&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Deployment&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;Download &lt;a href="https://github.com/Clivern/Walrus/releases"&gt;the latest walrus binary&lt;/a&gt;. Make it executable from everywhere.&lt;/p&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;$ &lt;span class="pl-k"&gt;export&lt;/span&gt; WALRUS_LATEST_VERSION=&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;$(&lt;/span&gt;curl --silent &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;https://api.github.com/repos/Clivern/Walrus/releases/latest&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt; &lt;span class="pl-k"&gt;|&lt;/span&gt; jq &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;'&lt;/span&gt;.tag_name&lt;span class="pl-pds"&gt;'&lt;/span&gt;&lt;/span&gt; &lt;span class="pl-k"&gt;|&lt;/span&gt; sed -E &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;'&lt;/span&gt;s/.*"([^"]+)".*/\1/&lt;span class="pl-pds"&gt;'&lt;/span&gt;&lt;/span&gt; &lt;span class="pl-k"&gt;|&lt;/span&gt; tr -d v&lt;span class="pl-pds"&gt;)&lt;/span&gt;&lt;/span&gt;

$ curl -sL https://github.com/Clivern/Walrus/releases/download/v{&lt;span class="pl-smi"&gt;$WALRUS_LATEST_VERSION&lt;/span&gt;}/walrus_{&lt;span class="pl-smi"&gt;$WALRUS_LATEST_VERSION&lt;/span&gt;}_Linux_x86_64.tar.gz &lt;span class="pl-k"&gt;|&lt;/span&gt; tar xz&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Then install etcd cluster or single node, please refer to etcd docs or bin directory inside this repository.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h4 class="heading-element"&gt;Run Walrus Tower:&lt;/h4&gt;

&lt;/div&gt;
&lt;p&gt;Create the tower configs file &lt;code&gt;tower.config.yml&lt;/code&gt; from &lt;code&gt;config.dist.yml&lt;/code&gt;. Something like the following:&lt;/p&gt;
&lt;p&gt;Please make sure to update the…&lt;/p&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Clivern/Walrus"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Walrus is a fast, secure and reliable backup system suitable for modern infrastructure. With walrus, you can backup services like SQLite, MySQL, PostgreSQL, Redis, etcd or a complete directory with a short interval and low overhead. It supports AWS S3, digitalocean spaces and any S3-compatible object storage service.&lt;/p&gt;

&lt;h2&gt;
  
  
  Deploy with Docker
&lt;/h2&gt;

&lt;p&gt;Install docker &amp;amp; docker-compose&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;apt-get update
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;docker.io
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;docker
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;docker-compose
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Clone Walrus for docker-compose.yml file&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;git clone https://github.com/Clivern/Walrus.git walrus
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;walrus/deployment/docker-compose
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Feel free to update walrus tower port, &lt;code&gt;api.key&lt;/code&gt; and &lt;code&gt;api.encryptionKey&lt;/code&gt;. make sure you also use these values in walrus agent config file since agents require the &lt;code&gt;tower URL&lt;/code&gt;, tower &lt;code&gt;API key&lt;/code&gt; and &lt;code&gt;encryptionKey&lt;/code&gt; to be able to reach and communicate with walrus tower.&lt;/p&gt;

&lt;p&gt;Run the tower and etcd. It is also recommended to run etcd anywhere where data loss is mitigated.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;docker-compose up &lt;span class="nt"&gt;-d&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now tower should be running. User your server public IP and tower port configured before to open the dashboard and setup the admin account.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# To get the public IP&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;curl https://ipinfo.io/ip
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the host where backups have to take place, download walrus binary.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;curl &lt;span class="nt"&gt;-sL&lt;/span&gt; https://github.com/Clivern/Walrus/releases/download/v0.1.6/walrus_0.1.6_Linux_x86_64.tar.gz | &lt;span class="nb"&gt;tar &lt;/span&gt;xz
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Create agent config file. Don't forget to replace &lt;code&gt;agent.tower&lt;/code&gt; configs with the &lt;code&gt;tower URL&lt;/code&gt;, &lt;code&gt;apiKey&lt;/code&gt; and &lt;code&gt;encryptionKey&lt;/code&gt;, you can get these values from tower configs you created earlier.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Agent configs&lt;/span&gt;
&lt;span class="na"&gt;agent&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="c1"&gt;# Env mode (dev or prod)&lt;/span&gt;
    &lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${WALRUS_APP_MODE:-prod}&lt;/span&gt;
    &lt;span class="c1"&gt;# HTTP port&lt;/span&gt;
    &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${WALRUS_API_PORT:-8001}&lt;/span&gt;
    &lt;span class="c1"&gt;# URL&lt;/span&gt;
    &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${WALRUS_API_URL:-http://127.0.0.1:8001}&lt;/span&gt;
    &lt;span class="c1"&gt;# TLS configs&lt;/span&gt;
    &lt;span class="na"&gt;tls&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${WALRUS_API_TLS_STATUS:-off}&lt;/span&gt;
        &lt;span class="na"&gt;pemPath&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${WALRUS_API_TLS_PEMPATH:-cert/server.pem}&lt;/span&gt;
        &lt;span class="na"&gt;keyPath&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${WALRUS_API_TLS_KEYPATH:-cert/server.key}&lt;/span&gt;

    &lt;span class="c1"&gt;# API Configs&lt;/span&gt;
    &lt;span class="na"&gt;api&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${WALRUS_API_KEY:-56e1a911-cc64-44af-9c5d-8c7e72ec96a1}&lt;/span&gt;

    &lt;span class="c1"&gt;# Async Workers&lt;/span&gt;
    &lt;span class="na"&gt;workers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;# Queue max capacity&lt;/span&gt;
        &lt;span class="na"&gt;buffer&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${WALRUS_WORKERS_CHAN_CAPACITY:-5000}&lt;/span&gt;
        &lt;span class="c1"&gt;# Number of concurrent workers&lt;/span&gt;
        &lt;span class="na"&gt;count&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${WALRUS_WORKERS_COUNT:-4}&lt;/span&gt;

    &lt;span class="c1"&gt;# Tower Configs&lt;/span&gt;
    &lt;span class="na"&gt;tower&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${WALRUS_TOWER_URL:-http://127.0.0.1:8000}&lt;/span&gt;
        &lt;span class="c1"&gt;# This must match the one defined in tower config file&lt;/span&gt;
        &lt;span class="na"&gt;apiKey&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${WALRUS_TOWER_API_KEY:-6c68b836-6f8e-465e-b59f-89c1db53afca}&lt;/span&gt;
        &lt;span class="c1"&gt;# This must match the one defined in tower config file&lt;/span&gt;
        &lt;span class="na"&gt;encryptionKey&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${WALRUS_ENCRYPTION_KEY:-B?E(H+Mb}&lt;/span&gt;
        &lt;span class="c1"&gt;# Time interval between agent ping checks&lt;/span&gt;
        &lt;span class="na"&gt;pingInterval&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${WALRUS_CHECK_INTERVAL:-60}&lt;/span&gt;

    &lt;span class="c1"&gt;# Backup settings&lt;/span&gt;
    &lt;span class="na"&gt;backup&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;tmpDir&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${WALRUS_BACKUP_TMP_DIR:-/tmp}&lt;/span&gt;

    &lt;span class="c1"&gt;# Log configs&lt;/span&gt;
    &lt;span class="na"&gt;log&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;# Log level, it can be debug, info, warn, error, panic, fatal&lt;/span&gt;
        &lt;span class="na"&gt;level&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${WALRUS_LOG_LEVEL:-info}&lt;/span&gt;
        &lt;span class="c1"&gt;# output can be stdout or abs path to log file /var/logs/walrus.log&lt;/span&gt;
        &lt;span class="na"&gt;output&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${WALRUS_LOG_OUTPUT:-stdout}&lt;/span&gt;
        &lt;span class="c1"&gt;# Format can be json&lt;/span&gt;
        &lt;span class="na"&gt;format&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${WALRUS_LOG_FORMAT:-json}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then run the host agent.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ walrus agent -c /path/to/agent.config.yml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If everything is right, you should be able to see the host shown in the tower dashboard with one active agent. You can create backup crons under that host and update s3 configs in &lt;code&gt;settings&lt;/code&gt; tab.&lt;/p&gt;

</description>
      <category>sre</category>
      <category>devops</category>
      <category>database</category>
      <category>microservices</category>
    </item>
    <item>
      <title>How to Mock a RESTful Microservice</title>
      <dc:creator>Clivern</dc:creator>
      <pubDate>Wed, 30 Dec 2020 23:33:42 +0000</pubDate>
      <link>https://dev.to/clivern/how-to-mock-a-restful-microservices-385o</link>
      <guid>https://dev.to/clivern/how-to-mock-a-restful-microservices-385o</guid>
      <description>&lt;p&gt;👋 there!&lt;/p&gt;

&lt;p&gt;Recently I created a simple API mocking service called Rhino. That was because sometimes i have to integrate with a RESTful web service which is not ready yet or requires a lot of effort to setup and fill with data or Need a backend for a single page application &amp;amp; backend not ready yet.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/Clivern" rel="noopener noreferrer"&gt;
        Clivern
      &lt;/a&gt; / &lt;a href="https://github.com/Clivern/Rhino" rel="noopener noreferrer"&gt;
        Rhino
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      ❄️ HTTP Mocking &amp;amp; Debugging Service.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;p&gt;
    &lt;a rel="noopener noreferrer nofollow" href="https://raw.githubusercontent.com/clivern/Rhino/master/assets/img/gopher.png?v=1.7.0"&gt;&lt;img alt="Rhino Logo" src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fclivern%2FRhino%2Fmaster%2Fassets%2Fimg%2Fgopher.png%3Fv%3D1.7.0" width="150"&gt;&lt;/a&gt;
    &lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Rhino&lt;/h3&gt;
&lt;/div&gt;
    &lt;p&gt;HTTP Mocking &amp;amp; Debugging Service&lt;/p&gt;
    &lt;p&gt;
        &lt;a href="https://github.com/Clivern/Rhino/actions" rel="noopener noreferrer"&gt;&lt;img src="https://github.com/Clivern/Rhino/workflows/Build/badge.svg"&gt;&lt;/a&gt;
        &lt;a href="https://github.com/Clivern/Rhino/actions" rel="noopener noreferrer"&gt;&lt;img src="https://github.com/Clivern/Rhino/workflows/Release/badge.svg"&gt;&lt;/a&gt;
        &lt;a href="https://github.com/Clivern/Rhino/releases" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/ed01dfbf3a52bb1263833b2b3a7c2b13790368248d1ddfd6297e2a349b325bbe/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f56657273696f6e2d312e372e302d7265642e737667"&gt;&lt;/a&gt;
        &lt;a href="https://goreportcard.com/report/github.com/Clivern/Rhino" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/439e5a66c59df27753f32adedec760ea53fe201c770cc72ac8335ee0c7aa0191/68747470733a2f2f676f7265706f7274636172642e636f6d2f62616467652f6769746875622e636f6d2f636c697665726e2f5268696e6f3f763d312e372e30"&gt;&lt;/a&gt;
        &lt;a href="https://hub.docker.com/r/clivern/rhino" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/25b8b1070f91b9061ad606d8e5cb553c97b97ba374d1f9b94a1af97b7e1cf5c2/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f446f636b65722d4c61746573742d677265656e"&gt;&lt;/a&gt;
        &lt;a href="https://github.com/Clivern/Rhino/blob/master/LICENSE" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/bbc70ea904cf6138e668d47c0180490a8fe451395805898ea28e476bfe518de1/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c4943454e53452d4d49542d6f72616e67652e737667"&gt;&lt;/a&gt;
    &lt;/p&gt;
&lt;p&gt;Rhino is an HTTP Mocking &amp;amp; Debugging Service. It enables easy mocking of any HTTP web service for testing and debugging purposes. Also it can simulate high latencies and failures to make sure your services have the capability to withstand and recover from failures. It supports cross-origin resource sharing (CORS) so it can be used as a backend for single page applications.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Documentation&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Usage&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;Get &lt;a href="https://github.com/Clivern/Rhino/releases" rel="noopener noreferrer"&gt;the latest binary.&lt;/a&gt;&lt;/p&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;$ curl -sL https://github.com/Clivern/Rhino/releases/download/x.x.x/Rhino_x.x.x_OS_x86_64.tar.gz &lt;span class="pl-k"&gt;|&lt;/span&gt; tar xz&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Create the config file &lt;code&gt;config.prod.json&lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight highlight-source-json notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;{
    &lt;span class="pl-ent"&gt;"app"&lt;/span&gt;: {
        &lt;span class="pl-ent"&gt;"mode"&lt;/span&gt;: &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;prod or dev&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;
        &lt;span class="pl-ent"&gt;"port"&lt;/span&gt;: &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;8080&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;,
        &lt;span class="pl-ent"&gt;"domain"&lt;/span&gt;: &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;http://127.0.0.1:8080&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;,
        &lt;span class="pl-ent"&gt;"tls"&lt;/span&gt;: {
            &lt;span class="pl-ent"&gt;"status"&lt;/span&gt;: &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;off&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;,
            &lt;span class="pl-ent"&gt;"pemPath"&lt;/span&gt;: &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;/cert/server.pem&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;,
            &lt;span class="pl-ent"&gt;"keyPath"&lt;/span&gt;: &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;/cert/server.key&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;
        }
    },
    &lt;span class="pl-ent"&gt;"mock"&lt;/span&gt;: [
        {
            &lt;span class="pl-ent"&gt;"path"&lt;/span&gt;: &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;/api/v2/service1/mock/:id&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;,
            &lt;span class="pl-ent"&gt;"request"&lt;/span&gt;: {
                &lt;span class="pl-ent"&gt;"method"&lt;/span&gt;: &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;get&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;…
&lt;/div&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Clivern/Rhino" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Rhino enables easy mocking of any HTTP web service for testing and debugging purposes. Also it can simulate high latencies and failures to make sure your services have the capability to withstand and recover from failures. It supports cross-origin resource sharing (CORS) so it can be used as a backend for single page applications.&lt;/p&gt;

&lt;h4&gt;
  
  
  In order to run Rhino locally:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;You will have to download one of the binaries from this page &lt;a href="https://github.com/Clivern/Rhino/releases" rel="noopener noreferrer"&gt;https://github.com/Clivern/Rhino/releases&lt;/a&gt; and make it globally executable.&lt;/li&gt;
&lt;li&gt;Create a config file
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
    "app": {
        "mode": "prod",
        "port": "8080",
        "domain": "http://127.0.0.1:8080",
        "tls": {
            "status": "off",
            "pemPath": "/cert/server.pem",
            "keyPath": "/cert/server.key"
        }
    },
    "mock": [
        {
            "path": "/api/v2/service1/item",
            "request": {
                "method": "get"
            },
            "response": {
                "statusCode": 200,
                "headers": [
                    {"key": "Content-Type", "value": "application/json"}
                ],
                "body": "{\"action\": \"list\"}"
            },
            "chaos": {
                "latency": "0s",
                "failRate": "0%"
            }
        },
        {
            "path": "/api/v2/service1/item",
            "request": {
                "method": "post"
            },
            "response": {
                "statusCode": 200,
                "headers": [
                    {"key": "Content-Type", "value": "application/json"}
                ],
                "body": "{\"action\": \"create\"}"
            },
            "chaos": {
                "latency": "0s",
                "failRate": "0%"
            }
        },
        {
            "path": "/api/v2/service1/item/:id",
            "request": {
                "method": "get"
            },
            "response": {
                "statusCode": 200,
                "headers": [
                    {"key": "Content-Type", "value": "application/json"}
                ],
                "body": "{\"id\": \":id\", \"action\": \"get one\"}"
            },
            "chaos": {
                "latency": "0s",
                "failRate": "0%"
            }
        },
        {
            "path": "/api/v2/service1/item/:id",
            "request": {
                "method": "put"
            },
            "response": {
                "statusCode": 200,
                "headers": [
                    {"key": "Content-Type", "value": "application/json"}
                ],
                "body": "{\"id\": \":id\", \"action\": \"update\"}"
            },
            "chaos": {
                "latency": "0s",
                "failRate": "0%"
            }
        },
        {
            "path": "/api/v2/service1/item/:id",
            "request": {
                "method": "delete"
            },
            "response": {
                "statusCode": 200,
                "headers": [
                    {"key": "Content-Type", "value": "application/json"}
                ],
                "body": "{\"id\": \":id\", \"action\": \"delete\"}"
            },
            "chaos": {
                "latency": "0s",
                "failRate": "0%"
            }
        }
    ],
    "debug": [
        {
            "path": "/api/debug",
            "chaos": {
                "latency": "0s",
                "failRate": "0%"
            }
        }
    ],
    "log": {
        "level": "info",
        "output": "stdout",
        "format": "json"
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;The run rhino with that config file
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;rhino serve &lt;span class="nt"&gt;-c&lt;/span&gt; config.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;On a different terminal, let's call these mocked endpoints
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;➜  ~ curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s2"&gt;"http://127.0.0.1:8080/api/v2/service1/item"&lt;/span&gt;
&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"action"&lt;/span&gt;: &lt;span class="s2"&gt;"create"&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;

➜  ~ curl &lt;span class="nt"&gt;-X&lt;/span&gt; GET &lt;span class="s2"&gt;"http://127.0.0.1:8080/api/v2/service1/item"&lt;/span&gt;
&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"action"&lt;/span&gt;: &lt;span class="s2"&gt;"list"&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;

➜  ~ curl &lt;span class="nt"&gt;-X&lt;/span&gt; GET &lt;span class="s2"&gt;"http://127.0.0.1:8080/api/v2/service1/item/1"&lt;/span&gt;
&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"id"&lt;/span&gt;: &lt;span class="s2"&gt;"1"&lt;/span&gt;, &lt;span class="s2"&gt;"action"&lt;/span&gt;: &lt;span class="s2"&gt;"get one"&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;

➜  ~ curl &lt;span class="nt"&gt;-X&lt;/span&gt; PUT &lt;span class="s2"&gt;"http://127.0.0.1:8080/api/v2/service1/item/1"&lt;/span&gt;
&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"id"&lt;/span&gt;: &lt;span class="s2"&gt;"1"&lt;/span&gt;, &lt;span class="s2"&gt;"action"&lt;/span&gt;: &lt;span class="s2"&gt;"update"&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;

➜  ~ curl &lt;span class="nt"&gt;-X&lt;/span&gt; DELETE &lt;span class="s2"&gt;"http://127.0.0.1:8080/api/v2/service1/item/1"&lt;/span&gt;
&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"id"&lt;/span&gt;: &lt;span class="s2"&gt;"1"&lt;/span&gt;, &lt;span class="s2"&gt;"action"&lt;/span&gt;: &lt;span class="s2"&gt;"delete"&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  To run rhino with docker and docker compose:
&lt;/h4&gt;

&lt;p&gt;Just close the repository and use either the simple or the advanced setup.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Simple setup&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;git clone https://github.com/Clivern/Rhino.git
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;Rhino/deployment/basic/docker-compose
&lt;span class="nv"&gt;$ &lt;/span&gt;docker-compose up &lt;span class="nt"&gt;-d&lt;/span&gt;

&lt;span class="c"&gt;# In case you want to visualize incoming requests with grafana&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;git clone https://github.com/Clivern/Rhino.git
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;Rhino/deployment/advanced/docker-compose
&lt;span class="nv"&gt;$ &lt;/span&gt;docker-compose up &lt;span class="nt"&gt;-d&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Rhino supports a bunch of fake data flags that can be used in the endpoint definition&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;AnyOf: @fake&lt;span class="o"&gt;(&lt;/span&gt;:anyof[A||B||C||D]&lt;span class="o"&gt;)&lt;/span&gt;
Latitude: @fake&lt;span class="o"&gt;(&lt;/span&gt;:lat&lt;span class="o"&gt;)&lt;/span&gt;
Longitude: @fake&lt;span class="o"&gt;(&lt;/span&gt;:long&lt;span class="o"&gt;)&lt;/span&gt;
CreditCardNumber: @fake&lt;span class="o"&gt;(&lt;/span&gt;:cc_number&lt;span class="o"&gt;)&lt;/span&gt;
CreditCardType: @fake&lt;span class="o"&gt;(&lt;/span&gt;:cc_type&lt;span class="o"&gt;)&lt;/span&gt;
Email: @fake&lt;span class="o"&gt;(&lt;/span&gt;:email&lt;span class="o"&gt;)&lt;/span&gt;
DomainName: @fake&lt;span class="o"&gt;(&lt;/span&gt;:domain_name&lt;span class="o"&gt;)&lt;/span&gt;
IPV4: @fake&lt;span class="o"&gt;(&lt;/span&gt;:ipv4&lt;span class="o"&gt;)&lt;/span&gt;
IPV6: @fake&lt;span class="o"&gt;(&lt;/span&gt;:ipv6&lt;span class="o"&gt;)&lt;/span&gt;
Password: @fake&lt;span class="o"&gt;(&lt;/span&gt;:password&lt;span class="o"&gt;)&lt;/span&gt;
PhoneNumber: @fake&lt;span class="o"&gt;(&lt;/span&gt;:phone_number&lt;span class="o"&gt;)&lt;/span&gt;
MacAddress: @fake&lt;span class="o"&gt;(&lt;/span&gt;:mac_address&lt;span class="o"&gt;)&lt;/span&gt;
URL: @fake&lt;span class="o"&gt;(&lt;/span&gt;:url&lt;span class="o"&gt;)&lt;/span&gt;
UserName: @fake&lt;span class="o"&gt;(&lt;/span&gt;:username&lt;span class="o"&gt;)&lt;/span&gt;
TollFreeNumber: @fake&lt;span class="o"&gt;(&lt;/span&gt;:toll_free_number&lt;span class="o"&gt;)&lt;/span&gt;
E164PhoneNumber: @fake&lt;span class="o"&gt;(&lt;/span&gt;:e_164_phone_number&lt;span class="o"&gt;)&lt;/span&gt;
TitleMale: @fake&lt;span class="o"&gt;(&lt;/span&gt;:title_male&lt;span class="o"&gt;)&lt;/span&gt;
TitleFemale: @fake&lt;span class="o"&gt;(&lt;/span&gt;:title_female&lt;span class="o"&gt;)&lt;/span&gt;
FirstName: @fake&lt;span class="o"&gt;(&lt;/span&gt;:first_name&lt;span class="o"&gt;)&lt;/span&gt;
FirstNameMale: @fake&lt;span class="o"&gt;(&lt;/span&gt;:first_name_male&lt;span class="o"&gt;)&lt;/span&gt;
FirstNameFemale: @fake&lt;span class="o"&gt;(&lt;/span&gt;:first_name_female&lt;span class="o"&gt;)&lt;/span&gt;
LastName: @fake&lt;span class="o"&gt;(&lt;/span&gt;:last_name&lt;span class="o"&gt;)&lt;/span&gt;
Name: @fake&lt;span class="o"&gt;(&lt;/span&gt;:name&lt;span class="o"&gt;)&lt;/span&gt;
UnixTime: @fake&lt;span class="o"&gt;(&lt;/span&gt;:unix_time&lt;span class="o"&gt;)&lt;/span&gt;
Date: @fake&lt;span class="o"&gt;(&lt;/span&gt;:date&lt;span class="o"&gt;)&lt;/span&gt;
Time: @fake&lt;span class="o"&gt;(&lt;/span&gt;:time&lt;span class="o"&gt;)&lt;/span&gt;
MonthName: @fake&lt;span class="o"&gt;(&lt;/span&gt;:month_name&lt;span class="o"&gt;)&lt;/span&gt;
Year: @fake&lt;span class="o"&gt;(&lt;/span&gt;:year&lt;span class="o"&gt;)&lt;/span&gt;
DayOfWeek: @fake&lt;span class="o"&gt;(&lt;/span&gt;:day_of_week&lt;span class="o"&gt;)&lt;/span&gt;
DayOfMonth: @fake&lt;span class="o"&gt;(&lt;/span&gt;:day_of_month&lt;span class="o"&gt;)&lt;/span&gt;
Timestamp: @fake&lt;span class="o"&gt;(&lt;/span&gt;:timestamp&lt;span class="o"&gt;)&lt;/span&gt;
Century: @fake&lt;span class="o"&gt;(&lt;/span&gt;:century&lt;span class="o"&gt;)&lt;/span&gt;
TimeZone: @fake&lt;span class="o"&gt;(&lt;/span&gt;:timezone&lt;span class="o"&gt;)&lt;/span&gt;
TimePeriod: @fake&lt;span class="o"&gt;(&lt;/span&gt;:time_period&lt;span class="o"&gt;)&lt;/span&gt;
Word: @fake&lt;span class="o"&gt;(&lt;/span&gt;:word&lt;span class="o"&gt;)&lt;/span&gt;
Sentence: @fake&lt;span class="o"&gt;(&lt;/span&gt;:sentence&lt;span class="o"&gt;)&lt;/span&gt;
Paragraph: @fake&lt;span class="o"&gt;(&lt;/span&gt;:paragraph&lt;span class="o"&gt;)&lt;/span&gt;
Currency: @fake&lt;span class="o"&gt;(&lt;/span&gt;:currency&lt;span class="o"&gt;)&lt;/span&gt;
Amount: @fake&lt;span class="o"&gt;(&lt;/span&gt;:amount&lt;span class="o"&gt;)&lt;/span&gt;
AmountWithCurrency: @fake&lt;span class="o"&gt;(&lt;/span&gt;:amount_with_currency&lt;span class="o"&gt;)&lt;/span&gt;
UUIDHypenated: @fake&lt;span class="o"&gt;(&lt;/span&gt;:uuid_hyphenated&lt;span class="o"&gt;)&lt;/span&gt;
UUID: @fake&lt;span class="o"&gt;(&lt;/span&gt;:uuid_digit&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Happy coding everyone! ❤️&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>microservices</category>
      <category>mocking</category>
      <category>rest</category>
    </item>
    <item>
      <title>New Contributors Welcome / Open Source Project (Silverback)</title>
      <dc:creator>Clivern</dc:creator>
      <pubDate>Sat, 28 Sep 2019 17:14:31 +0000</pubDate>
      <link>https://dev.to/clivern/new-contributors-welcome-open-source-project-silverback-2904</link>
      <guid>https://dev.to/clivern/new-contributors-welcome-open-source-project-silverback-2904</guid>
      <description>&lt;p&gt;👋 there!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/silverbackhq/silverback"&gt;Silverback 🔥&lt;/a&gt; is a free and open source project for web infrastructure, developer APIs, services and SaaS companies to set up their very own status page in minutes.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The project started a while ago and quite stable even the beta release will be on october 2019 🤘.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--A9-wwsHG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/silverbackhq"&gt;
        silverbackhq
      &lt;/a&gt; / &lt;a href="https://github.com/silverbackhq/silverback"&gt;
        silverback
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      🧬 A Status and Incident Communication Tool (Beta Version).
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;p&gt;
    &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/8a9d8aaa0dc7b5029567ab48ed010dcb065dfbe3021012e4dd357be2b1179e0b/68747470733a2f2f73696c7665726261636b68712e6f72672f6c6f676f2e706e67"&gt;&lt;img alt="Silverback Logo" src="https://camo.githubusercontent.com/8a9d8aaa0dc7b5029567ab48ed010dcb065dfbe3021012e4dd357be2b1179e0b/68747470733a2f2f73696c7665726261636b68712e6f72672f6c6f676f2e706e67" height="120"&gt;&lt;/a&gt;
    &lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Silverback&lt;/h3&gt;
&lt;/div&gt;
    &lt;p&gt;A Status and Incident Communication Tool.&lt;/p&gt;
    &lt;p&gt;
        &lt;a href="https://travis-ci.org/silverbackhq/Silverback" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/0c4864764ee47a89c84349dcf0eb2b816f59336b0cf949aa9671a717521eb36a/68747470733a2f2f7472617669732d63692e6f72672f73696c7665726261636b68712f53696c7665726261636b2e7376673f6272616e63683d6d6173746572"&gt;&lt;/a&gt;
        &lt;a href="https://sonarcloud.io/dashboard?id=silverbackhq_silverback" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/3a34e79f7403157900a3b7c7f74b0669c3ae1c8b89c5c6729e5afe0616af70be/68747470733a2f2f736f6e6172636c6f75642e696f2f6170692f70726f6a6563745f6261646765732f6d6561737572653f70726f6a6563743d73696c7665726261636b68715f73696c7665726261636b266d65747269633d616c6572745f737461747573"&gt;&lt;/a&gt;
        &lt;a href="https://coveralls.io/github/silverbackhq/silverback?branch=master" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/019fc4cb4787a3eda960fb6c22e3867c5e8590f2d899bf34247b1ada3fea907c/68747470733a2f2f636f766572616c6c732e696f2f7265706f732f6769746875622f73696c7665726261636b68712f73696c7665726261636b2f62616467652e7376673f6272616e63683d6d6173746572" alt="Coverage Status"&gt;&lt;/a&gt;
        &lt;a href="https://hub.docker.com/r/clivern/silverback" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/c339cf16fe84d163affc4c38ed2a663d65155f4423f4aeddf335c8803545f7a8/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f446f636b65722d4c61746573742d6f72616e6765"&gt;&lt;/a&gt;
        &lt;a href="https://github.com/silverbackhq/Silverback/releases"&gt;&lt;img src="https://camo.githubusercontent.com/cb2a14a1857f20ed73e2aaa5d62f8e7781c81eaeebe5854d020612e320dcb87f/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f56657273696f6e2d76312e302e302d2d626574612e312d626c75652e737667"&gt;&lt;/a&gt;
        &lt;a href="https://github.com/silverbackhq/Silverback/blob/master/LICENSE"&gt;&lt;img src="https://camo.githubusercontent.com/72d0873eeb9434caa761bda1a17a8248d3b4de0ff6948e39cd7e02ed8d763a9a/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c4943454e53452d4170616368652d2d322e302d6f72616e67652e737667"&gt;&lt;/a&gt;
    &lt;/p&gt;
&lt;p&gt;
    &lt;a href="https://heroku.com/deploy" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/df5706ea91f4c49deb42ca31a753d025e2078d24e2490cf88ffc7ed84a38e48e/68747470733a2f2f7777772e6865726f6b7563646e2e636f6d2f6465706c6f792f627574746f6e2e737667" alt="Deploy"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Silverback&lt;/strong&gt; is a &lt;strong&gt;free&lt;/strong&gt; and &lt;strong&gt;open source&lt;/strong&gt; project for web infrastructure, developer APIs, services and SaaS companies to set up their very own &lt;strong&gt;status page&lt;/strong&gt; in minutes.&lt;/p&gt;

&lt;p&gt;
    &lt;a rel="noopener noreferrer nofollow" href="https://raw.githubusercontent.com/silverbackhq/silverback/master/assets/chart.png?v=9"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--DWUD_1V5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://raw.githubusercontent.com/silverbackhq/silverback/master/assets/chart.png%3Fv%3D9" width="750"&gt;&lt;/a&gt;
&lt;/p&gt;



&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Overview&lt;/h2&gt;
&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;Auto Installer.&lt;/li&gt;
&lt;li&gt;User management with different roles.&lt;/li&gt;
&lt;li&gt;Services and service groups statuses.&lt;/li&gt;
&lt;li&gt;Uptime charts for services and service groups.&lt;/li&gt;
&lt;li&gt;Incidents and incident updates management.&lt;/li&gt;
&lt;li&gt;Metrics with third party integrations (NewRelic and more ...).&lt;/li&gt;
&lt;li&gt;Subscriber notifications via email, SMS, customer endpoint, RSS feed and Atom Feed.&lt;/li&gt;
&lt;li&gt;Asynchronous workers for subscriber notifications with ability to run any number to scale.&lt;/li&gt;
&lt;li&gt;Realtime administration dashboard.&lt;/li&gt;
&lt;li&gt;Multilingual.&lt;/li&gt;
&lt;li&gt;Easy Theme System! Easily give silverback a complete makeover.&lt;/li&gt;
&lt;li&gt;and much more ...&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Installation&lt;/h2&gt;

&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/silverbackhq/silverbackdeployments/development/README.md"&gt;Install for Development Purposes.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/silverbackhq/silverbackdeployments/ubuntu-18.04/README.md"&gt;Install on Ubuntu 18.04.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/silverbackhq/silverbackdeployments/docker-compose/README.md"&gt;Install on Docker Compose.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/silverbackhq/silverbackdeployments/k8s/README.md"&gt;Install on Kubernetes.&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Versioning&lt;/h2&gt;

&lt;/div&gt;

&lt;p&gt;For transparency into our release cycle and in striving to maintain backward compatibility, Silverback is maintained under the &lt;a href="https://semver.org/" rel="nofollow"&gt;Semantic Versioning guidelines&lt;/a&gt; and release…&lt;/p&gt;
&lt;/div&gt;


&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/silverbackhq/silverback"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


&lt;p&gt;🚀 Some of the project features quickly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Auto Installer.&lt;/li&gt;
&lt;li&gt;User management with different roles.&lt;/li&gt;
&lt;li&gt;Services and service groups statuses.&lt;/li&gt;
&lt;li&gt;Uptime charts for services and service groups.&lt;/li&gt;
&lt;li&gt;Incidents and incident updates management.&lt;/li&gt;
&lt;li&gt;Metrics with third party integrations (NewRelic and more ...).&lt;/li&gt;
&lt;li&gt;Subscriber notifications via email, SMS, customer endpoint, RSS feed and Atom Feed.&lt;/li&gt;
&lt;li&gt;Asynchronous workers for subscriber notifications with ability to run any number to scale.&lt;/li&gt;
&lt;li&gt;Realtime administration dashboard.&lt;/li&gt;
&lt;li&gt;Multilingual.&lt;/li&gt;
&lt;li&gt;and much more ..&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Screenshots or Demo 🤔
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--KiuJFDwh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://i.imgur.com/70qCMaH.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KiuJFDwh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://i.imgur.com/70qCMaH.gif" width="500" height="281"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Well, You can &lt;a href="https://heroku.com/deploy?template=https://github.com/silverbackhq/silverback/tree/master"&gt;run silverback on heroku for free!&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Architecture
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--25lD7jxk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://raw.githubusercontent.com/silverbackhq/silverback/master/assets/chart.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--25lD7jxk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://raw.githubusercontent.com/silverbackhq/silverback/master/assets/chart.png" alt="Architecture" width="593" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Contributors Wanted 😌
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/l42Pz6bumqF4MpPWM/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/l42Pz6bumqF4MpPWM/giphy.gif" alt="Contributors" width="479" height="200"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you're interested in practising your Python (Django), JavaScript, MySQL and Asynchronous Programming (RabbitMQ &amp;amp; Redis) skills, you should jump right now!&lt;/p&gt;

&lt;p&gt;Want to know more about a specific area, don't hesitate to ask. More than happy to do whatever I can to help get you ramped up and contributing ❤️&lt;/p&gt;

&lt;p&gt;Happy coding everyone! ❤️&lt;/p&gt;

</description>
      <category>contributorswanted</category>
      <category>python</category>
      <category>hacktoberfest</category>
    </item>
  </channel>
</rss>
