PageSourceSearch

https://ruan.dev/blog

html ruan.dev collected 2026-10-03 23:19:03 UTC 798,518 bytes, 1 lines download raw bytes

1<!DOCTYPE html><html lang="en-us" class="__variable_f367f3 scroll-smooth"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" href="/_next/static/media/e4af272ccee01ff0-s.p.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="stylesheet" href="/_next/static/css/9dd4d946fd0a49a1.css" crossorigin="" data-precedence="next"/><link rel="stylesheet" href="/_next/static/css/73ad1a599336f265.css" crossorigin="" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-59aef84eb31a1827.js" crossorigin=""/>
1<script src="/_next/static/chunks/fd9d1056-45c1d1d33afce4a4.js" async="" crossorigin=""></script>
1<script src="/_next/static/chunks/472-52aa329653315de8.js" async="" crossorigin=""></script>
1<script src="/_next/static/chunks/main-app-892c3dff08e9cd4c.js" async="" crossorigin=""></script>
1<script src="/_next/static/chunks/326-4c48d497d1f9fab1.js" async=""></script>
1<script src="/_next/static/chunks/app/layout-ccce6f197a5b4252.js" async=""></script>
1<script src="/_next/static/chunks/413-b075cc12d1858dcb.js" async=""></script>
1<script src="/_next/static/chunks/app/page-36c67a19cdf4edae.js" async=""></script>
1<script src="/_next/static/chunks/529-20cbed04a20570d5.js" async=""></script>
1<script src="/_next/static/chunks/app/blog/page-52ea55f5a1af43b1.js" async=""></script>
1<script async="" type="text/javascript" src="//cdn.carbonads.com/carbon.js?serve=CEAIP2JL&amp;placement=blogruanbekkercom" id="_carbonads_js"></script>
1<link rel="preload" href="https://analytics.umami.is/script.js" as="script"/><link rel="preload" href="https://www.googletagmanager.com/gtag/js?id=G-GBW0KS3BZH" as="script"/><link rel="apple-touch-icon" sizes="76x76" href="/static/favicons/apple-touch-icon.png"/><link rel="icon" type="image/png" sizes="32x32" href="/static/favicons/favicon-32x32.png"/><link rel="icon" type="image/png" sizes="16x16" href="/static/favicons/favicon-16x16.png"/><link rel="manifest" href="/static/favicons/site.webmanifest"/><link rel="mask-icon" href="/static/favicons/safari-pinned-tab.svg" color="#5bbad5"/><meta name="msapplication-TileColor" content="#000000"/><meta name="theme-color" media="(prefers-color-scheme: light)" content="#fff"/><meta name="theme-color" media="(prefers-color-scheme: dark)" content="#000"/><link rel="alternate" type="application/rss+xml" href="/feed.xml"/><title>Blog | Ruan Bekker&#x27;s Blog</title><meta name="description" content="Bridging Ideas and Implementation in the World of Open Source and DevOps."/><meta name="robots" content="index, follow"/><meta name="googlebot" content="index, follow, max-video-preview:-1, max-image-preview:large, max-snippet:-1"/><link rel="canonical" href="https://ruan.dev/blog"/><link rel="alternate" type="application/rss+xml" href="https://ruan.dev/feed.xml"/><meta property="og:title" content="Blog | Ruan Bekker&#x27;s Blog"/><meta property="og:description" content="Bridging Ideas and Implementation in the World of Open Source and DevOps."/><meta property="og:url" content="https://ruan.dev/blog"/><meta property="og:site_name" content="Ruan Bekker&#x27;s Blog"/><meta property="og:locale" content="en_US"/><meta property="og:image" content="https://ruan.dev/static/images/ruan-dev-default-image.png"/><meta property="og:type" content="website"/><meta name="twitter:card" content="summary_large_image"/><meta name="twitter:title" content="Blog | Ruan Bekker&#x27;s Blog"/><meta name="twitter:description" content="Bridging Ideas and Implementation in the World of Open Source and DevOps."/><meta name="twitter:image" content="https://ruan.dev/static/images/ruan-dev-default-image.png"/><meta name="next-size-adjust"/>
1<script src="/_next/static/chunks/polyfills-c67a75d1b6f99dc8.js" crossorigin="" noModule=""></script>
1</head>
1<script defer="" src="https://umami-analytics.ruan.dev/script.js" data-website-id="cc66d8aa-8f42-4d94-8fd7-c87f69f3b03a"></script>
1<body class="bg-white text-black antialiased dark:bg-gray-950 dark:text-white">
1<script>!function(){try{var d=document.documentElement,c=d.classList;c.remove('light','dark');var e=localStorage.getItem('theme');if('system'===e||(!e&&true)){var t='(prefers-color-scheme: dark)',m=window.matchMedia(t);if(m.media!==t||m.matches){d.style.colorScheme = 'dark';c.add('dark')}else{d.style.colorScheme = 'light';c.add('light')}}else if(e){c.add(e|| '')}if(e==='light'||e==='dark')d.style.colorScheme=e}catch(e){}}()</script>
1<section class="mx-auto max-w-3xl px-4 sm:px-6 xl:max-w-5xl xl:px-0"><div class="flex h-screen flex-col justify-between font-sans"><header class="flex items-center justify-between py-10"><div><a aria-label="Ruan Bekker&#x27;s Blog" href="/"><div class="flex items-center justify-between"><div class="mr-3"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="53.87" height="43.61" viewBox="344.564 330.278 111.737 91.218"><defs><linearGradient id="logo_svg__b" x1="420.97" x2="420.97" y1="331.28" y2="418.5" gradientUnits="userSpaceOnUse"><stop offset="0%" style="stop-color:#06b6d4;stop-opacity:1"></stop><stop offset="100%" style="stop-color:#67e8f9;stop-opacity:1"></stop></linearGradient><linearGradient id="logo_svg__d" x1="377.89" x2="377.89" y1="331.28" y2="418.5" gradientUnits="userSpaceOnUse"><stop offset="0%" style="stop-color:#06b6d4;stop-opacity:1"></stop><stop offset="100%" style="stop-color:#67e8f9;stop-opacity:1"></stop></linearGradient><path id="logo_svg__a" d="M453.3 331.28v28.57l-64.66 58.65v-30.08l64.66-57.14Z"></path><path id="logo_svg__c" d="M410.23 331.28v28.57l-64.67 58.65v-30.08l64.67-57.14Z"></path></defs><use xlink:href="#logo_svg__a" fill="url(#logo_svg__b)"></use><use xlink:href="#logo_svg__c" fill="url(#logo_svg__d)"></use></svg></div><div class="hidden h-6 text-2xl font-semibold sm:block">Ruan Bekker&#x27;s Blog</div></div></a></div><div class="flex items-center space-x-4 leading-5 sm:space-x-6"><a class="hidden font-medium text-gray-900 dark:text-gray-100 sm:block" href="/blog">Blog</a><a class="hidden font-medium text-gray-900 dark:text-gray-100 sm:block" href="/tags">Tags</a><a class="hidden font-medium text-gray-900 dark:text-gray-100 sm:block" href="/projects">Projects</a><a class="hidden font-medium text-gray-900 dark:text-gray-100 sm:block" href="/resume">Resume</a><a class="hidden font-medium text-gray-900 dark:text-gray-100 sm:block" href="/about">About</a><a class="hidden font-medium text-gray-900 dark:text-gray-100 sm:block" href="/newsletter">Newsletter</a><button aria-label="Search"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="h-6 w-6 text-gray-900 dark:text-gray-100"><path stroke-linecap="round" stroke-linejoin="round" d="M21 21l-5.197-5.197m0 0A7.5 7.5 0 105.196 5.196a7.5 7.5 0 0010.607 10.607z"></path></svg></button><button aria-label="Toggle Menu" class="sm:hidden"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" class="h-8 w-8 text-gray-900 dark:text-gray-100"><path fill-rule="evenodd" d="M3 5a1 1 0 011-1h12a1 1 0 110 2H4a1 1 0 01-1-1zM3 10a1 1 0 011-1h12a1 1 0 110 2H4a1 1 0 01-1-1zM3 15a1 1 0 011-1h12a1 1 0 110 2H4a1 1 0 01-1-1z" clip-rule="evenodd"></path></svg></button><div class="fixed left-0 top-0 z-10 h-full w-full transform bg-white opacity-95 duration-300 ease-in-out dark:bg-gray-950 dark:opacity-[0.98] translate-x-full"><div class="flex justify-end"><button class="mr-8 mt-11 h-8 w-8" aria-label="Toggle Menu"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" class="text-gray-900 dark:text-gray-100"><path fill-rule="evenodd" d="M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z" clip-rule="evenodd"></path></svg></button></div><nav class="fixed mt-8 h-full"><div class="px-12 py-4"><a class="text-2xl font-bold tracking-widest text-gray-900 dark:text-gray-100" href="/">Home</a></div><div class="px-12 py-4"><a class="text-2xl font-bold tracking-widest text-gray-900 dark:text-gray-100" href="/blog">Blog</a></div><div class="px-12 py-4"><a class="text-2xl font-bold tracking-widest text-gray-900 dark:text-gray-100" href="/tags">Tags</a></div><div class="px-12 py-4"><a class="text-2xl font-bold tracking-widest text-gray-900 dark:text-gray-100" href="/projects">Projects</a></div><div class="px-12 py-4"><a class="text-2xl font-bold tracking-widest text-gray-900 dark:text-gray-100" href="/resume">Resume</a></div><div class="px-12 py-4"><a class="text-2xl font-bold tracking-widest text-gray-900 dark:text-gray-100" href="/about">About</a></div><div class="px-12 py-4"><a class="text-2xl font-bold tracking-widest text-gray-900 dark:text-gray-100" href="/newsletter">Newsletter</a></div></nav></div></div></header><main class="mb-auto"><div><div class="pb-6 pt-6"><h1 class="text-3xl font-extrabold leading-9 tracking-tight text-gray-900 dark:text-gray-100 sm:hidden sm:text-4xl sm:leading-10 md:text-6xl md:leading-14">All Posts</h1></div><div class="flex sm:space-x-24"><div class="hidden h-full max-h-screen min-w-[280px] max-w-[280px] flex-wrap overflow-auto rounded bg-gray-50 pt-5 shadow-md dark:bg-gray-900/70 dark:shadow-gray-800/40 sm:flex"><div class="px-6 py-4"><h3 class="font-bold uppercase text-primary-500">All Posts</h3><ul><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged python" href="/tags/python">python (90)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged docker" href="/tags/docker">docker (87)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged devops" href="/tags/devops">devops (83)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged linux" href="/tags/linux">linux (59)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged aws" href="/tags/aws">aws (53)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged programming" href="/tags/programming">programming (39)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged elasticsearch" href="/tags/elasticsearch">elasticsearch (31)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged swarm" href="/tags/swarm">swarm (30)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged kubernetes" href="/tags/kubernetes">kubernetes (27)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged databases" href="/tags/databases">databases (22)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged security" href="/tags/security">security (22)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged sysadmin" href="/tags/sysadmin">sysadmin (20)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged storage" href="/tags/storage">storage (19)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged monitoring" href="/tags/monitoring">monitoring (19)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged terraform" href="/tags/terraform">terraform (19)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged flask" href="/tags/flask">flask (17)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged cicd" href="/tags/cicd">cicd (15)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged ansible" href="/tags/ansible">ansible (15)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged mysql" href="/tags/mysql">mysql (14)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged traefik" href="/tags/traefik">traefik (13)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged mongodb" href="/tags/mongodb">mongodb (13)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged nginx" href="/tags/nginx">nginx (13)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged ssh" href="/tags/ssh">ssh (13)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged grafana" href="/tags/grafana">grafana (13)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged golang" href="/tags/golang">golang (12)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged networking" href="/tags/networking">networking (12)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged prometheus" href="/tags/prometheus">prometheus (12)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged web-development" href="/tags/web-development">web-development (11)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged iam" href="/tags/iam">iam (9)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged kibana" href="/tags/kibana">kibana (9)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged concourse" href="/tags/concourse">concourse (9)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged dynamodb" href="/tags/dynamodb">dynamodb (9)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged blockchain" href="/tags/blockchain">blockchain (9)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged openfaas" href="/tags/openfaas">openfaas (8)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged logging" href="/tags/logging">logging (8)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged metrics" href="/tags/metrics">metrics (8)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged drone" href="/tags/drone">drone (8)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged s3" href="/tags/s3">s3 (7)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged encryption" href="/tags/encryption">encryption (7)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged java" href="/tags/java">java (7)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged vpn" href="/tags/vpn">vpn (7)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged raspberrypi" href="/tags/raspberrypi">raspberrypi (7)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged loki" href="/tags/loki">loki (7)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged ruby" href="/tags/ruby">ruby (6)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged ubuntu" href="/tags/ubuntu">ubuntu (6)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged scripting" href="/tags/scripting">scripting (6)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged secrets" href="/tags/secrets">secrets (6)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged scaleway" href="/tags/scaleway">scaleway (6)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged api" href="/tags/api">api (6)</a></li><li class="my-3"><a class="px-3 py
1-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged caching" href="/tags/caching">caching (6)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged crypto" href="/tags/crypto">crypto (6)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged authentication" href="/tags/authentication">authentication (5)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged lambda" href="/tags/lambda">lambda (5)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged gitlab" href="/tags/gitlab">gitlab (5)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged clustering" href="/tags/clustering">clustering (5)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged bitcoin" href="/tags/bitcoin">bitcoin (5)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged kind" href="/tags/kind">kind (5)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged letsencrypt" href="/tags/letsencrypt">letsencrypt (4)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged nfs" href="/tags/nfs">nfs (4)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged boto3" href="/tags/boto3">boto3 (4)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged glusterfs" href="/tags/glusterfs">glusterfs (4)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged flask-tutorial" href="/tags/flask-tutorial">flask-tutorial (4)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged serverless" href="/tags/serverless">serverless (4)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged nagios" href="/tags/nagios">nagios (4)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged elasticsearch-tutorial" href="/tags/elasticsearch-tutorial">elasticsearch-tutorial (4)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged vault" href="/tags/vault">vault (4)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged k3d" href="/tags/k3d">k3d (4)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged engineering" href="/tags/engineering">engineering (4)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged haproxy" href="/tags/haproxy">haproxy (3)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged postfix" href="/tags/postfix">postfix (3)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged nodejs" href="/tags/nodejs">nodejs (3)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged backups" href="/tags/backups">backups (3)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged galera" href="/tags/galera">galera (3)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged kvm" href="/tags/kvm">kvm (3)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged virtualization" href="/tags/virtualization">virtualization (3)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged cryptography" href="/tags/cryptography">cryptography (3)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged maven" href="/tags/maven">maven (3)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged cloud" href="/tags/cloud">cloud (3)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged pipelines" href="/tags/pipelines">pipelines (3)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged multiprocessing" href="/tags/multiprocessing">multiprocessing (3)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged slack" href="/tags/slack">slack (3)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged gitea" href="/tags/gitea">gitea (3)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged hugo" href="/tags/hugo">hugo (3)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged alertmanager" href="/tags/alertmanager">alertmanager (3)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged logstash" href="/tags/logstash">logstash (3)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged redis" href="/tags/redis">redis (3)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged helm" href="/tags/helm">helm (3)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged argocd" href="/tags/argocd">argocd (3)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged ollama" href="/tags/ollama">ollama (3)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged ai" href="/tags/ai">ai (3)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged php" href="/tags/php">php (2)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged chef" href="/tags/chef">chef (2)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged minio" href="/tags/minio">minio (2)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged rocketchat" href="/tags/rocketchat">rocketchat (2)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged machine-learning" href="/tags/machine-learning">machine-learning (2)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged cloudwatch" href="/tags/cloudwatch">cloudwatch (2)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged c" href="/tags/c">c (2)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged mail" href="/tags/mail">mail (2)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged alpine" href="/tags/alpine">alpine (2)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged kms" href="/tags/kms">kms (2)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged alerting" href="/tags/alerting">alerting (2)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged ghost" href="/tags/ghost">ghost (2)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged bigdata" href="/tags/bigdata">bigdata (2)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged hive" href="/tags/hive">hive (2)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged strongswan" href="/tags/strongswan">strongswan (2)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged cli" href="/tags/cli">cli (2)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged geoip" href="/tags/geoip">geoip (2)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged email" href="/tags/email">
1email (2)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged memcached" href="/tags/memcached">memcached (2)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged sqlite" href="/tags/sqlite">sqlite (2)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged javascript" href="/tags/javascript">javascript (2)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged ansible-tutorial" href="/tags/ansible-tutorial">ansible-tutorial (2)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged golang-tutorial" href="/tags/golang-tutorial">golang-tutorial (2)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged dev-environment" href="/tags/dev-environment">dev-environment (2)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged ci" href="/tags/ci">ci (2)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged bash" href="/tags/bash">bash (2)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged configuration-management" href="/tags/configuration-management">configuration-management (2)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged filebeat" href="/tags/filebeat">filebeat (2)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged ssl" href="/tags/ssl">ssl (2)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged analytics" href="/tags/analytics">analytics (2)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged blogging" href="/tags/blogging">blogging (2)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged hashicorp" href="/tags/hashicorp">hashicorp (2)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged node-exporter" href="/tags/node-exporter">node-exporter (2)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged vagrant" href="/tags/vagrant">vagrant (2)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged virtualbox" href="/tags/virtualbox">virtualbox (2)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged eks" href="/tags/eks">eks (2)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged localstack" href="/tags/localstack">localstack (2)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged iptables" href="/tags/iptables">iptables (2)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged performance" href="/tags/performance">performance (2)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged ec2" href="/tags/ec2">ec2 (2)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged digibyte" href="/tags/digibyte">digibyte (2)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged cryptocurrency" href="/tags/cryptocurrency">cryptocurrency (2)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged macosx" href="/tags/macosx">macosx (2)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged cloudflare" href="/tags/cloudflare">cloudflare (2)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged matrix" href="/tags/matrix">matrix (2)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged atlantis" href="/tags/atlantis">atlantis (2)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged keda" href="/tags/keda">keda (2)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged gitops" href="/tags/gitops">gitops (2)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged zfs" href="/tags/zfs">zfs (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged awscli" href="/tags/awscli">awscli (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged loadbalancer" href="/tags/loadbalancer">loadbalancer (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged containers" href="/tags/containers">containers (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged pandas" href="/tags/pandas">pandas (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged plotly" href="/tags/plotly">plotly (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged rekognition" href="/tags/re
1kognition">rekognition (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged ses" href="/tags/ses">ses (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged mlab" href="/tags/mlab">mlab (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged ssmtp" href="/tags/ssmtp">ssmtp (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged desktop" href="/tags/desktop">desktop (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged customization" href="/tags/customization">customization (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged html" href="/tags/html">html (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged kerberos" href="/tags/kerberos">kerberos (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged docker-swarm" href="/tags/docker-swarm">docker-swarm (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged consul" href="/tags/consul">consul (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged tomcat" href="/tags/tomcat">tomcat (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged octopress" href="/tags/octopress">octopress (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged github-pages" href="/tags/github-pages">github-pages (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged commands" href="/tags/commands">commands (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged socks" href="/tags/socks">socks (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged tunnel" href="/tags/tunnel">tunnel (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged mariadb" href="/tags/mariadb">mariadb (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged blog" href="/tags/blog">blog (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged curator" href="/tags/curator">curator (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged raspberypi" href="/tags/raspberypi">raspberypi (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged systemd" href="/tags/systemd">systemd (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged chatbot" href="/tags/chatbot">chatbot (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged visualizations" href="/tags/visualizations">visualizations (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged chartjs" href="/tags/chartjs">chartjs (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged ebs" href="/tags/ebs">ebs (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged payara" href="/tags/payara">payara (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged lvm" href="/tags/lvm">lvm (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged arm64" href="/tags/arm64">arm64 (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged dreamhost" href="/tags/dreamhost">dreamhost (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged argparse" href="/tags/argparse">argparse (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged paramiko" href="/tags/paramiko">paramiko (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged ceph" href="/tags/ceph">ceph (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged rails" href="/tags/rails">rails (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged springboot" href="/tags/springboot">springboot (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged rss" href="/tags/rss">rss (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged facebook" href="/tags/facebook">facebook (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged location" href="/tags/location">location (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged honeypot" href="/tags/honeypot">honeypot (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged benchmark" href="/tags/benchmark">benchmark (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged curl" href="/tags/curl">curl (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged sendgrid" href="/tags/sendgrid">
1sendgrid (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged api-gateway" href="/tags/api-gateway">api-gateway (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged vultr" href="/tags/vultr">vultr (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged ssd" href="/tags/ssd">ssd (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged servers" href="/tags/servers">servers (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged bootstrap" href="/tags/bootstrap">bootstrap (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged mediawiki" href="/tags/mediawiki">mediawiki (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged wordpress" href="/tags/wordpress">wordpress (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged hetzner" href="/tags/hetzner">hetzner (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged heroku" href="/tags/heroku">heroku (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged mac" href="/tags/mac">mac (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged cheatsheet" href="/tags/cheatsheet">cheatsheet (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged troubleshooting" href="/tags/troubleshooting">troubleshooting (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged regex" href="/tags/regex">regex (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged validation" href="/tags/validation">validation (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged configs" href="/tags/configs">configs (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged postgresql" href="/tags/postgresql">postgresql (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged reverse-proxy" href="/tags/reverse-proxy">reverse-proxy (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged nrpe" href="/tags/nrpe">nrpe (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged sql" href="/tags/sql">sql (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged notifications" href="/tags/notifications">notifications (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged messages" href="/tags/messages">messages (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged hadoop" href="/tags/hadoop">hadoop (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged beeline" href="/tags/beeline">beeline (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged apt" href="/tags/apt">apt (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged debian" href="/tags/debian">debian (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged secrets-management" href="/tags/secrets-management">secrets-management (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged blackbox" href="/tags/blackbox">blackbox (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged pushgateway" href="/tags/pushgateway">pushgateway (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged prometheus-series" href="/tags/prometheus-series">prometheus-series (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged development" href="/tags/development">development (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged elk" href="/tags/elk">elk (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged kapsule" href="/tags/kapsule">kapsule (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged kinesis" href="/tags/kinesis">kinesis (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged streaming" href="/tags/streaming">streaming (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged amazon" href="/tags/amazon">amazon (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged vscode" href="/tags/vscode">vscode (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged google" href="/tags/google">google (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged ext-posts" href="/tags/ext-posts">ext-posts (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged networks" href="/tags/networks">networks (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged vpc" href="/tags/vpc">vpc (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged datadog" href="/tags/datadog">datadog (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged year-in-review" href="/tags/year-in-review">year-in-review (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged screen" href="/tags/screen">screen (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged promteheus" href="/tags/promteheus">promteheus (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged thanos" href="/tags/thanos">thanos (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged ipsec" href="/tags/ipsec">ipsec (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged covid19" href="/tags/covid19">covid19 (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged google-drive" href="/tags/google-drive">google-drive (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged gdrive" href="/tags/gdrive">gdrive (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged jq" href="/tags/jq">jq (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged json" href="/tags/json">json (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged python-rq" href="/tags/python-rq">python-rq (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged queueing" href="/tags/queueing">queueing (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged pocket" href="/tags/pocket">pocket (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged tunneling" href="/tags/tunneling">tunneling (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged oneprovider" href="/tags/oneprovider">oneprovider (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged libvirt" href="/tags/libvirt">libvirt (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged sshuttle" href="/tags/sshuttle">sshuttle (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged multipass" href="/tags/multipass">multipass (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged ccrypt" href="/tags/ccrypt">ccrypt (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged certificates" href="/tags/certificates">certificates (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged minica" href="/tags/minica">minica (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged https" href="/tags/https">https (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged arduino" href="/tags/arduino">arduino (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged nodemcu" href="/tags/nodemcu">nodemcu (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged esp32" href="/tags/esp32">esp32 (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged fluentbit" href="/tags/fluentbit">fluentbit (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged tips" href="/tags/tips">tips (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged medium" href="/tags/medium">medium (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged ssm" href="/tags/ssm">ssm (1)
1</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged iot" href="/tags/iot">iot (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged wireguard" href="/tags/wireguard">wireguard (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged task" href="/tags/task">task (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged taskfile" href="/tags/taskfile">taskfile (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged nvm" href="/tags/nvm">nvm (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged ethereum" href="/tags/ethereum">ethereum (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged geth" href="/tags/geth">geth (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged monero" href="/tags/monero">monero (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged openldap" href="/tags/openldap">openldap (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged bots" href="/tags/bots">bots (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged element" href="/tags/element">element (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged communication" href="/tags/communication">communication (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged git" href="/tags/git">git (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged discord" href="/tags/discord">discord (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged vim" href="/tags/vim">vim (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged bookmarks" href="/tags/bookmarks">bookmarks (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged self-hosted" href="/tags/self-hosted">self-hosted (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged raid" href="/tags/raid">raid (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged homebrew" href="/tags/homebrew">homebrew (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged promtail" href="/tags/promtail">promtail (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged wiremock" href="/tags/wiremock">wiremock (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged kafka" href="/tags/kafka">kafka (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged ferretdb" href="/tags/ferretdb">ferretdb (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged cert-manager" href="/tags/cert-manager">cert-manager (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged github" href="/tags/github">github (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged minecraft" href="/tags/minecraft">minecraft (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged fail2ban" href="/tags/fail2ban">fail2ban (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged it" href="/tags/it">it (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged career" href="/tags/career">career (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged qa" href="/tags/qa">qa (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged quality" href="/tags/quality">quality (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged sonarqube" href="/tags/sonarqube">sonarqube (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged claude" href="/tags/claude">claude (1)</a></li><li class="my-3"><a class="px-3 py-2 text-sm font-medium uppercase text-gray-500 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-500" aria-label="View posts tagged claude-code" href="/tags/claude-code">claude-code (1)</a></li></ul></div></div><div><ul><li class="py-5"><article class="flex flex-col space-y-2 xl:space-y-0"><dl><dt class="sr-only">Published on</dt><dd class="text-base font-medium leading-6 text-gray-500 dark:text-gray-400"><time dateTime="2026-05-08T21:48:29.000Z">May 8, 2026</time></dd></dl><div class="space-y-3"><div><h2 class="text-2xl font-bold leading-8 tracking-tight"><a class="text-gray-900 dark:text-gray-100" href="/blog/2026/05/08/how-to-use-ollama-with-claude-code">How to use Ollama with Claude Code</a></h2><div class="flex flex-wrap"><a class="mr-3 text-sm font-medium uppercase text-primary-500 hover:text-primary-600 dark:hover:text-primary-400" href="/tags/ai">ai</a><a class="mr-3 text-sm font-medium uppercase text-primary-500 hover:text-primary-600 dark:hover:text-primary-400" href="/tags/claude">claude</a><a class="mr-3 text-sm font-medium uppercase text-primary-500 hover:text-primary-600 dark:hover:text-primary-400" href="/tags/ollama">ollama</a><a class="mr-3 text-sm font-medium uppercase text-primary-500 hover:text-primary-600 dark:hover:text-primary-400" href="/tags/claude-code">claude-code</a></div></div><div class="prose max-w-none text-gray-500 dark:text-gray-400">This tutorial shows you how to use Ollama Local Models with Claude Code.</div></div></article></li><li class="py-5"><article class="flex flex-col space-y-2 xl:space-y-0"><dl><dt class="sr-only">Published on</dt><dd class="text-base font-medium leading-6 text-gray-500 dark:text-gray-400"><time dateTime="2025-06-06T11:09:46.000Z">June 6, 2025</time></dd></dl><div class="space-y-3"><div><h2 class="text-2xl font-bold leading-8 tracking-tight"><a class="text-gray-900 dark:text-gray-100" href="/blog/2025/06/06/level-up-your-code-quality-with-sonarqube---a-beginners-guide">
1Level Up your Code Quality with SonarQube - a Beginners Guide</a></h2><div class="flex flex-wrap"><a class="mr-3 text-sm font-medium uppercase text-primary-500 hover:text-primary-600 dark:hover:text-primary-400" href="/tags/qa">qa</a><a class="mr-3 text-sm font-medium uppercase text-primary-500 hover:text-primary-600 dark:hover:text-primary-400" href="/tags/quality">quality</a><a class="mr-3 text-sm font-medium uppercase text-primary-500 hover:text-primary-600 dark:hover:text-primary-400" href="/tags/sonarqube">sonarqube</a><a class="mr-3 text-sm font-medium uppercase text-primary-500 hover:text-primary-600 dark:hover:text-primary-400" href="/tags/python">python</a></div></div><div class="prose max-w-none text-gray-500 dark:text-gray-400">Learn what SonarQube is and how it helps improve code quality by detecting bugs, security issues, and code smells before they reach production. In this beginner-friendly guide, we’ll walk through a simple Python example, explore common code smells, and show you how to run SonarQube locally using Docker Compose. Perfect for junior developers, students, and QA engineers looking to improve their code review process and CI pipeline.</div></div></article></li><li class="py-5"><article class="flex flex-col space-y-2 xl:space-y-0"><dl><dt class="sr-only">Published on</dt><dd class="text-base font-medium leading-6 text-gray-500 dark:text-gray-400"><time dateTime="2025-06-04T16:35:57.000Z">June 4, 2025</time></dd></dl><div class="space-y-3"><div><h2 class="text-2xl font-bold leading-8 tracking-tight"><a class="text-gray-900 dark:text-gray-100" href="/blog/2025/06/04/how-to-choose-a-career-in-it">How to Choose a Career in IT - A Practical Guide</a></h2><div class="flex flex-wrap"><a class="mr-3 text-sm font-medium uppercase text-primary-500 hover:text-primary-600 dark:hover:text-primary-400" href="/tags/it">it</a><a class="mr-3 text-sm font-medium uppercase text-primary-500 hover:text-primary-600 dark:hover:text-primary-400" href="/tags/career">career</a></div></div><div class="prose max-w-none text-gray-500 dark:text-gray-400">Discover how to choose the right IT career path based on your interests, skills, and long-term goals.</div></div></article></li><li class="py-5"><article class="flex flex-col space-y-2 xl:space-y-0"><dl><dt class="sr-only">Published on</dt><dd class="text-base font-medium leading-6 text-gray-500 dark:text-gray-400"><time dateTime="2025-02-14T21:36:25.000Z">February 14, 2025</time></dd></dl><div class="space-y-3"><div><h2 class="text-2xl font-bold leading-8 tracking-tight"><a class="text-gray-900 dark:text-gray-100" href="/blog/2025/02/14/building-a-local-ai-assistant-with-llama-cpp-python">Building a Local AI Assistant with llama-cpp-python</a></h2><div class="flex flex-wrap"><a class="mr-3 text-sm font-medium uppercase text-primary-500 hover:text-primary-600 dark:hover:text-primary-400" href="/tags/python">python</a><a class="mr-3 text-sm font-medium uppercase text-primary-500 hover:text-primary-600 dark:hover:text-primary-400" href="/tags/ollama">ollama</a><a class="mr-3 text-sm font-medium uppercase text-primary-500 hover:text-primary-600 dark:hover:text-primary-400" href="/tags/ai">ai</a><a class="mr-3 text-sm font-medium uppercase text-primary-500 hover:text-primary-600 dark:hover:text-primary-400" href="/tags/engineering">engineering</a></div></div><div class="prose max-w-none text-gray-500 dark:text-gray-400">Learn how to build a local AI assistant using llama-cpp-python. This guide covers installing the model, adding conversation memory, and integrating external tools for automation, web scraping, and real-time data retrieval.</div></div></article></li><li class="py-5"><article class="flex flex-col space-y-2 xl:space-y-0"><dl><dt class="sr-only">Published on</dt><dd class="text-base font-medium leading-6 text-gray-500 dark:text-gray-400"><time dateTime="2025-02-14T20:54:57.000Z">February 14, 2025</time></dd></dl><div class="space-y-3"><div><h2 class="text-2xl font-bold leading-8 tracking-tight"><a class="text-gray-900 dark:text-gray-100" href="/blog/2025/02/14/getting-started-with-ollama-and-llms-in-python">Getting Started with Ollama and LLMs in Python</a></h2><div class="flex flex-wrap"><a class="mr-3 text-sm font-medium uppercase text-primary-500 hover:text-primary-600 dark:hover:text-primary-400" href="/tags/python">python</a><a class="mr-3 text-sm font-medium uppercase text-primary-500 hover:text-primary-600 dark:hover:text-primary-400" href="/tags/ollama">ollama</a><a class="mr-3 text-sm font-medium uppercase text-primary-500 hover:text-primary-600 dark:hover:text-primary-400" href="/tags/ai">ai</a><a class="mr-3 text-sm font-medium uppercase text-primary-500 hover:text-primary-600 dark:hover:text-primary-400" href="/tags/engineering">engineering</a></div></div><div class="prose max-w-none text-gray-500 dark:text-gray-400">Learn how to run Large Language Models (LLMs) locally using Ollama and integrate them into Python with langchain-ollama. A step-by-step guide for setting up and generating AI-powered responses.</div></div></article></li></ul><div class="space-y-2 pb-8 pt-6 md:space-y-5"><nav class="flex justify-between"><button class="cursor-auto disabled:opacity-50" disabled="">Previous</button><span>1<!-- --> of <!-- -->79</span><a rel="next" href="/blog/page/2">Next</a></nav></div></div></div></div></main><footer><div class="mt-16 flex flex-col items-center"><div class="mb-3 flex space-x-4"><a class="text-sm text-gray-500 transition hover:text-gray-600" target="_blank" rel="noopener noreferrer" href="mailto:[email protected]"><span class="sr-only">mail</span><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" class="fill-current text-gray-700 hover:text-primary-500 dark:text-gray-200 dark:hover:text-primary-400 h-6 w-6"><path d="M2.003 5.884L10 9.882l7.997-3.998A2 2 0 0016 4H4a2 2 0 00-1.997 1.884z"></path><path d="M18 8.118l-8 4-8-4V14a2 2 0 002 2h12a2 2 0 002-2V8.118z"></path></svg></a><a class="text-sm text-gray-500 transition hover:text-gray-600" target="_blank" rel="noopener noreferrer" href="https://github.com/ruanbekker"><span class="sr-only">github</span><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" class="fill-current text-gray-700 hover:text-primary-500 dark:text-gray-200 dark:hover:text-primary-400 h-6 w-6"><path d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"></path></svg></a><a class="text-sm text-gray-500 transition hover:text-gray-600" target="_blank" rel="noopener noreferrer" href="https://www.linkedin.com/in/ruanbekker"><span class="sr-only">linkedin</span><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" class="fill-current text-gray-700 hover:text-primary-500 dark:text-gray-200 dark:hover:text-primary-400 h-6 w-6"><path d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433a2.062 2.062 0 01-2.063-2.065 2.064 2.064 0 112.063 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z"></path></svg></a><a class="text-sm text-gray-500 transition hover:text-gray-600" target="_blank" rel="noopener noreferrer" href="https://twitter.com/ruanbekker"><span class="sr-only">twitter</span><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" class="fill-current text-gray-700 hover:text-primary-500 dark:text-gray-200 dark:hover:text-primary-400 h-6 w-6"><path d="M23.953 4.57a10 10 0 01-2.825.775 4.958 4.958 0 002.163-2.723c-.951.555-2.005.959-3.127 1.184a4.92 4.92 0 00-8.384 4.482C7.69 8.095 4.067 6.13 1.64 3.162a4.822 4.822 0 00-.666 2.475c0 1.71.87 3.213 2.188 4.096a4.904 4.904 0 01-2.228-.616v.06a4.923 4.923 0 003.946 4.827 4.996 4.996 0 01-2.212.085 4.936 4.936 0 004.604 3.417 9.867 9.867 0 01-6.102 2.105c-.39 0-.779-.023-1.17-.067a13.995 13.995 0 007.557 2.209c9.053 0 13.998-7.496 13.998-13.985 0-.21 0-.42-.015-.63A9.935 9.935 0 0024 4.59z"></path></svg></a></div><div class="mb-2 flex space-x-2 text-sm text-gray-500 dark:text-gray-400"><div>Ruan Bekker</div><div> • </div><div>© 2026</div><div> • </div><a href="/">Ruan Bekker&#x27;s Blog</a></div><div class="mb-8 text-sm text-gray-500 dark:text-gray-400"><a target="_blank" rel="noopener noreferrer" href="https://github.com/timlrx/tailwind-nextjs-starter-blog">Tailwind Nextjs Theme</a></div></div></footer></div></section>
1<script src="/_next/static/chunks/webpack-59aef84eb31a1827.js" crossorigin="" async=""></script>
1<script>(self.__next_f=self.__next_f||[]).push([0]);self.__next_f.push([2,null])</script>
1<script>self.__next_f.push([1,"1:HL[\"/_next/static/media/e4af272ccee01ff0-s.p.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n2:HL[\"/_next/static/css/9dd4d946fd0a49a1.css\",\"style\",{\"crossOrigin\":\"\"}]\n3:HL[\"/_next/static/css/73ad1a599336f265.css\",\"style\",{\"crossOrigin\":\"\"}]\n0:\"$L4\"\n"])</script>
1<script>self.__next_f.push([1,"5:I[3728,[],\"\"]\n7:I[9928,[],\"\"]\n8:I[7821,[\"326\",\"static/chunks/326-4c48d497d1f9fab1.js\",\"185\",\"static/chunks/app/layout-ccce6f197a5b4252.js\"],\"ThemeProviders\"]\n9:I[3994,[\"326\",\"static/chunks/326-4c48d497d1f9fab1.js\",\"185\",\"static/chunks/app/layout-ccce6f197a5b4252.js\"],\"\"]\na:I[8251,[\"326\",\"static/chunks/326-4c48d497d1f9fab1.js\",\"185\",\"static/chunks/app/layout-ccce6f197a5b4252.js\"],\"KBarSearchProvider\"]\nb:I[8326,[\"326\",\"static/chunks/326-4c48d497d1f9fab1.js\",\"413\",\"static/chunks/413-b075cc12d1858dcb.js\",\"931"])</script>
1<script>self.__next_f.push([1,"\",\"static/chunks/app/page-36c67a19cdf4edae.js\"],\"\"]\nc:I[7005,[\"326\",\"static/chunks/326-4c48d497d1f9fab1.js\",\"185\",\"static/chunks/app/layout-ccce6f197a5b4252.js\"],\"KBarButton\"]\nd:I[5235,[\"326\",\"static/chunks/326-4c48d497d1f9fab1.js\",\"185\",\"static/chunks/app/layout-ccce6f197a5b4252.js\"],\"\"]\ne:I[2298,[\"326\",\"static/chunks/326-4c48d497d1f9fab1.js\",\"185\",\"static/chunks/app/layout-ccce6f197a5b4252.js\"],\"\"]\nf:I[6954,[],\"\"]\n10:I[7264,[],\"\"]\n12:I[2330,[\"326\",\"static/chunks/326-4c48d497d1f9fab1.js\",\"529\",\"static/chun"])</script>
1<script>self.__next_f.push([1,"ks/529-20cbed04a20570d5.js\",\"404\",\"static/chunks/app/blog/page-52ea55f5a1af43b1.js\"],\"\"]\n"])</script>
1<script>self.__next_f.push([1,"4:[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/9dd4d946fd0a49a1.css\",\"precedence\":\"next\",\"crossOrigin\":\"\"}],[\"$\",\"link\",\"1\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/73ad1a599336f265.css\",\"precedence\":\"next\",\"crossOrigin\":\"\"}]],[\"$\",\"$L5\",null,{\"buildId\":\"1H2RrHFn84inA1FpTuHm0\",\"assetPrefix\":\"\",\"initialCanonicalUrl\":\"/blog\",\"initialTree\":[\"\",{\"children\":[\"blog\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],\"initialHead\":[false,\"$L6\"],\"globalErrorComponent\":\"$7\",\"children\":[null,[\"$\",\"html\",null,{\"lang\":\"en-us\",\"className\":\"__variable_f367f3 scroll-smooth\",\"suppressHydrationWarning\":true,\"children\":[[\"$\",\"link\",null,{\"rel\":\"apple-touch-icon\",\"sizes\":\"76x76\",\"href\":\"/static/favicons/apple-touch-icon.png\"}],[\"$\",\"link\",null,{\"rel\":\"icon\",\"type\":\"image/png\",\"sizes\":\"32x32\",\"href\":\"/static/favicons/favicon-32x32.png\"}],[\"$\",\"link\",null,{\"rel\":\"icon\",\"type\":\"image/png\",\"sizes\":\"16x16\",\"href\":\"/static/favicons/favicon-16x16.png\"}],[\"$\",\"link\",null,{\"rel\":\"manifest\",\"href\":\"/static/favicons/site.webmanifest\"}],[\"$\",\"link\",null,{\"rel\":\"mask-icon\",\"href\":\"/static/favicons/safari-pinned-tab.svg\",\"color\":\"#5bbad5\"}],[\"$\",\"script\",null,{\"async\":true,\"type\":\"text/javascript\",\"src\":\"//cdn.carbonads.com/carbon.js?serve=CEAIP2JL\u0026placement=blogruanbekkercom\",\"id\":\"_carbonads_js\"}],[\"$\",\"script\",null,{\"defer\":true,\"src\":\"https://umami-analytics.ruan.dev/script.js\",\"data-website-id\":\"cc66d8aa-8f42-4d94-8fd7-c87f69f3b03a\"}],[\"$\",\"meta\",null,{\"name\":\"msapplication-TileColor\",\"content\":\"#000000\"}],[\"$\",\"meta\",null,{\"name\":\"theme-color\",\"media\":\"(prefers-color-scheme: light)\",\"content\":\"#fff\"}],[\"$\",\"meta\",null,{\"name\":\"theme-color\",\"media\":\"(prefers-color-scheme: dark)\",\"content\":\"#000\"}],[\"$\",\"link\",null,{\"rel\":\"alternate\",\"type\":\"application/rss+xml\",\"href\":\"/feed.xml\"}],[\"$\",\"body\",null,{\"className\":\"bg-white text-black antialiased dark:bg-gray-950 dark:text-white\",\"children\":[\"$\",\"$L8\",null,{\"children\":[[\"$undefined\",\"$undefined\",\"$undefined\",[\"$\",\"$L9\",null,{\"async\":true,\"defer\":true,\"data-website-id\":\"3aaa2a70-c2ba-42bf-93be-b7e7a29fbb77\",\"src\":\"https://analytics.umami.is/script.js\"}],[[\"$\",\"$L9\",null,{\"strategy\":\"afterInteractive\",\"src\":\"https://www.googletagmanager.com/gtag/js?id=G-GBW0KS3BZH\"}],[\"$\",\"$L9\",null,{\"strategy\":\"afterInteractive\",\"id\":\"ga-script\",\"children\":\"\\n            window.dataLayer = window.dataLayer || [];\\n            function gtag(){dataLayer.push(arguments);}\\n            gtag('js', new Date());\\n            gtag('config', 'G-GBW0KS3BZH');\\n        \"}]]],[\"$\",\"section\",null,{\"className\":\"mx-auto max-w-3xl px-4 sm:px-6 xl:max-w-5xl xl:px-0\",\"children\":[\"$\",\"div\",null,{\"className\":\"flex h-screen flex-col justify-between font-sans\",\"children\":[[\"$\",\"$La\",null,{\"kbarConfig\":{\"searchDocumentsPath\":\"search.json\"},\"children\":[[\"$\",\"header\",null,{\"className\":\"flex items-center justify-between py-10\",\"children\":[[\"$\",\"div\",null,{\"children\":[\"$\",\"$Lb\",null,{\"href\":\"/\",\"aria-label\":\"Ruan Bekker's Blog\",\"children\":[\"$\",\"div\",null,{\"className\":\"flex items-center justify-between\",\"children\":[[\"$\",\"div\",null,{\"className\":\"mr-3\",\"children\":[\"$\",\"svg\",null,{\"xmlns\":\"http://www.w3.org/2000/svg\",\"xmlnsXlink\":\"http://www.w3.org/1999/xlink\",\"width\":53.87,\"height\":43.61,\"viewBox\":\"344.564 330.278 111.737 91.218\",\"children\":[[\"$\",\"defs\",null,{\"children\":[[\"$\",\"linearGradient\",null,{\"id\":\"logo_svg__b\",\"x1\":420.97,\"x2\":420.97,\"y1\":331.28,\"y2\":418.5,\"gradientUnits\":\"userSpaceOnUse\",\"children\":[[\"$\",\"stop\",null,{\"offset\":\"0%\",\"style\":{\"stopColor\":\"#06b6d4\",\"stopOpacity\":1}}],[\"$\",\"stop\",null,{\"offset\":\"100%\",\"style\":{\"stopColor\":\"#67e8f9\",\"stopOpacity\":1}}]]}],[\"$\",\"linearGradient\",null,{\"id\":\"logo_svg__d\",\"x1\":377.89,\"x2\":377.89,\"y1\":331.28,\"y2\":418.5,\"gradientUnits\":\"userSpaceOnUse\",\"children\":[[\"$\",\"stop\",null,{\"offset\":\"0%\",\"style\":{\"stopColor\":\"#06b6d4\",\"stopOpacity\":1}}],[\"$\",\"stop\",null,{\"offset\":\"100%\",\"style\":{\"stopColor\":\"#67e8f9\",\"stopOpacity\":1}}]]}],[\"$\",\"path\",null,{\"id\":\"logo_svg__a\",\"d\":\"M453.3 331.28v28.57l-64.66 58.65v-30.08l64.66-57.14Z\"}],[\"$\",\"path\",null,{\"id\":\"logo_svg__c\",\"d\":\"M410.23 331.28v28.57l-64.67 58.65v-30.08l64.67-57.14Z\"}]]}],[\"$\",\"use\",null,{\"xlinkHref\":\"#logo_svg__a\",\"fill\":\"url(#logo_svg__b)\"}],[\"$\",\"use\",null,{\"xlinkHref\":\"#logo_svg__c\",\"fill\":\"url(#logo_svg__d)\"}]]}]}],[\"$\",\"div\",null,{\"className\":\"hidden h-6 text-2xl font-semibold sm:block\",\"children\":\"Ruan Bekker's Blog\"}]]}]}]}],[\"$\",\"div\",null,{\"className\":\"flex items-center space-x-4 leading-5 sm:space-x-6\",\"children\":[[[\"$\",\"$Lb\",null,{\"href\":\"/blog\",\"className\":\"hidden font-medium text-gray-900 dark:text-gray-100 sm:block\",\"children\":\"Blog\"}],[\"$\",\"$Lb\",null,{\"href\":\"/tags\",\"className\":\"hidden font-medium text-gray-900 dark:text-gray-100 sm:block\",\"children\":\"Tags\"}],[\"$\",\"$Lb\",null,{\"href\":\"/projects\",\"className\":\"hidden font-medium text-gray-900 dark:text-gray-100 sm:block\",\"children\":\"Projects\"}],[\"$\",\"$Lb\",null,{\"href\":\"/resume\",\"className\":\"hidden font-medium text-gray-900 dark:text-gray-100 sm:block\",\"children\":\"Resume\"}],[\"$\",\"$Lb\",null,{\"href\":\"/about\",\"className\":\"hidden font-medium text-gray-900 dark:text-gray-100 sm:block\",\"children\":\"About\"}],[\"$\",\"$Lb\",null,{\"href\":\"/newsletter\",\"className\":\"hidden font-medium text-gray-900 dark:text-gray-100 sm:block\",\"children\":\"Newsletter\"}]],[\"$\",\"$Lc\",null,{\"aria-label\":\"Search\",\"children\":[\"$\",\"svg\",null,{\"xmlns\":\"http://www.w3.org/2000/svg\",\"fill\":\"none\",\"viewBox\":\"0 0 24 24\",\"strokeWidth\":1.5,\"stroke\":\"currentColor\",\"className\":\"h-6 w-6 text-gray-900 dark:text-gray-100\",\"children\":[\"$\",\"path\",null,{\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"d\":\"M21 21l-5.197-5.197m0 0A7.5 7.5 0 105.196 5.196a7.5 7.5 0 0010.607 10.607z\"}]}]}],[\"$\",\"$Ld\",null,{}],[\"$\",\"$Le\",null,{}]]}]]}],[\"$\",\"main\",null,{\"className\":\"mb-auto\",\"children\":[\"$\",\"$Lf\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\"],\"loading\":\"$undefined\",\"loadingStyles\":\"$undefined\",\"hasLoading\":false,\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"template\":[\"$\",\"$L10\",null,{}],\"templateStyles\":\"$undefined\",\"notFound\":[\"$\",\"div\",null,{\"className\":\"flex flex-col items-start justify-start md:mt-24 md:flex-row md:items-center md:justify-center md:space-x-6\",\"children\":[[\"$\",\"div\",null,{\"className\":\"space-x-2 pb-8 pt-6 md:space-y-5\",\"children\":[\"$\",\"h1\",null,{\"className\":\"text-6xl font-extrabold leading-9 tracking-tight text-gray-900 dark:text-gray-100 md:border-r-2 md:px-6 md:text-8xl md:leading-14\",\"children\":\"404\"}]}],[\"$\",\"div\",null,{\"className\":\"max-w-md\",\"children\":[[\"$\",\"p\",null,{\"className\":\"mb-4 text-xl font-bold leading-normal md:text-2xl\",\"children\":\"Sorry we couldn't find this page.\"}],[\"$\",\"p\",null,{\"className\":\"mb-8\",\"children\":\"But dont worry, you can find plenty of other things on our homepage.\"}],[\"$\",\"$Lb\",null,{\"href\":\"/\",\"className\":\"focus:shadow-outline-blue inline rounded-lg border border-transparent bg-blue-600 px-4 py-2 text-sm font-medium leading-5 text-white shadow transition-colors duration-150 hover:bg-blue-700 focus:outline-none dark:hover:bg-blue-500\",\"children\":\"Back to homepage\"}]]}]]}],\"notFoundStyles\":[],\"childProp\":{\"current\":[\"$\",\"$Lf\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\",\"blog\",\"children\"],\"loading\":\"$undefined\",\"loadingStyles\":\"$undefined\",\"hasLoading\":false,\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"template\":[\"$\",\"$L10\",null,{}],\"templateStyles\":\"$undefined\",\"notFound\":\"$undefined\",\"notFoundStyles\":\"$undefined\",\"childProp\":{\"current\":[\"$L11\",[\"$\",\"$L12\",null,{\"posts\":[{\"title\":\"How to use Ollama with Claude Code\",\"date\":\"2026-05-08T21:48:29.000Z\",\"tags\":[\"ai\",\"claude\",\"ollama\",\"claude-code\"],\"draft\":false,\"summary\":\"This tutorial shows you how to use Ollama Local Models with Claude Code.\",\"images\":[\"/static/images/ruan-dev-default-image.png\"],\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"3 min read\",\"minutes\":2.13,\"time\":127800,\"words\":426}
1,\"slug\":\"2026/05/08/how-to-use-ollama-with-claude-code\",\"path\":\"blog/2026/05/08/how-to-use-ollama-with-claude-code\",\"filePath\":\"blog/2026/05/08/how-to-use-ollama-with-claude-code.mdx\",\"toc\":[{\"value\":\"Ollama\",\"url\":\"#ollama\",\"depth\":2},{\"value\":\"Claude Code\",\"url\":\"#claude-code\",\"depth\":2},{\"value\":\"Testing Claude Code\",\"url\":\"#testing-claude-code\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"How to use Ollama with Claude Code\",\"datePublished\":\"2026-05-08T21:48:29.000Z\",\"dateModified\":\"2026-05-08T21:48:29.000Z\",\"description\":\"This tutorial shows you how to use Ollama Local Models with Claude Code.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2026/05/08/how-to-use-ollama-with-claude-code\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Level Up your Code Quality with SonarQube - a Beginners Guide\",\"date\":\"2025-06-06T11:09:46.000Z\",\"tags\":[\"qa\",\"quality\",\"sonarqube\",\"python\"],\"draft\":false,\"summary\":\"Learn what SonarQube is and how it helps improve code quality by detecting bugs, security issues, and code smells before they reach production. In this beginner-friendly guide, we’ll walk through a simple Python example, explore common code smells, and show you how to run SonarQube locally using Docker Compose. Perfect for junior developers, students, and QA engineers looking to improve their code review process and CI pipeline.\",\"images\":[\"/static/images/ruan-dev-default-image.png\"],\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"10 min read\",\"minutes\":9.12,\"time\":547200,\"words\":1824},\"slug\":\"2025/06/06/level-up-your-code-quality-with-sonarqube---a-beginners-guide\",\"path\":\"blog/2025/06/06/level-up-your-code-quality-with-sonarqube---a-beginners-guide\",\"filePath\":\"blog/2025/06/06/level-up-your-code-quality-with-sonarqube---a-beginners-guide.mdx\",\"toc\":[{\"value\":\"What is SonarQube?\",\"url\":\"#what-is-sonarqube\",\"depth\":2},{\"value\":\"Why use SonarQube?\",\"url\":\"#why-use-sonarqube\",\"depth\":2},{\"value\":\"How to SonarQube sits in your workflow\",\"url\":\"#how-to-sonarqube-sits-in-your-workflow\",\"depth\":2},{\"value\":\"Example use-case using SonarQube\",\"url\":\"#example-use-case-using-sonarqube\",\"depth\":2},{\"value\":\"Example of Code Smells\",\"url\":\"#example-of-code-smells\",\"depth\":2},{\"value\":\"Code Smell Example 1\",\"url\":\"#code-smell-example-1\",\"depth\":3},{\"value\":\"Code Smell Example 2\",\"url\":\"#code-smell-example-2\",\"depth\":3},{\"value\":\"Motivation for integrating SonarQube into your CI Pipeline\",\"url\":\"#motivation-for-integrating-sonarqube-into-your-ci-pipeline\",\"depth\":2},{\"value\":\"Implementing SonarQube with Python and Github Actions\",\"url\":\"#implementing-sonarqube-with-python-and-github-actions\",\"depth\":2},{\"value\":\"SonarQube on Docker\",\"url\":\"#sonarqube-on-docker\",\"depth\":3},{\"value\":\"Github Actions Runner\",\"url\":\"#github-actions-runner\",\"depth\":3},{\"value\":\"Python Application\",\"url\":\"#python-application\",\"depth\":3},{\"value\":\"Configure SonarQube Project\",\"url\":\"#configure-sonarqube-project\",\"depth\":3},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Level Up your Code Quality with SonarQube - a Beginners Guide\",\"datePublished\":\"2025-06-06T11:09:46.000Z\",\"dateModified\":\"2025-06-06T11:09:46.000Z\",\"description\":\"Learn what SonarQube is and how it helps improve code quality by detecting bugs, security issues, and code smells before they reach production. In this beginner-friendly guide, we’ll walk through a simple Python example, explore common code smells, and show you how to run SonarQube locally using Docker Compose. Perfect for junior developers, students, and QA engineers looking to improve their code review process and CI pipeline.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2025/06/06/level-up-your-code-quality-with-sonarqube---a-beginners-guide\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"How to Choose a Career in IT - A Practical Guide\",\"date\":\"2025-06-04T16:35:57.000Z\",\"tags\":[\"it\",\"career\"],\"draft\":false,\"summary\":\"Discover how to choose the right IT career path based on your interests, skills, and long-term goals.\",\"images\":[\"/static/images/ruan-dev-default-image.png\"],\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"14 min read\",\"minutes\":13.615,\"time\":816900,\"words\":2723},\"slug\":\"2025/06/04/how-to-choose-a-career-in-it\",\"path\":\"blog/2025/06/04/how-to-choose-a-career-in-it\",\"filePath\":\"blog/2025/06/04/how-to-choose-a-career-in-it.mdx\",\"toc\":[{\"value\":\"Story-Time from my last 15 Years of Experience\",\"url\":\"#story-time-from-my-last-15-years-of-ex
1perience\",\"depth\":2},{\"value\":\"Why am I telling you all this?\",\"url\":\"#why-am-i-telling-you-all-this\",\"depth\":3},{\"value\":\"Getting Started in IT\",\"url\":\"#getting-started-in-it\",\"depth\":2},{\"value\":\"If I had to start all over again\",\"url\":\"#if-i-had-to-start-all-over-again\",\"depth\":2},{\"value\":\"Gaining Experience Without a Job\",\"url\":\"#gaining-experience-without-a-job\",\"depth\":2},{\"value\":\"Popular IT Career Paths with Descriptions\",\"url\":\"#popular-it-career-paths-with-descriptions\",\"depth\":2},{\"value\":\"A Day in the Life (Role Scenarios)\",\"url\":\"#a-day-in-the-life-role-scenarios\",\"depth\":2},{\"value\":\"Career Path Diagrams\",\"url\":\"#career-path-diagrams\",\"depth\":2},{\"value\":\"Online Courses\",\"url\":\"#online-courses\",\"depth\":2},{\"value\":\"Career Roadmaps\",\"url\":\"#career-roadmaps\",\"depth\":2},{\"value\":\"Final Thoughts\",\"url\":\"#final-thoughts\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"How to Choose a Career in IT - A Practical Guide\",\"datePublished\":\"2025-06-04T16:35:57.000Z\",\"dateModified\":\"2025-06-04T16:35:57.000Z\",\"description\":\"Discover how to choose the right IT career path based on your interests, skills, and long-term goals.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2025/06/04/how-to-choose-a-career-in-it\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Building a Local AI Assistant with llama-cpp-python\",\"date\":\"2025-02-14T21:36:25.000Z\",\"tags\":[\"python\",\"ollama\",\"ai\",\"engineering\"],\"draft\":false,\"summary\":\"Learn how to build a local AI assistant using llama-cpp-python. This guide covers installing the model, adding conversation memory, and integrating external tools for automation, web scraping, and real-time data retrieval.\",\"images\":[\"/static/images/ruan-dev-default-image.png\"],\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"12 min read\",\"minutes\":11.93,\"time\":715800,\"words\":2386},\"slug\":\"2025/02/14/building-a-local-ai-assistant-with-llama-cpp-python\",\"path\":\"blog/2025/02/14/building-a-local-ai-assistant-with-llama-cpp-python\",\"filePath\":\"blog/2025/02/14/building-a-local-ai-assistant-with-llama-cpp-python.mdx\",\"toc\":[{\"value\":\"What is llama-cpp-python\",\"url\":\"#what-is-llama-cpp-python\",\"depth\":2},{\"value\":\"Installing llama-cpp-python\",\"url\":\"#installing-llama-cpp-python\",\"depth\":2},{\"value\":\"Downloading a Small Llama Model\",\"url\":\"#downloading-a-small-llama-model\",\"depth\":2},{\"value\":\"Running Llama Locally with Python\",\"url\":\"#running-llama-locally-with-python\",\"depth\":2},{\"value\":\"Adding Persistent Memory and Selective Recall\",\"url\":\"#adding-persistent-memory-and-selective-recall\",\"depth\":2},{\"value\":\"Define Important Facts vs Small Talk\",\"url\":\"#define-important-facts-vs-small-talk\",\"depth\":2},{\"value\":\"Testing our bot\",\"url\":\"#testing-our-bot\",\"depth\":2},{\"value\":\"Integrate External Tasks within our Chatbot\",\"url\":\"#integrate-external-tasks-within-our-chatbot\",\"depth\":2},{\"value\":\"Modular Task Execution\",\"url\":\"#modular-task-execution\",\"depth\":2},{\"value\":\"Create the Task Manager\",\"url\":\"#create-the-task-manager\",\"depth\":2},{\"value\":\"Implement Task Execution\",\"url\":\"#implement-task-execution\",\"depth\":2},{\"value\":\"Task Automation (System Commands)\",\"url\":\"#task-automation-system-commands\",\"depth\":2},{\"value\":\"Web Scraping for News\",\"url\":\"#web-scraping-for-news\",\"depth\":2},{\"value\":\"Calling APIs (Crypto Prices)\",\"url\":\"#calling-apis-crypto-prices\",\"depth\":2},{\"value\":\"Running our AI Assistant\",\"url\":\"#running-our-ai-assistant\",\"depth\":2},{\"value\":\"Next Steps\",\"url\":\"#next-steps\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Building a Local AI Assistant with llama-cpp-python\",\"datePublished\":\"2025-02-14T21:36:25.000Z\",\"dateModified\":\"2025-02-14T21:36:25.000Z\",\"description\":\"Learn how to build a local AI assistant using llama-cpp-python. This guide covers installing the model, adding conversation memory, and integrating external tools for automation, web scraping, and real-time data retrieval.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2025/02/14/building-a-local-ai-assistant-with-llama-cpp-python\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Getting Started with Ollama and LLMs in Python\",\"date\":\"2025-02-14T20:54:57.000Z\",\"tags\":[\"python\",\"ollama\",\"ai\",\"engineering\"],\"draft\":false,\"summary\":\"Learn how to run Large Language Models (LLMs) locally using Ollama and integrate them into Python with langchain-ollama. A step-by-step guide for setting up and generating AI-powered responses.\",\"images\":[\"/static/images/ollama-llm-python-langchain.png\"],\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"3 min read\",\"minutes\":2.425,\"time\":145500,\"words\":485},\"slug\":\"2025/02/14/getting-started-with-ollama-and-llms-in-python\",\"path\":\"blog/2025/02/14/getting-started-with-ollama-and-llms-in-python\",\"filePath\":\"blog/2025/02/14/getting-started-with-ollama-and-llms-in-python.mdx\",\"toc\":[{\"value\":\"Introduction\",\"url\":\"#introduction\",\"depth\":2},{\"value\":\"What is Ollama?\",\"url\":\"#what-is-ollama\",\"depth\":2},{\"value\":\"What is an LLM (Large Language Model)\",\"url\":\"#what-is-an-llm-large-language-model\",\"depth\":2},{\"value\":\"Setting Up Ollama in Python\",\"url\":\"#setting-up-ollama-in-python\",\"depth\":2},{\"value\":\"Installing the Python Libraries\",\"url\":\"#installing-the-python-libraries\",\"depth\":2},{\"value\":\"Use Ollama with LangChain in Python\",\"url\":\"#use-ollama-with-langchain-in-python\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Getting Started with Ollama and LLMs in Python\",\"datePublished\":\"2025-02-14T20:54:57.000Z\",\"dateModified\":\"2025-02-14T20:54:57.000Z\",\"description\":\"Learn how to run Large Language Models (LLMs) locally using Ollama and integrate them into Python with langchain-ollama. A step-by-step guide for setting up and generating AI-powered responses.\",\"image\":\"/static/images/ollama-llm-python-langchain.png\",\"url\":\"https://ruan.dev/blog/2025/02/14/getting-started-with-ollama-and-llms-in-python\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"GitOps: ArgoCD Basics\",\"date\":\"2025-01-30T16:15:07.000Z\",\"tags\":[\"gitops\",\"devops\",\"argocd\",\"engineering\"],\"draft\":false,\"summary\":\"This tutorial shows you how to get started with ArgoCD and we will jump into some basics to understand how it works.\",\"images\":[\"/static/images/ruan-dev-default-image.png\"],\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"4 min read\",\"minutes\":3.705,\"time\":222300,\"words\":741},\"slug\":\"2025/01/30/gitops-argocd-basics\",\"path\":\"blog/2025/01/30/gitops-argocd-basics\",\"filePath\":\"blog/2025/01/30/gitops-argocd-basics.mdx\",\"toc\":[{\"value\":\"Introduction to ArgoCD\",\"url\":\"#introduction-to-argocd\",\"depth\":2},{\"value\":\"Installing ArgoCD\",\"url\":\"#installing-argocd\",\"depth\":2},{\"value\":\"Accessing ArgoCD\",\"url\":\"#accessing-argocd\",\"depth\":2},{\"value\":\"Creating Applications on ArgoCD\",\"url\":\"#creating-applications-on-argocd\",\"depth\":2},{\"value\":\"Creating Applications via the WebUI\",\"url\":\"#creating-applications-via-the-webui\",\"depth\":3},{\"value\":\"Creating Applications via the CLI\",\"url\":\"#creating-applications-via-the-cli\",\"depth\":3},{\"value\":\"Creating Applications Declaratively\",\"url\":\"#creating-applications-declaratively\",\"depth\":3},{\"value\":\"Synchronization with ArgoCD\",\"url\":\"#synchronization-with-argocd\",\"depth\":2},{\"value\":\"Up Next\",\"url\":\"#up-next\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"GitOps: ArgoCD Basics\",\"datePublished\":\"2025-01-30T16:15:07.000Z\",\"dateModified\":\"2025-01-30T16:15:07.000Z\",\"description\":\"This tutorial shows you how to get started with ArgoCD and we will jump into some basics to understand how it works.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2025/01/30/gitops-argocd-basics\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"GitOps Fundamentals: a Better Way to Deliver Software\",\"date\":\"2025-01-28T21:10:34.000Z\",\"tags\":[\"gitops\",\"devops\",\"argocd\",\"engineering\"],\"draft\":false,\"summary\":\"Discover how GitOps revolutionizes application and infrastru
1cture management by leveraging Git as the single source of truth. This blog explores the core principles, key use cases, and benefits of GitOps, including faster deployments, automated rollbacks, and drift detection.\",\"images\":[\"/static/images/gitops-fundamentals-what-is-gitops.png\"],\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"3 min read\",\"minutes\":2.985,\"time\":179100,\"words\":597},\"slug\":\"2025/01/28/gitops-fundamentals-a-better-way-to-deliver-software\",\"path\":\"blog/2025/01/28/gitops-fundamentals-a-better-way-to-deliver-software\",\"filePath\":\"blog/2025/01/28/gitops-fundamentals-a-better-way-to-deliver-software.mdx\",\"toc\":[{\"value\":\"What is GitOps?\",\"url\":\"#what-is-gitops\",\"depth\":2},{\"value\":\"Key GitOps Principles\",\"url\":\"#key-gitops-principles\",\"depth\":2},{\"value\":\"GitOps Use Cases\",\"url\":\"#gitops-use-cases\",\"depth\":2},{\"value\":\"Continuous Deployment of Applications\",\"url\":\"#continuous-deployment-of-applications\",\"depth\":3},{\"value\":\"Cluster Resource Management\",\"url\":\"#cluster-resource-management\",\"depth\":3},{\"value\":\"Infrastructure as Code\",\"url\":\"#infrastructure-as-code\",\"depth\":3},{\"value\":\"Detecting and Avoiding Configuration Drift\",\"url\":\"#detecting-and-avoiding-configuration-drift\",\"depth\":3},{\"value\":\"Multi-Cluster Deployments\",\"url\":\"#multi-cluster-deployments\",\"depth\":3},{\"value\":\"Benefits and Challenges of GitOps\",\"url\":\"#benefits-and-challenges-of-gitops\",\"depth\":2},{\"value\":\"Why Adopt GitOps?\",\"url\":\"#why-adopt-gitops\",\"depth\":3},{\"value\":\"Challenges to Consider\",\"url\":\"#challenges-to-consider\",\"depth\":3},{\"value\":\"Final Thoughts\",\"url\":\"#final-thoughts\",\"depth\":2},{\"value\":\"Future GitOps Content\",\"url\":\"#future-gitops-content\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"GitOps Fundamentals: a Better Way to Deliver Software\",\"datePublished\":\"2025-01-28T21:10:34.000Z\",\"dateModified\":\"2025-01-28T21:10:34.000Z\",\"description\":\"Discover how GitOps revolutionizes application and infrastructure management by leveraging Git as the single source of truth. This blog explores the core principles, key use cases, and benefits of GitOps, including faster deployments, automated rollbacks, and drift detection.\",\"image\":\"/static/images/gitops-fundamentals-what-is-gitops.png\",\"url\":\"https://ruan.dev/blog/2025/01/28/gitops-fundamentals-a-better-way-to-deliver-software\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"How to Prevent SSH Brute Force Attacks with Fail2ban\",\"date\":\"2025-01-24T14:17:46.000Z\",\"tags\":[\"linux\",\"fail2ban\",\"sysadmin\"],\"draft\":false,\"summary\":\"Learn how to use Fail2ban, a powerful tool to protect your Linux server from brute force attacks and unauthorized access. This guide explains how Fail2ban works, how to set it up, and why it’s an essential addition to your server security toolkit.\",\"images\":[\"/static/images/ruan-dev-default-image.png\"],\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"3 min read\",\"minutes\":2.665,\"time\":159900,\"words\":533},\"slug\":\"2025/01/24/how-to-prevent-ssh-brute-force-attacks-with-fail2ban\",\"path\":\"blog/2025/01/24/how-to-prevent-ssh-brute-force-attacks-with-fail2ban\",\"filePath\":\"blog/2025/01/24/how-to-prevent-ssh-brute-force-attacks-with-fail2ban.mdx\",\"toc\":[{\"value\":\"What is Fail2Ban?\",\"url\":\"#what-is-fail2ban\",\"depth\":2},{\"value\":\"How does Fail2Ban work?\",\"url\":\"#how-does-fail2ban-work\",\"depth\":2},{\"value\":\"Install Fail2Ban\",\"url\":\"#install-fail2ban\",\"depth\":2},{\"value\":\"Configuring Fail2Ban\",\"url\":\"#configuring-fail2ban\",\"depth\":2},{\"value\":\"View blocked IP Addresses\",\"url\":\"#view-blocked-ip-addresses\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"How to Prevent SSH Brute Force Attacks with Fail2ban\",\"datePublished\":\"2025-01-24T14:17:46.000Z\",\"dateModified\":\"2025-01-24T14:17:46.000Z\",\"description\":\"Learn how to use Fail2ban, a powerful tool to protect your Linux server from brute force attacks and unauthorized access. This guide explains how Fail2ban works, how to set it up, and why it’s an essential addition to your server security toolkit.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2025/01/24/how-to-prevent-ssh-brute-force-attacks-with-fail2ban\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Terraform Module usage on Running Kubernetes KinD Clusters\",\"date\":\"2024-11-15T14:48:15.000Z\",\"tags\":[\"terraform\",\"kubernetes\",\"kind\"],\"draft\":false,\"summary\":\"This tutorial shows you Terraform Module Usage on Running Kubernetes KinD Clusters.\",\"images\":[\"/static/images/ruan-dev-default-image.png\"],\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"2 min read\",\"minutes\":1.955,\"time\":117300,\"words\":391},\"slug\":\"2024/11/15/terraform-module-usage-on-running-kubernetes-kind-clusters\",\"path\":\"blog/2024/11/15/terraform-module-usage-on-running-kubernetes-kind-clusters\",\"filePath\":\"blog/2024/11/15/terraform-module-usage-on-running-kubernetes-kind-clusters.mdx\",\"toc\":[{\"value\":\"Why another method to run KinD\",\"url\":\"#why-another-method-to-run-kind\",\"depth\":2},{\"value\":\"What does this module offer?\",\"url\":\"#what-does-this-module-offer\",\"depth\":2},{\"value\":\"Lets Deploy a KinD Kubernetes Cluster\",\"url\":\"#lets-deploy-a-kind-kubernetes-cluster\",\"depth\":2},{\"value\":\"Cleanup\",\"url\":\"#cleanup\",\"depth\":2},{\"value\":\"Resources\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Terraform Module usage on Running Kubernetes KinD Clusters\",\"datePublished\":\"2024-11-15T14:48:15.000Z\",\"dateModified\":\"2024-11-15T14:48:15.000Z\",\"description\":\"This tutorial shows you Terraform Module Usage on Running Kubernetes KinD Clusters.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2024/11/15/terraform-module-usage-on-running-kubernetes-kind-clusters\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Run a Minecraft Server with Docker Compose\",\"date\":\"2024-11-10T08:19:53.000Z\",\"tags\":[\"docker\",\"minecraft\"],\"draft\":false,\"summary\":\"This tutorial shows you Run a Minecraft Server with Docker Compose.\",\"images\":[\"/static/images/ruan-dev-default-image.png\"],\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"5 min read\",\"minutes\":4.865,\"time\":291900,\"words\":973},\"slug\":\"2024/11/10/run-a-minecraft-server-with-docker-compose\",\"path\":\"blog/2024/11/10/run-a-minecraft-server-with-docker-compose\",\"filePath\":\"blog/2024/11/10/run-a-minecraft-server-with-docker-compose.mdx\",\"toc\":[{\"value\":\"Requirements\",\"url\":\"#requirements\",\"depth\":2},{\"value\":\"Configuration\",\"url\":\"#configuration\",\"depth\":2},{\"value\":\"Start the Minecraft Server\",\"url\":\"#start-the-minecraft-server\",\"depth\":2},{\"value\":\"Minecraft Command Line\",\"url\":\"#minecraft-command-line\",\"depth\":2},{\"value\":\"Install Minecraft\",\"url\":\"#install-minecraft\",\"depth\":2},{\"value\":\"Note on Forge Mods\",\"url\":\"#note-on-forge-mods\",\"depth\":2},{\"value\":\"Backups\",\"url\":\"#backups\",\"depth\":2},{\"value\":\"Getting Started Guide\",\"url\":\"#getting-started-guide\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Run a Minecraft Server with Docker Compose\",\"datePublished\":\"2024-11-10T08:19:53.000Z\",\"dateModified\":\"2024-11-10T08:19:53.000Z\",\"description\":\"This tutorial shows you Run a Minecraft Server with Docker Compose.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2024/11/10/run-a-minecraft-server-with-docker-compose\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Using Terraform to Store Passwords in AWS SecretsManager\",\"date\":\"2024-10-16T12:18:56.000Z\",\"tags\":[\"aws\",\"devops\",\"terraform\",\"cloud\"],\"draft\":false,\"summary\":\"This tutorial shows you how to use Terraform to store Passwords in AWS SecretsManager.\",\"images\":[\"/static/images/ruan-dev-default-image.png\"],\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"2 min read\",\"minutes\":1.365,\"time\":81900,\"words\":273},\"slug\":\"2024/10/16/using-terraform-to-store-passwords-in-aws-secretsmanager\",\"path\":\"blog/2024/10/16/using-terraform-to-store-passwords-in-aws-secretsmanager\",\"filePath\":\"blog/2024/10/16/using-terraform-to-store-passwords-in-aws-secretsmanager.mdx\",\"toc\":[{\"value\":\"Terraform\",\"url\":\"#terraform\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Using Terraform to Store Passwords in AWS SecretsManager\",\"datePublished\":\"2024-10-16T12:18:56.000Z\",\"dateModified\":\"2024-10-16T12:18:56.000Z\",\"description\":\"This tutorial shows you how to use Terraform to store Passwords in AWS SecretsManager.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2024/10/16/using-terraform-to-store-passwords-in-aws-secretsmanager\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Using KEDA for Autoscaling Pods using Prometheus Metrics\",\"date\":\"2024-10-07T07:11:06.000Z\",\"tags\":[\"kubernetes\",\"keda\",\"devops\",\"prometheus\"],\"draft\":false,\"summary\":\"This tutorial shows you how to use KEDA to Autoscale Kubernetes Deployments based off Prometheus Metrics using KEDAs Prometheus integration.\",\"images\":[\"https://github.com/user-attachments/assets/c8ea3d1f-499f-4426-9eb8-a73c6f488ff9\"],\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"8 min read\",\"minutes\":7.13,\"time\":427800,\"words\":1426},\"slug\":\"2024/10/07/how-to-use-keda-to-scale-pods-using-prometheus\",\"path\":\"blog/2024/10/07/how-to-use-keda-to-scale-pods-using-prometheus\",\"filePath\":\"blog/2024/10/07/how-to-use-keda-to-scale-pods-using-prometheus.mdx\",\"toc\":[{\"value\":\"What will we be doing?\",\"url\":\"#what-will-we-be-doing\",\"depth\":2},{\"value\":\"Kubernetes Environment Setup\",\"url\":\"#kubernetes-environment-setup\",\"depth\":2},{\"value\":\"Ingress Controller\",\"url\":\"#ingress-controller\",\"depth\":3},{\"value\":\"KEDA\",\"url\":\"#keda\",\"depth\":3},{\"value\":\"Prometheus Stack\",\"url\":\"#prometheus-stack\",\"depth\":3},{\"value\":\"Application Deployment\",\"url\":\"#application-deployment\",\"depth\":2},{\"value\":\"AutoScaling our Application\",\"url\":\"#autoscaling-our-application\",\"depth\":2},{\"value\":\"Up Next?\",\"url\":\"#up-next\",\"depth\":2},{\"value\":\"Resources\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Using KEDA for Autoscaling Pods using Prometheus Metrics\",\"datePublished\":\"2024-10-07T07:11:06.000Z\",\"dateModified\":\"2024-10-07T07:11:06.000Z\",\"description\":\"This tutorial shows you how to use KEDA to Autoscale Kubernetes Deployments based off Prometheus Metrics using KEDAs Prometheus integration.\",\"image\":\"https://github.com/user-attachments/assets/c8ea3d1f-499f-4426-9eb8-a73c6f488ff9\",\"url\":\"https://ruan.dev/blog/2024/10/07/how-to-use-keda-to-scale-pods-using-prometheus\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}}
1,{\"title\":\"Cross Account Terraform Assume Roles in AWS\",\"date\":\"2024-09-15T13:11:17.000Z\",\"tags\":[\"terraform\",\"devops\",\"aws\"],\"draft\":false,\"summary\":\"Terraform Assume Roles: In AWS you can have multiple accounts and in Terraform you need to reference multiple resources in multiple accounts. In this tutorial we will show you how to reference multiple accounts using assume roles with IAM.\",\"images\":[\"/static/images/ruan-dev-default-image.png\"],\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"6 min read\",\"minutes\":5.415,\"time\":324900,\"words\":1083},\"slug\":\"2024/09/15/cross-account-terraform-assume-roles-in-aws\",\"path\":\"blog/2024/09/15/cross-account-terraform-assume-roles-in-aws\",\"filePath\":\"blog/2024/09/15/cross-account-terraform-assume-roles-in-aws.mdx\",\"toc\":[{\"value\":\"Overview\",\"url\":\"#overview\",\"depth\":2},{\"value\":\"AWS IAM Roles\",\"url\":\"#aws-iam-roles\",\"depth\":3},{\"value\":\"Management Account\",\"url\":\"#management-account\",\"depth\":3},{\"value\":\"Tools Account\",\"url\":\"#tools-account\",\"depth\":3},{\"value\":\"Dev Account\",\"url\":\"#dev-account\",\"depth\":3},{\"value\":\"Terraform Example\",\"url\":\"#terraform-example\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Cross Account Terraform Assume Roles in AWS\",\"datePublished\":\"2024-09-15T13:11:17.000Z\",\"dateModified\":\"2024-09-15T13:11:17.000Z\",\"description\":\"Terraform Assume Roles: In AWS you can have multiple accounts and in Terraform you need to reference multiple resources in multiple accounts. In this tutorial we will show you how to reference multiple accounts using assume roles with IAM.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2024/09/15/cross-account-terraform-assume-roles-in-aws\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Scaling with Kubernetes: An Introduction to KEDA\",\"date\":\"2024-08-29T05:51:52.000Z\",\"tags\":[\"kubernetes\",\"devops\",\"keda\"],\"draft\":false,\"summary\":\"Discover how KEDA (Kubernetes Event-Driven Autoscaling) enhances Kubernetes native scaling capabilities. Learn why KEDA is essential for event-driven workloads, explore its key features, and understand when to use it for efficient resource management in your Kubernetes cluster. Perfect for scaling applications based on custom metrics and external events.\",\"images\":[\"/static/images/ruan-dev-default-image.png\"],\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"4 min read\",\"minutes\":3.56,\"time\":213600,\"words\":712},\"slug\":\"2024/08/29/scaling-with-kubernetes-an-introduction-to-keda\",\"path\":\"blog/2024/08/29/scaling-with-kubernetes-an-introduction-to-keda\",\"filePath\":\"blog/2024/08/29/scaling-with-kubernetes-an-introduction-to-keda.mdx\",\"toc\":[{\"value\":\"What is KEDA?\",\"url\":\"#what-is-keda\",\"depth\":2},{\"value\":\"Why Use KEDA?\",\"url\":\"#why-use-keda\",\"depth\":2},{\"value\":\"Key Features of KEDA\",\"url\":\"#key-features-of-keda\",\"depth\":2},{\"value\":\"When to Use KEDA?\",\"url\":\"#when-to-use-keda\",\"depth\":2},{\"value\":\"Conclusion\",\"url\":\"#conclusion\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Scaling with Kubernetes: An Introduction to KEDA\",\"datePublished\":\"2024-08-29T05:51:52.000Z\",\"dateModified\":\"2024-08-29T05:51:52.000Z\",\"description\":\"Discover how KEDA (Kubernetes Event-Driven Autoscaling) enhances Kubernetes native scaling capabilities. Learn why KEDA is essential for event-driven workloads, explore its key features, and understand when to use it for efficient resource management in your Kubernetes cluster. Perfect for scaling applications based on custom metrics and external events.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2024/08/29/scaling-with-kubernetes-an-introduction-to-keda\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Enhancing High Availability in Kubernetes: Strategies for Robust Application Deployment\",\"date\":\"2024-08-22T21:59:21.000Z\",\"tags\":[\"kubernetes\",\"devops\"],\"draft\":false,\"summary\":\"Kubernetes offers a variety of tools to enhance the robustness and high availability of your applications, including features like Pod Disruption Budgets, Pod Anti-Affinity, and Rolling Updates. In this post, we've explored these options in detail.\",\"images\":[\"/static/images/ruan-dev-default-image.png\"],\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"11 min read\",\"minutes\":10.2,\"time\":612000,\"words\":2040},\"slug\":\"2024/08/22/high-availability-options-for-your-deployments-on-kubernetes\",\"path\":\"blog/2024/08/22/high-availability-options-for-your-deployments-on-kubernetes\",\"filePath\":\"blog/2024/08/22/high-availability-options-for-your-deployments-on-kubernetes.mdx\",\"toc\":[{\"value\":\"About\",\"url\":\"#about\",\"depth\":2},{\"value\":\"Prepare your Nodes\",\"url\":\"#prepare-your-nodes\",\"depth\":2},{\"value\":\"Deployment Overview\",\"url\":\"#deployment-overview\",\"depth\":2},{\"value\":\"Key Pod Placement Strategies\",\"url\":\"#key-pod-placement-strategies\",\"depth\":2},{\"value\":\"Pod Anti-Affinity\",\"url\":\"#pod-anti-affinity\",\"depth\":3},{\"value\":\"Topology Spread Constraints\",\"url\":\"#topology-spread-constraints\",\"depth\":3},{\"value\":\"Key Differences\",\"url\":\"#key-differences\",\"depth\":3},{\"value\":\"Can they be used together?\",\"url\":\"#can-they-be-used-together\",\"depth\":3},{\"value\":\"Why would you use both?\",\"url\":\"#why-would-you-use-both\",\"depth\":3},{\"value\":\"Example Use Case of using Both\",\"url\":\"#example-use-case-of-using-both\",\"depth\":3},{\"value\":\"When Would This Be Advisable?\",\"url\":\"#when-would-this-be-advisable\",\"depth\":3},{\"value\":\"Scenario Where This Might Be Used\",\"url\":\"#scenario-where-this-might-be-used\",\"depth\":3},{\"value\":\"Example Manifest\",\"url\":\"#example-manifest\",\"depth\":3},{\"value\":\"Caveats of Using Both\",\"url\":\"#caveats-of-using-both\",\"depth\":3},{\"value\":\"When to Avoid Using Both\",\"url\":\"#when-to-avoid-using-both\",\"depth\":3},{\"value\":\"Conclusion\",\"url\":\"#conclusion\",\"depth\":3},{\"value\":\"Demo Deployment\",\"url\":\"#demo-deployment\",\"depth\":2},{\"value\":\"Rolling Updates\",\"url\":\"#rolling-updates\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Enhancing High Availability in Kubernetes: Strategies for Robust Application Deployment\",\"datePublished\":\"2024-08-22T21:59:21.000Z\",\"dateModified\":\"2024-08-22T21:59:21.000Z\",\"description\":\"Kubernetes offers a variety of tools to enhance the robustness and high availability of your applications, including features like Pod Disruption Budgets, Pod Anti-Affinity, and Rolling Updates. In this post, we've explored these options in detail.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2024/08/22/high-availability-options-for-your-deployments-on-kubernetes\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Scaling Applications in Kubernetes with Horizontal Pod Autoscaler\",\"date\":\"2024-08-13T22:43:14.000Z\",\"tags\":[\"golang\",\"kind\",\"kubernetes\",\"devops\"],\"draft\":false,\"summary\":\"Learn how to automatically scale your applications in Kubernetes using the Horizontal Pod Autoscaler (HPA). This tutorial walks y
1ou through setting up a Kubernetes cluster with Kind, installing the metrics server, and demonstrating HPA in action using a Go application that simulates CPU and memory-intensive tasks.\",\"images\":[\"/static/images/kubernetes/kubernetes-hpa.png\"],\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"8 min read\",\"minutes\":7.75,\"time\":465000,\"words\":1550},\"slug\":\"2024/08/14/scaling-applications-in-kubernetes-with-horizontal-pod-autoscaler\",\"path\":\"blog/2024/08/14/scaling-applications-in-kubernetes-with-horizontal-pod-autoscaler\",\"filePath\":\"blog/2024/08/14/scaling-applications-in-kubernetes-with-horizontal-pod-autoscaler.mdx\",\"toc\":[{\"value\":\"Introduction\",\"url\":\"#introduction\",\"depth\":2},{\"value\":\"What is Horizontal Pod Autoscaler (HPA)?\",\"url\":\"#what-is-horizontal-pod-autoscaler-hpa\",\"depth\":2},{\"value\":\"Key Features of HPA\",\"url\":\"#key-features-of-hpa\",\"depth\":3},{\"value\":\"Why Do You Need HPA?\",\"url\":\"#why-do-you-need-hpa\",\"depth\":2},{\"value\":\"Setting Up the Demonstration Environment\",\"url\":\"#setting-up-the-demonstration-environment\",\"depth\":2},{\"value\":\"Step 1: Set Up a Kubernetes Cluster with Kind\",\"url\":\"#step-1-set-up-a-kubernetes-cluster-with-kind\",\"depth\":3},{\"value\":\"Step 2: Deploy Ingress Nginx Controller\",\"url\":\"#step-2-deploy-ingress-nginx-controller\",\"depth\":3},{\"value\":\"Step 3: Install the Metrics Server\",\"url\":\"#step-3-install-the-metrics-server\",\"depth\":3},{\"value\":\"Step 4: Deploy the Go Application\",\"url\":\"#step-4-deploy-the-go-application\",\"depth\":3},{\"value\":\"Step 5: Configure Horizontal Pod Autoscaler\",\"url\":\"#step-5-configure-horizontal-pod-autoscaler\",\"depth\":3},{\"value\":\"Step 6: Test scaling with HPA\",\"url\":\"#step-6-test-scaling-with-hpa\",\"depth\":3},{\"value\":\"Conclusion\",\"url\":\"#conclusion\",\"depth\":2},{\"value\":\"Resources\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Scaling Applications in Kubernetes with Horizontal Pod Autoscaler\",\"datePublished\":\"2024-08-13T22:43:14.000Z\",\"dateModified\":\"2024-08-13T22:43:14.000Z\",\"description\":\"Learn how to automatically scale your applications in Kubernetes using the Horizontal Pod Autoscaler (HPA). This tutorial walks you through setting up a Kubernetes cluster with Kind, installing the metrics server, and demonstrating HPA in action using a Go application that simulates CPU and memory-intensive tasks.\",\"image\":\"/static/images/kubernetes/kubernetes-hpa.png\",\"url\":\"https://ruan.dev/blog/2024/08/14/scaling-applications-in-kubernetes-with-horizontal-pod-autoscaler\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Getting Started with Localstack:  Overview, Setup, and Practical Usage Guide\",\"date\":\"2024-08-06T20:10:45.000Z\",\"tags\":[\"terraform\",\"localstack\",\"aws\",\"devops\"],\"draft\":false,\"summary\":\"Discover LocalStack: Your local AWS cloud stack for efficient and cost-effective development and testing. Learn how to emulate AWS services like S3, DynamoDB, Lambda, and more on your local machine. Enhance your cloud development workflows with faster iteration cycles, comprehensive testing, and offline capabilities. Read our comprehensive guide on why LocalStack is a must-have tool for every developer working with AWS.\",\"images\":[\"/static/images/ruan-dev-default-image.png\"],\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"11 min read\",\"minutes\":10.13,\"time\":607800,\"words\":2026},\"slug\":\"2024/08/06/getting-started-with-localstack-overview-setup-and-practical-usage-guide\",\"path\":\"blog/2024/08/06/getting-started-with-localstack-overview-setup-and-practical-usage-guide\",\"filePath\":\"blog/2024/08/06/getting-started-with-localstack-overview-setup-and-practical-usage-guide.mdx\",\"toc\":[{\"value\":\"Overview\",\"url\":\"#overview\",\"depth\":2},{\"value\":\"Description\",\"url\":\"#description\",\"depth\":2},{\"value\":\"Why You Would Need It\",\"url\":\"#why-you-would-need-it\",\"depth\":2},{\"value\":\"Installing Localstack on Docker Compose\",\"url\":\"#installing-localstack-on-docker-compose\",\"depth\":2}
1,{\"value\":\"Manage Localstack Infrastructure with Terraform\",\"url\":\"#manage-localstack-infrastructure-with-terraform\",\"depth\":2},{\"value\":\"Kinesis, Lambda and DynamoDB Terraform Localstack Example\",\"url\":\"#kinesis-lambda-and-dynamodb-terraform-localstack-example\",\"depth\":3},{\"value\":\"Conclusion\",\"url\":\"#conclusion\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Getting Started with Localstack:  Overview, Setup, and Practical Usage Guide\",\"datePublished\":\"2024-08-06T20:10:45.000Z\",\"dateModified\":\"2024-08-06T20:10:45.000Z\",\"description\":\"Discover LocalStack: Your local AWS cloud stack for efficient and cost-effective development and testing. Learn how to emulate AWS services like S3, DynamoDB, Lambda, and more on your local machine. Enhance your cloud development workflows with faster iteration cycles, comprehensive testing, and offline capabilities. Read our comprehensive guide on why LocalStack is a must-have tool for every developer working with AWS.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2024/08/06/getting-started-with-localstack-overview-setup-and-practical-usage-guide\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Step-by-step Guide to Setting up Atlantis with Gitlab\",\"date\":\"2024-08-04T07:31:58.000Z\",\"tags\":[\"terraform\",\"atlantis\",\"devops\",\"gitlab\"],\"draft\":false,\"summary\":\"Atlantis - Terraform: Learn how to set up Atlantis with GitLab to automate Terraform workflows. This step-by-step guide covers installation, configuration, and best practices for seamless integration.\",\"images\":[\"/static/images/ruan-dev-default-image.png\"],\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"9 min read\",\"minutes\":8.335,\"time\":500100,\"words\":1667},\"slug\":\"2024/08/04/step-by-step-guide-to-setting-up-atlantis-with-gitlab\",\"path\":\"blog/2024/08/04/step-by-step-guide-to-setting-up-atlantis-with-gitlab\",\"filePath\":\"blog/2024/08/04/step-by-step-guide-to-setting-up-atlantis-with-gitlab.mdx\",\"toc\":[{\"value\":\"Introduction\",\"url\":\"#introduction\",\"depth\":2},{\"value\":\"Prerequisites\",\"url\":\"#prerequisites\",\"depth\":2},{\"value\":\"Step 1: Gitlab Integration for Atlantis\",\"url\":\"#step-1-gitlab-integration-for-atlantis\",\"depth\":2},{\"value\":\"Gitlab Access Credentials\",\"url\":\"#gitlab-access-credentials\",\"depth\":3},{\"value\":\"Atlantis Webhook Secret\",\"url\":\"#atlantis-webhook-secret\",\"depth\":3},{\"value\":\"Kubernetes Secret\",\"url\":\"#kubernetes-secret\",\"depth\":3},{\"value\":\"Step 2: Install Atlantis\",\"url\":\"#step-2-install-atlantis\",\"depth\":2},{\"value\":\"Step 3: Configure Gitlab Webhooks\",\"url\":\"#step-3-configure-gitlab-webhooks\",\"depth\":2},{\"value\":\"Step 4: Configure Your Terraform Repository\",\"url\":\"#step-4-configure-your-terraform-repository\",\"depth\":2},{\"value\":\"Step 6: Test Your Setup\",\"url\":\"#step-6-test-your-setup\",\"depth\":2},{\"value\":\"Atlantis Commands\",\"url\":\"#atlantis-commands\",\"depth\":2},{\"value\":\"Conclusion\",\"url\":\"#conclusion\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Step-by-step Guide to Setting up Atlantis with Gitlab\",\"datePublished\":\"2024-08-04T07:31:58.000Z\",\"dateModified\":\"2024-08-04T07:31:58.000Z\",\"description\":\"Atlantis - Terraform: Learn how to set up Atlantis with GitLab to automate Terraform workflows. This step-by-step guide covers installation, configuration, and best practices for seamless integration.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2024/08/04/step-by-step-guide-to-setting-up-atlantis-with-gitlab\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Unleashing Terraform Automation with Atlantis: An Overview\",\"date\":\"2024-07-31T07:00:34.000Z\",\"tags\":[\"terraform\",\"atlantis\",\"devops\"],\"draft\":false,\"summary\":\"Discover how Atlantis automates Terraform workflows, enhances collaboration, and improves infrastru
1cture security with this comprehensive guide to its features and benefits.\",\"images\":[\"https://github.com/user-attachments/assets/e4bb8007-5e22-4e1e-b3d1-ff3b95a9de4e\"],\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"5 min read\",\"minutes\":4.9,\"time\":294000,\"words\":980},\"slug\":\"2024/07/31/unleashing-terraform-automation-with-atlantis-an-overview\",\"path\":\"blog/2024/07/31/unleashing-terraform-automation-with-atlantis-an-overview\",\"filePath\":\"blog/2024/07/31/unleashing-terraform-automation-with-atlantis-an-overview.mdx\",\"toc\":[{\"value\":\"Introduction\",\"url\":\"#introduction\",\"depth\":2},{\"value\":\"What is Atlantis?\",\"url\":\"#what-is-atlantis\",\"depth\":2},{\"value\":\"Preview of Atlantis\",\"url\":\"#preview-of-atlantis\",\"depth\":2},{\"value\":\"Key Features of Atlantis\",\"url\":\"#key-features-of-atlantis\",\"depth\":2},{\"value\":\"1. Automated Terraform Plans and Applies\",\"url\":\"#1-automated-terraform-plans-and-applies\",\"depth\":3},{\"value\":\"2. Secure and Isolated Execution\",\"url\":\"#2-secure-and-isolated-execution\",\"depth\":3},{\"value\":\"3. Integration with Version Control Systems\",\"url\":\"#3-integration-with-version-control-systems\",\"depth\":3},{\"value\":\"4. Custom Workflows and Policies\",\"url\":\"#4-custom-workflows-and-policies\",\"depth\":3},{\"value\":\"5. Multi-Environment Support\",\"url\":\"#5-multi-environment-support\",\"depth\":3},{\"value\":\"Authentication with AWS for Atlantis\",\"url\":\"#authentication-with-aws-for-atlantis\",\"depth\":2},{\"value\":\"Parallelism\",\"url\":\"#parallelism\",\"depth\":2},{\"value\":\"Atlantis vs. GitHub Actions for Terraform Workflows\",\"url\":\"#atlantis-vs-github-actions-for-terraform-workflows\",\"depth\":2},{\"value\":\"How Atlantis Transforms Terraform Workflows\",\"url\":\"#how-atlantis-transforms-terraform-workflows\",\"depth\":2},{\"value\":\"Enhanced Collaboration\",\"url\":\"#enhanced-collaboration\",\"depth\":3},{\"value\":\"Increased Efficiency\",\"url\":\"#increased-efficiency\",\"depth\":3},{\"value\":\"Improved Security\",\"url\":\"#improved-security\",\"depth\":3},{\"value\":\"Consistency and Reliability\",\"url\":\"#consistency-and-reliability\",\"depth\":3},{\"value\":\"Conclusion\",\"url\":\"#conclusion\",\"depth\":2},{\"value\":\"Next Up\",\"url\":\"#next-up\",\"depth\":2},{\"value\":\"Related Posts\",\"url\":\"#related-posts\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Unleashing Terraform Automation with Atlantis: An Overview\",\"datePublished\":\"2024-07-31T07:00:34.000Z\",\"dateModified\":\"2024-07-31T07:00:34.000Z\",\"description\":\"Discover how Atlantis automates Terraform workflows, enhances collaboration, and improves infrastructure security with this comprehensive guide to its features and benefits.\",\"image\":\"https://github.com/user-attachments/assets/e4bb8007-5e22-4e1e-b3d1-ff3b95a9de4e\",\"url\":\"https://ruan.dev/blog/2024/07/31/unleashing-terraform-automation-with-atlantis-an-overview\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"How to Create a KinD Kubernetes Terraform Module\",\"date\":\"2024-07-27T23:48:48.000Z\",\"tags\":[\"terraform\",\"kubernetes\",\"docker\",\"kind\"],\"draft\":false,\"summary\":\"Learn how to create a Terraform module to deploy a Kubernetes cluster locally using the Kind provider. Step-by-step guide with code examples and best practices for Developers and DevOps engineers.\",\"images\":[\"/static/images/ruan-dev-default-image.png\"],\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"4 min read\",\"minutes\":3.275,\"time\":196500,\"words\":655},\"slug\":\"2024/07/28/how-to-create-a-kind-kubernetes-terraform-module\",\"path\":\"blog/2024/07/28/how-to-create-a-kind-kubernetes-terraform-module\",\"filePath\":\"blog/2024/07/28/how-to-create-a-kind-kubernetes-terraform-module.mdx\",\"toc\":[{\"value\":\"Prerequisites\",\"url\":\"#prerequisites\",\"depth\":2},{\"value\":\"Published Terraform Module\",\"url\":\"#published-terraform-module\",\"depth\":2},{\"value\":\"Directory Structure\",\"url\":\"#directory-structure\",\"depth\":2},{\"value\":\"Deploying the Kubernetes Cluster\",\"url\":\"#deploying-the-kubernetes-cluster\",\"depth\":2},{\"value\":\"Conclusion\",\"url\":\"#conclusion\",\"depth\":2},{\"value\":\"Key Takeaways\",\"url\":\"#key-takeaways\",\"depth\":3},{\"value\":\"Resources\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"How to Create a KinD Kubernetes Terraform Module\",\"datePublished\":\"2024-07-27T23:48:48.000Z\",\"dateModified\":\"2024-07-27T23:48:48.000Z\",\"description\":\"Learn how to create a Terraform module to deploy a Kubernetes cluster locally using the Kind provider. Step-by-step guide with code examples and best practices for Developers and DevOps engineers.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2024/07/28/how-to-create-a-kind-kubernetes-terraform-module\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Deploy a Golang App to Interact with the Kubernetes API\",\"date\":\"2024-07-20T22:19:09.000Z\",\"tags\":[\"golang\",\"kubernetes\"],\"draft\":false,\"summary\":\"We will deploy a Go Restful API that will interact with the Kubernetes API so that our Go App can retrieve information about pods in the default namespace.\",\"images\":[\"/static/images/twitter-card.png\"],\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"6 min read\",\"minutes\":5.815,\"time\":348900,\"words\":1163},\"slug\":\"2024/07/21/deploy-a-golang-app-to-interact-with-the-kubernetes-api\",\"path\":\"blog/2024/07/21/deploy-a-golang-app-to-interact-with-the-kubernetes-api\",\"filePath\":\"blog/2024/07/21/deploy-a-golang-app-to-interact-with-the-kubernetes-api.mdx\",\"toc\":[{\"value\":\"What will we be doing\",\"url\":\"#what-will-we-be-doing\",\"depth\":2},{\"value\":\"Install Go\",\"url\":\"#install-go\",\"depth\":2},{\"value\":\"Create the Go application\",\"url\":\"#create-the-go-application\",\"depth\":2},{\"value\":\"Docker\",\"url\":\"#docker\",\"depth\":2},{\"value\":\"Kubernetes\",\"url\":\"#kubernetes\",\"depth\":2},{\"value\":\"Testing our Application\",\"url\":\"#testing-our-application\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Deploy a Golang App to Interact with the Kubernetes API\",\"datePublished\":\"2024-07-20T22:19:09.000Z\",\"dateModified\":\"2024-07-20T22:19:09.000Z\",\"description\":\"We will deploy a Go Restful API that will interact with the Kubernetes API so that our Go App can retrieve information about pods in the default namespace.\",\"image\":\"/static/images/twitter-card.png\",\"url\":\"https://ruan.dev/blog/2024/07/21/deploy-a-golang-app-to-interact-with-the-kubernetes-api\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Automate Grafana Dashboards with Terraform and Helm\",\"date\":\"2024-05-01T11:48:46.000Z\",\"tags\":[\"helm\",\"kubernetes\",\"grafana\",\"devops\"],\"draft\":false,\"summary\":\"This blog post will guide you through an automated approach using Terraform and the Helm Terraform provider. We'll explore how to leverage JSON files to define your grafana dashboards and seamlessly render them into Kubernetes ConfigMaps, ensuring consistent and efficie
1nt deployments across your environments.\",\"images\":[\"https://github.com/ruanbekker/ruanbekker/assets/567298/ab9c5975-f943-40f9-989a-0577d02aaaf0\"],\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"7 min read\",\"minutes\":6.59,\"time\":395400,\"words\":1318},\"slug\":\"2024/05/01/automate-grafana-dashboards-with-terraform-and-helm\",\"path\":\"blog/2024/05/01/automate-grafana-dashboards-with-terraform-and-helm\",\"filePath\":\"blog/2024/05/01/automate-grafana-dashboards-with-terraform-and-helm.mdx\",\"toc\":[{\"value\":\"Goal\",\"url\":\"#goal\",\"depth\":2},{\"value\":\"About\",\"url\":\"#about\",\"depth\":2},{\"value\":\"Prerequisites\",\"url\":\"#prerequisites\",\"depth\":2},{\"value\":\"Defining the directory structure\",\"url\":\"#defining-the-directory-structure\",\"depth\":2},{\"value\":\"Terraform Module\",\"url\":\"#terraform-module\",\"depth\":2},{\"value\":\"Source your module\",\"url\":\"#source-your-module\",\"depth\":2},{\"value\":\"Deploy\",\"url\":\"#deploy\",\"depth\":2},{\"value\":\"What about alerts?\",\"url\":\"#what-about-alerts\",\"depth\":2},{\"value\":\"Taking it further\",\"url\":\"#taking-it-further\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Automate Grafana Dashboards with Terraform and Helm\",\"datePublished\":\"2024-05-01T11:48:46.000Z\",\"dateModified\":\"2024-05-01T11:48:46.000Z\",\"description\":\"This blog post will guide you through an automated approach using Terraform and the Helm Terraform provider. We'll explore how to leverage JSON files to define your grafana dashboards and seamlessly render them into Kubernetes ConfigMaps, ensuring consistent and efficient deployments across your environments.\",\"image\":\"https://github.com/ruanbekker/ruanbekker/assets/567298/ab9c5975-f943-40f9-989a-0577d02aaaf0\",\"url\":\"https://ruan.dev/blog/2024/05/01/automate-grafana-dashboards-with-terraform-and-helm\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Grafana CloudWatch Datasource IRSA for Kubernetes using Terraform\",\"date\":\"2024-04-23T09:35:15.000Z\",\"tags\":[\"aws\",\"kubernetes\",\"grafana\",\"devops\"],\"draft\":false,\"summary\":\"We will be using only Terraform to set up a IAM Role Service Account on Kubernetes, in order for our Grafana workloads to access AWS CloudWatch.\",\"images\":[\"https://github.com/ruanbekker/ruanbekker/assets/567298/8933285a-f4c5-4eff-9e17-3a2a4ccc9bcd\"],\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"3 min read\",\"minutes\":2.34,\"time\":140400,\"words\":468},\"slug\":\"2024/04/23/grafana-cloudwatch-datasource-iam-role-service-account-for-kubernetes-using-terraform\",\"path\":\"blog/2024/04/23/grafana-cloudwatch-datasource-iam-role-service-account-for-kubernetes-using-terraform\",\"filePath\":\"blog/2024/04/23/grafana-cloudwatch-datasource-iam-role-service-account-for-kubernetes-using-terraform.mdx\",\"toc\":[{\"value\":\"Assumptions\",\"url\":\"#assumptions\",\"depth\":2},{\"value\":\"Implement IAM Role Service Account\",\"url\":\"#implement-iam-role-service-account\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Grafana CloudWatch Datasource IRSA for Kubernetes using Terraform\",\"datePublished\":\"2024-04-23T09:35:15.000Z\",\"dateModified\":\"2024-04-23T09:35:15.000Z\",\"description\":\"We will be using only Terraform to set up a IAM Role Service Account on Kubernetes, in order for our Grafana workloads to access AWS CloudWatch.\",\"image\":\"https://github.com/ruanbekker/ruanbekker/assets/567298/8933285a-f4c5-4eff-9e17-3a2a4ccc9bcd\",\"url\":\"https://ruan.dev/blog/2024/04/23/grafana-cloudwatch-datasource-iam-role-service-account-for-kubernetes-using-terraform\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Multi-Arch Docker Builds with Github Actions\",\"date\":\"2024-04-21T11:17:30.000Z\",\"tags\":[\"github\",\"docker\",\"devops\"],\"draft\":false,\"summary\":\"How to use implement multi-architecture (aarch64 and x86_64) docker builds with github actions.\",\"images\":[\"/static/images/github-actions-multi-arch-header.png\"],\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"3 min read\",\"minutes\":2.1,\"time\":126000,\"words\":420},\"slug\":\"2024/04/21/multi-architecture-docker-builds-with-github-actions\",\"path\":\"blog/2024/04/21/multi-architecture-docker-builds-with-github-actions\",\"filePath\":\"blog/2024/04/21/multi-architecture-docker-builds-with-github-actions.mdx\",\"toc\":[{\"value\":\"End Result\",\"url\":\"#end-result\",\"depth\":2},{\"value\":\"Docker Container Image\",\"url\":\"#docker-container-image\",\"depth\":2},{\"value\":\"Github Actions Workflow\",\"url\":\"#github-actions-workflow\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Multi-Arch Docker Builds with Github Actions\",\"datePublished\":\"2024-04-21T11:17:30.000Z\",\"dateModified\":\"2024-04-21T11:17:30.000Z\",\"description\":\"How to use implement multi-architecture (aarch64 and x86_64) docker builds with github actions.\",\"image\":\"/static/images/github-actions-multi-arch-header.png\",\"url\":\"https://ruan.dev/blog/2024/04/21/multi-architecture-docker-builds-with-github-actions\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Using Terraform to Deploy KinD Kubernetes Clusters\",\"date\":\"2024-04-07T19:16:46.000Z\",\"tags\":[\"kubernetes\",\"terraform\",\"kind\",\"devops\"],\"draft\":false,\"summary\":\"This tutorial shows you Using Terraform to Deploy KinD Kubernetes Clusters.\",\"images\":[\"/static/images/terraform-kubernetes-kind.png\"],\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"4 min read\",\"minutes\":3.96,\"time\":237600,\"words\":792},\"slug\":\"2024/04/07/using-terraform-to-deploy-kind-kubernetes-clusters\",\"path\":\"blog/2024/04/07/using-terraform-to-deploy-kind-kubernetes-clusters\",\"filePath\":\"blog/2024/04/07/using-terraform-to-deploy-kind-kubernetes-clusters.mdx\",\"toc\":[{\"value\":\"Assumptions\",\"url\":\"#assumptions\",\"depth\":2},{\"value\":\"Write Terraform Code\",\"url\":\"#write-terraform-code\",\"depth\":2},{\"value\":\"Initialize Terraform\",\"url\":\"#initialize-terraform\",\"depth\":2},{\"value\":\"Interact with your Kubernetes Cluster\",\"url\":\"#interact-with-your-kubernetes-cluster\",\"depth\":2},{\"value\":\"Cleanup\",\"url\":\"#cleanup\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Using Terraform to Deploy KinD Kubernetes Clusters\",\"datePublished\":\"2024-04-07T19:16:46.000Z\",\"dateModified\":\"2024-04-07T19:16:46.000Z\",\"description\":\"This tutorial shows you Using Terraform to Deploy KinD Kubernetes Clusters.\",\"image\":\"/static/images/terraform-kubernetes-kind.png\",\"url\":\"https://ruan.dev/blog/2024/04/07/using-terraform-to-deploy-kind-kubernetes-clusters\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Getting Started with Argo CD on Kubernetes - The Ultimate Guide\",\"date\":\"2024-03-26T00:00:00.000Z\",\"tags\":[\"kubernetes\",\"argocd\",\"devops\"],\"lastmod\":\"2024-03-26T00:00:00.000Z\",\"draft\":false,\"summary\":\"This tutorial shows you on how to get Started with Argo CD on Kubernetes - A in-depth tutrial.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"19 min read\",\"minutes\":18.255,\"time\":1095300,\"words\":3651},\"slug\":\"2024/26/03/getting-started-with-argo-cd-on-kubernetes---the-ultimate-guide\",\"path\":\"blog/2024/26/03/getting-started-with-argo-cd-on-kubernetes---the-ultimate-guide\",\"filePath\":\"blog/2024/26/03/getting-started-with-argo-cd-on-kubernetes---the-ultimate-guide.mdx\",\"toc\":[{\"value\":\"Pre-Requisites\",\"url\":\"#pre-requisites\",\"depth\":2},{\"value\":\"Install a Kubernetes Cluster\",\"url\":\"#install-a-kubernetes-cluster\",\"depth\":2},{\"value\":\"ArgoCD Installation\",\"url\":\"#argocd-installation\",\"depth\":2},{\"value\":\"Configure Github\",\"url\":\"#configure-github\",\"depth\":2},{\"value\":\"ArgoCD Applicationset\",\"url\":\"#argocd-applicationset\",\"depth\":2},{\"value\":\"Let ArgoCD manage itself\",\"url\":\"#let-argocd-manage-itself\",\"depth\":2},{\"value\":\"ArgoCD CLI\",\"url\":\"#argocd-cli\",\"depth\":2},{\"value\":\"RBAC: Creating Users and Roles\",\"url\":\"#rbac-creating-users-and-roles\",\"depth\":2},{\"value\":\"SSO for Argo CD using Authentik\",\"url\":\"#sso-for-argo-cd-using-authentik\",\"depth\":2}
1,{\"value\":\"Argo CD Notifications\",\"url\":\"#argo-cd-notifications\",\"depth\":2},{\"value\":\"Resources\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Getting Started with Argo CD on Kubernetes - The Ultimate Guide\",\"datePublished\":\"2024-03-26T00:00:00.000Z\",\"dateModified\":\"2024-03-26T00:00:00.000Z\",\"description\":\"This tutorial shows you on how to get Started with Argo CD on Kubernetes - A in-depth tutrial.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2024/26/03/getting-started-with-argo-cd-on-kubernetes---the-ultimate-guide\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"How to use Cert-Manager DNS Challenge with Cloudflare on Kubernetes with Helm\",\"date\":\"2023-12-22T13:04:02.000Z\",\"tags\":[\"kubernetes\",\"cloudflare\",\"cert-manager\",\"devops\"],\"draft\":false,\"summary\":\"Kubernetes, Cert-Manager and Helm: This tutorial shows you How to use Cert-Manager DNS Challenge with Cloudflare on Kubernetes with Helm.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"6 min read\",\"minutes\":5.99,\"time\":359400,\"words\":1198},\"slug\":\"2023/12/22/how-to-use-cert-manager-dns-challenge-with-cloudflare-on-kubernetes-with-helm\",\"path\":\"blog/2023/12/22/how-to-use-cert-manager-dns-challenge-with-cloudflare-on-kubernetes-with-helm\",\"filePath\":\"blog/2023/12/22/how-to-use-cert-manager-dns-challenge-with-cloudflare-on-kubernetes-with-helm.mdx\",\"toc\":[{\"value\":\"Summary of what we will be doing\",\"url\":\"#summary-of-what-we-will-be-doing\",\"depth\":2},{\"value\":\"Pre-Requisites\",\"url\":\"#pre-requisites\",\"depth\":2},{\"value\":\"Install a Kubernetes Cluster\",\"url\":\"#install-a-kubernetes-cluster\",\"depth\":2},{\"value\":\"Nginx Ingress Controller\",\"url\":\"#nginx-ingress-controller\",\"depth\":2},{\"value\":\"Cert-Manager\",\"url\":\"#cert-manager\",\"depth\":2},{\"value\":\"Cloudflare API Token\",\"url\":\"#cloudflare-api-token\",\"depth\":2},{\"value\":\"Cert-Manager ClusterIssuer\",\"url\":\"#cert-manager-clusterissuer\",\"depth\":2},{\"value\":\"Request a Certificate\",\"url\":\"#request-a-certificate\",\"depth\":2},{\"value\":\"Specify the Certificate in your Ingress\",\"url\":\"#specify-the-certificate-in-your-ingress\",\"depth\":2},{\"value\":\"Ensure DNS Challenges are successful\",\"url\":\"#ensure-dns-challenges-are-successful\",\"depth\":2},{\"value\":\"Test\",\"url\":\"#test\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"How to use Cert-Manager DNS Challenge with Cloudflare on Kubernetes with Helm\",\"datePublished\":\"2023-12-22T13:04:02.000Z\",\"dateModified\":\"2023-12-22T13:04:02.000Z\",\"description\":\"Kubernetes, Cert-Manager and Helm: This tutorial shows you How to use Cert-Manager DNS Challenge with Cloudflare on Kubernetes with Helm.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2023/12/22/how-to-use-cert-manager-dns-challenge-with-cloudflare-on-kubernetes-with-helm\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"How to deploy Ingress-Nginx Controller on Kubernetes with Helm\",\"date\":\"2023-12-22T12:56:22.000Z\",\"tags\":[\"kubernetes\",\"nginx\",\"devops\"],\"draft\":false,\"summary\":\"Kubernetes and Helm: This tutorial shows you How to deploy Ingress-Nginx Controller on Kubernetes with Helm.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"4 min read\",\"minutes\":3.165,\"time\":189900,\"words\":633},\"slug\":\"2023/12/22/how-to-deploy-ingress-nginx-controller-on-kubernetes-with-helm\",\"path\":\"blog/2023/12/22/how-to-deploy-ingress-nginx-controller-on-kubernetes-with-helm\",\"filePath\":\"blog/2023/12/22/how-to-deploy-ingress-nginx-controller-on-kubernetes-with-helm.mdx\",\"toc\":[{\"value\":\"Pre-Requisites\",\"url\":\"#pre-requisites\",\"depth\":2},{\"value\":\"Create the Kubernetes Cluster\",\"url\":\"#create-the-kubernetes-cluster\",\"depth\":2},{\"value\":\"Install ingress-nginx using Helm\",\"url\":\"#install-ingress-nginx-using-helm\",\"depth\":2},{\"value\":\"Deploy a Web Application\",\"url\":\"#deploy-a-web-application\",\"depth\":2},{\"value\":\"Teardown\",\"url\":\"#teardown\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"How to deploy Ingress-Nginx Controller on Kubernetes with Helm\",\"datePublished\":\"2023-12-22T12:56:22.000Z\",\"dateModified\":\"2023-12-22T12:56:22.000Z\",\"description\":\"Kubernetes and Helm: This tutorial shows you How to deploy Ingress-Nginx Controller on Kubernetes with Helm.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2023/12/22/how-to-deploy-ingress-nginx-controller-on-kubernetes-with-helm\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Create Kubernetes Clusters with Kind\",\"date\":\"2023-10-24T
100:00:00.000Z\",\"tags\":[\"kubernetes\"],\"draft\":false,\"summary\":\"This tutorial will demonstrate how to deploy a Kubernetes Cluster locally on your laptop using the utility called kind.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"3 min read\",\"minutes\":2.14,\"time\":128400,\"words\":428},\"slug\":\"2023/10/24/create-kubernetes-clusters-with-kind\",\"path\":\"blog/2023/10/24/create-kubernetes-clusters-with-kind\",\"filePath\":\"blog/2023/10/24/create-kubernetes-clusters-with-kind.mdx\",\"toc\":[{\"value\":\"Pre-Requisites\",\"url\":\"#pre-requisites\",\"depth\":2},{\"value\":\"Installation\",\"url\":\"#installation\",\"depth\":2},{\"value\":\"Creating Clusters\",\"url\":\"#creating-clusters\",\"depth\":2},{\"value\":\"CLI\",\"url\":\"#cli\",\"depth\":3},{\"value\":\"Config File\",\"url\":\"#config-file\",\"depth\":3},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Create Kubernetes Clusters with Kind\",\"datePublished\":\"2023-10-24T00:00:00.000Z\",\"dateModified\":\"2023-10-24T00:00:00.000Z\",\"description\":\"This tutorial will demonstrate how to deploy a Kubernetes Cluster locally on your laptop using the utility called kind.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2023/10/24/create-kubernetes-clusters-with-kind\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Creating a Python Lambda Function with Terraform on AWS\",\"date\":\"2023-08-03T15:29:35.000Z\",\"tags\":[\"aws\",\"terraform\",\"devops\",\"python\"],\"draft\":false,\"summary\":\"How to use Terraform to create Python AWS Lambda Functions.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"10 min read\",\"minutes\":9.84,\"time\":590400,\"words\":1968},\"slug\":\"2023/08/03/creating-a-python-lambda-function-with-terraform-on-aws\",\"path\":\"blog/2023/08/03/creating-a-python-lambda-function-with-terraform-on-aws\",\"filePath\":\"blog/2023/08/03/creating-a-python-lambda-function-with-terraform-on-aws.mdx\",\"toc\":[{\"value\":\"Pre-Requisites\",\"url\":\"#pre-requisites\",\"depth\":2},{\"value\":\"Project Structure\",\"url\":\"#project-structure\",\"depth\":2},{\"value\":\"Terraform Code\",\"url\":\"#terraform-code\",\"depth\":2},{\"value\":\"Terraform Plan\",\"url\":\"#terraform-plan\",\"depth\":2},{\"value\":\"Create Resources\",\"url\":\"#create-resources\",\"depth\":2},{\"value\":\"Updating Lambda Function Code\",\"url\":\"#updating-lambda-function-code\",\"depth\":2},{\"value\":\"Discover AWS Console\",\"url\":\"#discover-aws-console\",\"depth\":2},{\"value\":\"Destroy Infrastructure\",\"url\":\"#destroy-infrastructure\",\"depth\":2},{\"value\":\"Resources\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Creating a Python Lambda Function with Terraform on AWS\",\"datePublished\":\"2023-08-03T15:29:35.000Z\",\"dateModified\":\"2023-08-03T15:29:35.000Z\",\"description\":\"How to use Terraform to create Python AWS Lambda Functions.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2023/08/03/creating-a-python-lambda-function-with-terraform-on-aws\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"How to use the MySQL Terraform Provider\",\"date\":\"2023-07-16T00:55:23.000Z\",\"tags\":[\"aws\",\"terraform\",\"docker\",\"devops\",\"mysql\"],\"draft\":false,\"summary\":\"This tutorial shows you how to use the mysql terraform provider.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"8 min read\",\"minutes\":7.41,\"time\":444600,\"words\":1482},\"slug\":\"2023/07/15/how-to-use-the-mysql-terraform-provider\",\"path\":\"blog/2023/07/15/how-to-use-the-mysql-terraform-provider\",\"filePath\":\"blog/2023/07/15/how-to-use-the-mysql-terraform-provider.mdx\",\"toc\":[{\"value\":\"About\",\"url\":\"#about\",\"depth\":2},{\"value\":\"MySQL Server\",\"url\":\"#mysql-server\",\"depth\":2},{\"value\":\"Terraform\",\"url\":\"#terraform\",\"depth\":2},{\"value\":\"Resources\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"How to use the MySQL Terraform Provider\",\"datePublished\":\"2023-07-16T00:55:23.000Z\",\"dateModified\":\"2023-07-16T00:55:23.000Z\",\"description\":\"This tutorial shows you how to use the mysql terraform provider.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2023/07/15/how-to-use-the-mysql-terraform-provider\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"How to use the AWS Terraform Provider\",\"date\":\"2023-07-16T00:01:13.000Z\",\"tags\":[\"aws\",\"terraform\",\"devops\"],\"draft\":false,\"summary\":\"This tutorial shows you how to use the aws terraform provider.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"9 min read\",\"minutes\":8.54,\"time\":512400,\"words\":1708},\"slug\":\"2023/07/15/how-to-use-the-aws-terraform-provider\",\"path\":\"blog/2023/07/15/how-to-use-the-aws-terraform-provider\",\"filePath\":\"blog/2023/07/15/how-to-use-the-aws-terraform-provider.mdx\",\"toc\":[{\"value\":\"AWS IAM User\",\"url\":\"#aws-iam-user\",\"depth\":2},{\"value\":\"Terraform\",\"url\":\"#terraform\",\"depth\":2},{\"value\":\"Deploy our EC2 with Terraform\",\"url\":\"#deploy-our-ec2-with-terraform\",\"depth\":2},{\"value\":\"Cleanup\",\"url\":\"#cleanup\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"How to use the AWS Terraform Provider\",\"datePublished\":\"2023-07-16T00:01:13.000Z\",\"dateModified\":\"2023-07-16T00:01:13.000Z\",\"description\":\"This tutorial shows you how to use the aws terraform provider.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2023/07/15/how-to-use-the-aws-terraform-provider\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Getting Started with FerretDB on Docker\",\"date\":\"2023-06-15T02:00:00.000Z\",\"tags\":[\"ferretdb\",\"mongodb\",\"docker\",\"databases\"],\"draft\":false,\"summary\":\"This tutorial shows you how to get started using ferretdb on docker.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"9 min read\",\"minutes\":8.475,\"time\":508500,\"words\":1695},\"slug\":\"2023/06/14/getting-started-with-ferretdb-on-docker\",\"path\":\"blog/2023/06/14/getting-started-with-ferretdb-on-docker\",\"filePath\":\"blog/2023/06/14/getting-started-with-ferretdb-on-docker.mdx\",\"toc\":[{\"value\":\"More about FerretDB\",\"url\":\"#more-about-ferretdb\",\"depth\":2},{\"value\":\"What can you expect from this tutorial\",\"url\":\"#what-can-you-expect-from-this-tutorial\",\"depth\":2},{\"value\":\"Deploy FerretDB\",\"url\":\"#deploy-ferretdb\",\"depth\":2},{\"value\":\"Connect to FerretDB\",\"url\":\"#connect-to-ferretdb\",\"depth\":2},{\"value\":\"Run example queries on FerretDB\",\"url\":\"#run-example-queries-on-ferretdb\",\"depth\":2},{\"value\":\"Scripting\",\"url\":\"#scripting\",\"depth\":2},{\"value\":\"Prometheus Metrics\",\"url\":\"#prometheus-metrics\",\"depth\":2},{\"value\":\"Resources\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Getting Started with FerretDB on Docker\",\"datePublished\":\"2023-06-15T02:00:00.000Z\",\"dateModified\":\"2023-06-15T02:00:00.000Z\",\"description\":\"This tutorial shows you how to get started using ferretdb on docker.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2023/06/14/getting-started-with-ferretdb-on-docker\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"How to Run a AMD64 Bit Linux VM on a Mac M1\",\"date\":\"2023-05-26T12:35:38.000Z\",\"tags\":[\"linux\",\"macosx\",\"virtualization\"],\"draft\":false,\"summary\":\"This tutorial shows you how to run a amd64 linux vm on a mac m1 arm64 architecture.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"3 min read\",\"minutes\":2.765,\"time\":165900,\"words\":553},\"slug\":\"2023/05/26/how-to-run-a-amd64-bit-linux-vm-on-a-mac-m1\",\"path\":\"blog/2023/05/26/how-to-run-a-amd64-bit-linux-vm-on-a-mac-m1\",\"filePath\":\"blog/2023/05/26/how-to-run-a-amd64-bit-linux-vm-on-a-mac-m1.mdx\",\"toc\":[{\"value\":\"Installation\",\"url\":\"#installation\",\"depth\":2},{\"value\":\"Creating a Virtual Machine\",\"url\":\"#creating-a-virtual-machine\",\"depth\":2},{\"value\":\"Starting your VM\",\"url\":\"#starting-your-vm\",\"depth\":2},{\"value\":\"SSH to your VM\",\"url\":\"#ssh-to-your-vm\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"How to Run a AMD64 Bit Linux VM on a Mac M1\",\"datePublished\":\"2023-05-26T12:35:38.000Z\",\"dateModified\":\"2023-05-26T12:35:38.000Z\",\"description\":\"This tutorial shows you how to run a amd64 linux vm on a mac m1 arm64 architecture.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2023/05/26/how-to-run-a-amd64-bit-linux-vm-on-a-mac-m1\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Running a Multi-Broker Kafka Cluster on Docker\",\"date\":\"2023-05-17T14:50:57.000Z\",\"tags\":[\"docker\",\"kafka\",\"clustering\"],\"draft\":false,\"summary\":\"This tutorial shows you how to run a multi-broker kafka cluster on docker.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"6 min read\",\"minutes\":5.795,\"time\":347700,\"words\":1159},\"slug\":\"2023/05/17/running-a-multi-broker-kafka-cluster-on-docker\",\"path\":\"blog/2023/05/17/running-a-multi-broker-kafka-cluster-on-docker\",\"filePath\":\"blog/2023/05/17/running-a-multi-broker-kafka-cluster-on-docker.mdx\",\"toc\":[{\"value\":\"What is Kafka?\",\"url\":\"#what-is-kafka\",\"depth\":2},{\"value\":\"Launch Kafka\",\"url\":\"#launch-kafka\",\"depth\":2},{\"value\":\"Producers and Consumers\",\"url\":\"#producers-and-consumers\",\"depth\":2},{\"value\":\"Kafka UI\",\"url\":\"#kafka-ui\",\"depth\":2},{\"value\":\"Resources\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Running a Multi-Broker Kafka Cluster on Docker\",\"datePublished\":\"2023-05-17T14:50:57.000Z\",\"dateModified\":\"2023-05-17T14:50:57.000Z\",\"description\":\"This tutorial shows you how to run a multi-broker kafka cluster on docker.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2023/05/17/running-a-multi-broker-kafka-cluster-on-docker\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Manage Helm Releases with Terraform\",\"date\":\"2023-03-09T21:15:47.000Z\",\"tags\":[\"terraform\",\"helm\",\"kubernetes\",\"devops\"],\"draft\":false,\"summary\":\"This tutorial shows you how to manage helm releases with terraform.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"9 min read\",\"minutes\":8.99,\"time\":539400,\"words\":1798},\"slug\":\"2023/03/09/manage-helm-releases-with-terraform\",\"path\":\"blog/2023/03/09/manage-helm-releases-with-terraform\",\"filePath\":\"blog/2023/03/09/manage-helm-releases-with-terraform.mdx\",\"toc\":[{\"value\":\"Kubernetes\",\"url\":\"#kubernetes\",\"depth\":2},{\"value\":\"Installing the Pre-Requirements\",\"url\":\"#installing-the-pre-requirements\",\"depth\":2},{\"value\":\"Terraform\",\"url\":\"#terraform\",\"depth\":2},{\"value\":\"Helm Releases with Terraform\",\"url\":\"#helm-releases-with-terraform\",\"depth\":2},{\"value\":\"Importing Helm Releases into Terraform State\",\"url\":\"#importing-helm-releases-into-terraform-state\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Manage Helm Releases with Terraform\",\"datePublished\":\"2023-03-09T21:15:47.000Z\",\"dateModified\":\"2023-03-09T21:15:47.000Z\",\"description\":\"This tutorial shows you how to manage helm releases with terraform.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2023/03/09/manage-helm-releases-with-terraform\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Persisting Terraform Remote State in Gitlab\",\"date\":\"2023-03-05T06:43:54.000Z\",\"tags\":[\"terraform\",\"devops\",\"gitlab\"],\"draft\":false,\"summary\":\"This tutorial shows you how to persist terraform remote state in gitlab.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"3 min read\",\"minutes\":2.99,\"time\":179400,\"words\":598},\"slug\":\"2023/03/05/persisting-terraform-remote-state-in-gitlab\",\"path\":\"blog/2023/03/05/persisting-terraform-remote-state-in-gitlab\",\"filePath\":\"blog/2023/03/05/persisting-terraform-remote-state-in-gitlab.mdx\",\"toc\":[{\"value\":\"What are we doing?\",\"url\":\"#what-are-we-doing\",\"depth\":2},{\"value\":\"Prerequisites\",\"url\":\"#prerequisites\",\"depth\":2},{\"value\":\"Authentication\",\"url\":\"#authentication\",\"depth\":2},{\"value\":\"Terraform Code\",\"url\":\"#terraform-code\",\"depth\":2},{\"value\":\"Gitlab Pipeline\",\"url\":\"#gitlab-pipeline\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Persisting Terraform Remote State in Gitlab\",\"datePublished\":\"2023-03-05T06:43:54.000Z\",\"dateModified\":\"2023-03-05T06:43:54.000Z\",\"description\":\"This tutorial shows you how to persist terraform remote state in gitlab.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2023/03/05/persisting-terraform-remote-state-in-gitlab\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Everything you need to know about Helm\",\"date\":\"2023-01-24T21:02:22.000Z\",\"tags\":[\"kubernetes\",\"helm\",\"devops\"],\"draft\":false,\"summary\":\"This tutorial shows you everything you need to know about helm.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"10 min read\",\"minutes\":9.77,\"time\":586200,\"words\":1954}
1,\"slug\":\"2023/01/24/everything-you-need-to-know-about-helm\",\"path\":\"blog/2023/01/24/everything-you-need-to-know-about-helm\",\"filePath\":\"blog/2023/01/24/everything-you-need-to-know-about-helm.mdx\",\"toc\":[{\"value\":\"What is Helm?\",\"url\":\"#what-is-helm\",\"depth\":2},{\"value\":\"How does Helm work?\",\"url\":\"#how-does-helm-work\",\"depth\":2},{\"value\":\"Helm Charts\",\"url\":\"#helm-charts\",\"depth\":2},{\"value\":\"Using Helm to deploy applications\",\"url\":\"#using-helm-to-deploy-applications\",\"depth\":2},{\"value\":\"Installing a Helm Release\",\"url\":\"#installing-a-helm-release\",\"depth\":2},{\"value\":\"Information about the release\",\"url\":\"#information-about-the-release\",\"depth\":2},{\"value\":\"Creating your own helm charts\",\"url\":\"#creating-your-own-helm-charts\",\"depth\":2},{\"value\":\"Publish your Helm Chart to ChartMuseum\",\"url\":\"#publish-your-helm-chart-to-chartmuseum\",\"depth\":2},{\"value\":\"Resources\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Everything you need to know about Helm\",\"datePublished\":\"2023-01-24T21:02:22.000Z\",\"dateModified\":\"2023-01-24T21:02:22.000Z\",\"description\":\"This tutorial shows you everything you need to know about helm.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2023/01/24/everything-you-need-to-know-about-helm\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Getting Started with Wiremock\",\"date\":\"2023-01-14T23:03:12.000Z\",\"tags\":[\"wiremock\",\"devops\",\"docker\"],\"draft\":false,\"summary\":\"Wiremock Tutorial: This tutorial shows you how to get started with wiremock.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"2 min read\",\"minutes\":1.44,\"time\":86400,\"words\":288},\"slug\":\"2023/01/14/getting-started-with-wiremock\",\"path\":\"blog/2023/01/14/getting-started-with-wiremock\",\"filePath\":\"blog/2023/01/14/getting-started-with-wiremock.mdx\",\"toc\":[{\"value\":\"Wiremock\",\"url\":\"#wiremock\",\"depth\":2},{\"value\":\"Docker and Wiremock\",\"url\":\"#docker-and-wiremock\",\"depth\":2},{\"value\":\"Test Wiremock\",\"url\":\"#test-wiremock\",\"depth\":2},{\"value\":\"Export Wiremock Mappings\",\"url\":\"#export-wiremock-mappings\",\"depth\":2},{\"value\":\"Import Wiremock Mappings\",\"url\":\"#import-wiremock-mappings\",\"depth\":2},{\"value\":\"Resources\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Getting Started with Wiremock\",\"datePublished\":\"2023-01-14T23:03:12.000Z\",\"dateModified\":\"2023-01-14T23:03:12.000Z\",\"description\":\"Wiremock Tutorial: This tutorial shows you how to get started with wiremock.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2023/01/14/getting-started-with-wiremock\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Logging with Docker Promtail and Grafana Loki\",\"date\":\"2022-11-18T05:42:49.000Z\",\"tags\":[\"docker\",\"grafana\",\"loki\",\"promtail\",\"devops\"],\"draft\":false,\"summary\":\"This tutorial shows you how to utilise log management with docer promtail and grafana loki.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"3 min read\",\"minutes\":2.435,\"time\":146100,\"words\":487},\"slug\":\"2022/11/18/logging-with-docker-promtail-and-grafana-loki\",\"path\":\"blog/2022/11/18/logging-with-docker-promtail-and-grafana-loki\",\"filePath\":\"blog/2022/11/18/logging-with-docker-promtail-and-grafana-loki.mdx\",\"toc\":[{\"value\":\"About\",\"url\":\"#about\",\"depth\":2},{\"value\":\"Promtail\",\"url\":\"#promtail\",\"depth\":2},{\"value\":\"Grafana Config\",\"url\":\"#grafana-config\",\"depth\":2},{\"value\":\"Docker Compose\",\"url\":\"#docker-compose\",\"depth\":2},{\"value\":\"Start the stack\",\"url\":\"#start-the-stack\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Logging with Docker Promtail and Grafana Loki\",\"datePublished\":\"2022-11-18T05:42:49.000Z\",\"dateModified\":\"2022-11-18T05:42:49.000Z\",\"description\":\"This tutorial shows you how to utilise log management with docer promtail and grafana loki.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2022/11/18/logging-with-docker-promtail-and-grafana-loki\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"KinD for Local Kubernetes Clusters\",\"date\":\"2022-09-20T06:18:16.000Z\",\"tags\":[\"kubernetes\",\"kind\",\"docker\",\"devops\"],\"draft\":false,\"summary\":\"Step by step guide to demonstrate how to setup a local kubernetes cluster with KinD, and it's amazing\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"4 min read\",\"minutes\":3.78,\"time\":226800,\"words\":756}
1,\"slug\":\"2022/09/20/kind-for-local-kubernetes-clusters\",\"path\":\"blog/2022/09/20/kind-for-local-kubernetes-clusters\",\"filePath\":\"blog/2022/09/20/kind-for-local-kubernetes-clusters.mdx\",\"toc\":[{\"value\":\"About\",\"url\":\"#about\",\"depth\":2},{\"value\":\"Installation\",\"url\":\"#installation\",\"depth\":2},{\"value\":\"Create a Cluster\",\"url\":\"#create-a-cluster\",\"depth\":2},{\"value\":\"Create a Cluster with Config\",\"url\":\"#create-a-cluster-with-config\",\"depth\":2},{\"value\":\"Interact with the Cluster\",\"url\":\"#interact-with-the-cluster\",\"depth\":2},{\"value\":\"Deploy Sample Application\",\"url\":\"#deploy-sample-application\",\"depth\":2},{\"value\":\"Delete Kind Cluster\",\"url\":\"#delete-kind-cluster\",\"depth\":2},{\"value\":\"Extras\",\"url\":\"#extras\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"KinD for Local Kubernetes Clusters\",\"datePublished\":\"2022-09-20T06:18:16.000Z\",\"dateModified\":\"2022-09-20T06:18:16.000Z\",\"description\":\"Step by step guide to demonstrate how to setup a local kubernetes cluster with KinD, and it's amazing\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2022/09/20/kind-for-local-kubernetes-clusters\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Setup a Digibyte Mainnet Fullnode\",\"date\":\"2022-09-18T00:55:23.000Z\",\"tags\":[\"blockchain\",\"digibyte\",\"crypto\"],\"draft\":false,\"summary\":\"Blockchain and Digibyte: This tutorial will demonstrate how to setup a digibyte fullnode on the mainnet chain to interact with the blockchain.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"5 min read\",\"minutes\":4.36,\"time\":261600,\"words\":872},\"slug\":\"2022/09/17/setup-a-digibyte-mainnet-fullnode\",\"path\":\"blog/2022/09/17/setup-a-digibyte-mainnet-fullnode\",\"filePath\":\"blog/2022/09/17/setup-a-digibyte-mainnet-fullnode.mdx\",\"toc\":[{\"value\":\"What is a Full Node\",\"url\":\"#what-is-a-full-node\",\"depth\":2},{\"value\":\"Hardware Requirements\",\"url\":\"#hardware-requirements\",\"depth\":2},{\"value\":\"Setup the Pre-Requisites\",\"url\":\"#setup-the-pre-requisites\",\"depth\":2},{\"value\":\"Download the Software\",\"url\":\"#download-the-software\",\"depth\":2},{\"value\":\"SystemD\",\"url\":\"#systemd\",\"depth\":2},{\"value\":\"Interact with the Node\",\"url\":\"#interact-with-the-node\",\"depth\":2},{\"value\":\"Making a Transaction to my Wallet\",\"url\":\"#making-a-transaction-to-my-wallet\",\"depth\":2},{\"value\":\"Resources\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Setup a Digibyte Mainnet Fullnode\",\"datePublished\":\"2022-09-18T00:55:23.000Z\",\"dateModified\":\"2022-09-18T00:55:23.000Z\",\"description\":\"Blockchain and Digibyte: This tutorial will demonstrate how to setup a digibyte fullnode on the mainnet chain to interact with the blockchain.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2022/09/17/setup-a-digibyte-mainnet-fullnode\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Ansible Playbook for your Macbook Homebrew Packages\",\"date\":\"2022-08-28T23:14:54.000Z\",\"tags\":[\"ansible\",\"devops\",\"homebrew\"],\"draft\":false,\"summary\":\"This ansible playbook can be used to install homebrew packages for your macbook\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"2 min read\",\"minutes\":1.98,\"time\":118800,\"words\":396},\"slug\":\"2022/08/28/ansible-playbook-for-your-macbook-homebrew-packages\",\"path\":\"blog/2022/08/28/ansible-playbook-for-your-macbook-homebrew-packages\",\"filePath\":\"blog/2022/08/28/ansible-playbook-for-your-macbook-homebrew-packages.mdx\",\"toc\":[{\"value\":\"Install Ansible\",\"url\":\"#install-ansible\",\"depth\":2},{\"value\":\"Ansible Configuration\",\"url\":\"#ansible-configuration\",\"depth\":2},{\"value\":\"Ansible Playbook\",\"url\":\"#ansible-playbook\",\"depth\":2},{\"value\":\"Deploy Playbook\",\"url\":\"#deploy-playbook\",\"depth\":2},{\"value\":\"Source Code\",\"url\":\"#source-code\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Ansible Playbook for your Macbook Homebrew Packages\",\"datePublished\":\"2022-08-28T23:14:54.000Z\",\"dateModified\":\"2022-08-28T23:14:54.000Z\",\"description\":\"This ansible playbook can be used to install homebrew packages for your macbook\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2022/08/28/ansible-playbook-for-your-macbook-homebrew-packages\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Docker Multistage Builds for Hugo\",\"date\":\"2022-07-31T06:23:51.000Z\",\"tags\":[\"hugo\",\"docker\",\"devops\"],\"draft\":false,\"summary\":\"This tutorial demonstrates how to use multistage builds using docker to take advantage of reducing the size of your final container image. This demonstration will use Hugo as an example.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"4 min read\",\"minutes\":3.55,\"time\":213000,\"words\":710},\"slug\":\"2022/07/31/docker-multistage-builds-for-hugo\",\"path\":\"blog/2022/07/31/docker-multistage-builds-for-hugo\",\"filePath\":\"blog/2022/07/31/docker-multistage-builds-for-hugo.mdx\",\"toc\":[{\"value\":\"What are we doing today\",\"url\":\"#what-are-we-doing-today\",\"depth\":2},{\"value\":\"Our Build Strategy\",\"url\":\"#our-build-strategy\",\"depth\":2},{\"value\":\"Building our Container Image\",\"url\":\"#building-our-container-image\",\"depth\":2},{\"value\":\"Running our Container\",\"url\":\"#running-our-container\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Docker Multistage Builds for Hugo\",\"datePublished\":\"2022-07-31T06:23:51.000Z\",\"dateModified\":\"2022-07-31T06:23:51.000Z\",\"description\":\"This tutorial demonstrates how to use multistage builds using docker to take advantage of reducing the size of your final container image. This demonstration will use Hugo as an example.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2022/07/31/docker-multistage-builds-for-hugo\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Remote Builds with Docker Contexts\",\"date\":\"2022-07-14T05:57:34.000Z\",\"tags\":[\"docker\",\"devops\"],\"draft\":false,\"summary\":\"see how you can use remote docker 
1contexts to save your laptops battery life by running computational heavy tasks on a remote docker engine with docker contexts\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"4 min read\",\"minutes\":3.155,\"time\":189300,\"words\":631},\"slug\":\"2022/07/14/remote-builds-with-docker-contexts\",\"path\":\"blog/2022/07/14/remote-builds-with-docker-contexts\",\"filePath\":\"blog/2022/07/14/remote-builds-with-docker-contexts.mdx\",\"toc\":[{\"value\":\"About\",\"url\":\"#about\",\"depth\":2},{\"value\":\"Password-less SSH\",\"url\":\"#password-less-ssh\",\"depth\":2},{\"value\":\"Docker Context\",\"url\":\"#docker-context\",\"depth\":2},{\"value\":\"Using Contexts\",\"url\":\"#using-contexts\",\"depth\":2},{\"value\":\"Running Containers over Contexts\",\"url\":\"#running-containers-over-contexts\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Remote Builds with Docker Contexts\",\"datePublished\":\"2022-07-14T05:57:34.000Z\",\"dateModified\":\"2022-07-14T05:57:34.000Z\",\"description\":\"see how you can use remote docker contexts to save your laptops battery life by running computational heavy tasks on a remote docker engine with docker contexts\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2022/07/14/remote-builds-with-docker-contexts\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Create a RAID5 Array with mdadm on Linux\",\"date\":\"2022-06-29T09:02:13.000Z\",\"tags\":[\"raid\",\"linux\",\"storage\",\"sysadmin\"],\"draft\":false,\"summary\":\"Learn how to setup a RAID5 array on Linux to achieve data redundancy for your servers.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"10 min read\",\"minutes\":9.86,\"time\":591600,\"words\":1972},\"slug\":\"2022/06/29/create-a-raid5-array-with-mdadm-on-linux\",\"path\":\"blog/2022/06/29/create-a-raid5-array-with-mdadm-on-linux\",\"filePath\":\"blog/2022/06/29/create-a-raid5-array-with-mdadm-on-linux.mdx\",\"toc\":[{\"value\":\"What are we trying to achieve\",\"url\":\"#what-are-we-trying-to-achieve\",\"depth\":2},{\"value\":\"Hardware Overview\",\"url\":\"#hardware-overview\",\"depth\":2},{\"value\":\"Dependencies\",\"url\":\"#dependencies\",\"depth\":2},{\"value\":\"Format Disks\",\"url\":\"#format-disks\",\"depth\":2},{\"value\":\"Create RAID5 Array\",\"url\":\"#create-raid5-array\",\"depth\":2},{\"value\":\"Create Filesystems\",\"url\":\"#create-filesystems\",\"depth\":2},{\"value\":\"RAID Configuration (across reboots)\",\"url\":\"#raid-configuration-across-reboots\",\"depth\":2},{\"value\":\"Adding Spare Devices\",\"url\":\"#adding-spare-devices\",\"depth\":2},{\"value\":\"Resizing our Filesystem\",\"url\":\"#resizing-our-filesystem\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Create a RAID5 Array with mdadm on Linux\",\"datePublished\":\"2022-06-29T09:02:13.000Z\",\"dateModified\":\"2022-06-29T09:02:13.000Z\",\"description\":\"Learn how to setup a RAID5 array on Linux to achieve data redundancy for your servers.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2022/06/29/create-a-raid5-array-with-mdadm-on-linux\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Install a specific Python version on Ubuntu\",\"date\":\"2022-06-23T21:53:46.000Z\",\"tags\":[\"linux\",\"python\",\"ubuntu\",\"sysadmin\"],\"draft\":false,\"summary\":\"This tutorial will demonstrate how to install a specific version of Python on Ubuntu Linux.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"2 min read\",\"minutes\":1.295,\"time\":77700,\"words\":259},\"slug\":\"2022/06/23/install-a-specific-python-version-on-ubuntu\",\"path\":\"blog/2022/06/23/install-a-specific-python-version-on-ubuntu\",\"filePath\":\"blog/2022/06/23/install-a-specific-python-version-on-ubuntu.mdx\",\"toc\":[{\"value\":\"Dependencies\",\"url\":\"#dependencies\",\"depth\":2},{\"value\":\"Python Versions\",\"url\":\"#python-versions\",\"depth\":2},{\"value\":\"Installation\",\"url\":\"#installation\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Install a specific Python ver
1sion on Ubuntu\",\"datePublished\":\"2022-06-23T21:53:46.000Z\",\"dateModified\":\"2022-06-23T21:53:46.000Z\",\"description\":\"This tutorial will demonstrate how to install a specific version of Python on Ubuntu Linux.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2022/06/23/install-a-specific-python-version-on-ubuntu\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"How to persist iptables rules after reboots\",\"date\":\"2022-06-15T10:10:12.000Z\",\"tags\":[\"security\",\"linux\",\"iptables\",\"sysadmin\"],\"draft\":false,\"summary\":\"In this tutorial we will demonstrate how to persist iptables rules across reboots.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"2 min read\",\"minutes\":1.095,\"time\":65700,\"words\":219},\"slug\":\"2022/06/15/how-to-persist-iptables-rules-after-reboots\",\"path\":\"blog/2022/06/15/how-to-persist-iptables-rules-after-reboots\",\"filePath\":\"blog/2022/06/15/how-to-persist-iptables-rules-after-reboots.mdx\",\"toc\":[{\"value\":\"Rules Peristence\",\"url\":\"#rules-peristence\",\"depth\":2},{\"value\":\"Dependencies\",\"url\":\"#dependencies\",\"depth\":2},{\"value\":\"Creating Iptables Rules\",\"url\":\"#creating-iptables-rules\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"How to persist iptables rules after reboots\",\"datePublished\":\"2022-06-15T10:10:12.000Z\",\"dateModified\":\"2022-06-15T10:10:12.000Z\",\"description\":\"In this tutorial we will demonstrate how to persist iptables rules across reboots.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2022/06/15/how-to-persist-iptables-rules-after-reboots\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"How to Read and Write json data with Python\",\"date\":\"2022-06-14T23:02:53.000Z\",\"tags\":[\"python\",\"programming\"],\"draft\":false,\"summary\":\"This tutorial shows you how to read and write json data with python.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"1 min read\",\"minutes\":0.81,\"time\":48600,\"words\":162},\"slug\":\"2022/06/14/how-to-read-and-write-json-data-with-python\",\"path\":\"blog/2022/06/14/how-to-read-and-write-json-data-with-python\",\"filePath\":\"blog/2022/06/14/how-to-read-and-write-json-data-with-python.mdx\",\"toc\":[{\"value\":\"Example\",\"url\":\"#example\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"How to Read and Write json data with Python\",\"datePublished\":\"2022-06-14T23:02:53.000Z\",\"dateModified\":\"2022-06-14T23:02:53.000Z\",\"description\":\"This tutorial shows you how to read and write json data with python.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2022/06/14/how-to-read-and-write-json-data-with-python\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Setup Linkding Bookmarks Manager on Docker\",\"date\":\"2022-05-31T19:50:24.000Z\",\"tags\":[\"docker\",\"bookmarks\",\"self-hosted\"],\"draft\":false,\"summary\":\"Linkding is a Bookmarks Service that runs on docker and is self-hosted. This tutorial will demonstrate how to setup linkding on docker.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"3 min read\",\"minutes\":2.555,\"time\":153300,\"words\":511},\"slug\":\"2022/05/31/setup-linkding-bookmarks-manager-on-docker\",\"path\":\"blog/2022/05/31/setup-linkding-bookmarks-manager-on-docker\",\"filePath\":\"blog/2022/05/31/setup-linkding-bookmarks-manager-on-docker.mdx\",\"toc\":[{\"value\":\"Installing Linkding\",\"url\":\"#installing-linkding\",\"depth\":2},{\"value\":\"Admin Account Registration\",\"url\":\"#admin-account-registration\",\"depth\":2},{\"value\":\"Creating Bookmarks\",\"url\":\"#creating-bookmarks\",\"depth\":2},{\"value\":\"Browser Extensions\",\"url\":\"#browser-extensions\",\"depth\":2},{\"value\":\"REST API\",\"url\":\"#rest-api\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Setup Linkding Bookmarks Manager on Docker\",\"datePublished\":\"2022-05-31T19:50:24.000Z\",\"dateModified\":\"2022-05-31T19:50:24.000Z\",\"description\":\"Linkding is a Bookmarks Service that runs on docker and is self-hosted. This tutorial will demonstrate how to setup linkding on docker.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2022/0
15/31/setup-linkding-bookmarks-manager-on-docker\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Python Flask Forms with Jinja Templating\",\"date\":\"2022-05-31T06:39:30.000Z\",\"tags\":[\"python\",\"flask\",\"programming\",\"web-development\"],\"draft\":false,\"summary\":\"This tutorial shows you how to use python flask forms with jinja templating.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"3 min read\",\"minutes\":2.175,\"time\":130500,\"words\":435},\"slug\":\"2022/05/31/python-flask-forms-with-jinja-templating\",\"path\":\"blog/2022/05/31/python-flask-forms-with-jinja-templating\",\"filePath\":\"blog/2022/05/31/python-flask-forms-with-jinja-templating.mdx\",\"toc\":[{\"value\":\"Install Flask\",\"url\":\"#install-flask\",\"depth\":2},{\"value\":\"The Code\",\"url\":\"#the-code\",\"depth\":2},{\"value\":\"Screenshots\",\"url\":\"#screenshots\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Python Flask Forms with Jinja Templating\",\"datePublished\":\"2022-05-31T06:39:30.000Z\",\"dateModified\":\"2022-05-31T06:39:30.000Z\",\"description\":\"This tutorial shows you how to use python flask forms with jinja templating.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2022/05/31/python-flask-forms-with-jinja-templating\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Prometheus Relabel Config Examples\",\"date\":\"2022-05-30T07:01:01.000Z\",\"tags\":[\"prometheus\",\"docker\",\"devops\"],\"draft\":false,\"summary\":\"This tutorial shows you example prometheus relabel configurations.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"4 min read\",\"minutes\":3.18,\"time\":190800,\"words\":636},\"slug\":\"2022/05/30/prometheus-relabel-config-examples\",\"path\":\"blog/2022/05/30/prometheus-relabel-config-examples\",\"filePath\":\"blog/2022/05/30/prometheus-relabel-config-examples.mdx\",\"toc\":[{\"value\":\"Prometheus Relabling\",\"url\":\"#prometheus-relabling\",\"depth\":2},{\"value\":\"AWS EC2 SD Configs\",\"url\":\"#aws-ec2-sd-configs\",\"depth\":2},{\"value\":\"Stack\",\"url\":\"#stack\",\"depth\":2},{\"value\":\"References\",\"url\":\"#references\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Prometheus Relabel Config Examples\",\"datePublished\":\"2022-05-30T07:01:01.000Z\",\"dateModified\":\"2022-05-30T07:01:01.000Z\",\"description\":\"This tutorial shows you example prometheus relabel configurations.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2022/05/30/prometheus-relabel-config-examples\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Create a AWS Lambda Layer with Docker\",\"date\":\"2022-05-27T10:19:05.000Z\",\"tags\":[\"aws\",\"lambda\",\"docker\",\"devops\"],\"draft\":false,\"summary\":\"This tutorial shows you how to create a aws lambda layer with docker.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"2 min read\",\"minutes\":1.695,\"time\":101700,\"words\":339},\"slug\":\"2022/05/27/create-a-aws-lambda-layer-with-docker\",\"path\":\"blog/2022/05/27/create-a-aws-lambda-layer-with-docker\",\"filePath\":\"blog/2022/05/27/create-a-aws-lambda-layer-with-docker.mdx\",\"toc\":[{\"value\":\"Getting Started\",\"url\":\"#getting-started\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Create a AWS Lambda Layer with Docker\",\"datePublished\":\"2022-05-27T10:19:05.000Z\",\"dateModified\":\"2022-05-27T10:19:05.000Z\",\"description\":\"This tutorial shows you how to create a aws lambda layer with docker.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2022/0
15/27/create-a-aws-lambda-layer-with-docker\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Customize VIM Editor with a Brand New Look\",\"date\":\"2022-05-11T21:10:16.000Z\",\"tags\":[\"vim\",\"linux\"],\"draft\":false,\"summary\":\"This tutorial shows you how to customize your vim editor to give it a brand new look.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"6 min read\",\"minutes\":5.19,\"time\":311400,\"words\":1038},\"slug\":\"2022/05/11/customize-vim-editor-with-a-brand-new-look\",\"path\":\"blog/2022/05/11/customize-vim-editor-with-a-brand-new-look\",\"filePath\":\"blog/2022/05/11/customize-vim-editor-with-a-brand-new-look.mdx\",\"toc\":[{\"value\":\"About Vim\",\"url\":\"#about-vim\",\"depth\":2},{\"value\":\"Install Vim\",\"url\":\"#install-vim\",\"depth\":2},{\"value\":\"Color Scheme\",\"url\":\"#color-scheme\",\"depth\":2},{\"value\":\"Vim Configuration\",\"url\":\"#vim-configuration\",\"depth\":2},{\"value\":\"Plugins\",\"url\":\"#plugins\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Customize VIM Editor with a Brand New Look\",\"datePublished\":\"2022-05-11T21:10:16.000Z\",\"dateModified\":\"2022-05-11T21:10:16.000Z\",\"description\":\"This tutorial shows you how to customize your vim editor to give it a brand new look.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2022/05/11/customize-vim-editor-with-a-brand-new-look\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Create a Discord Bot in Python\",\"date\":\"2022-05-05T08:32:12.000Z\",\"tags\":[\"discord\",\"python\"],\"draft\":false,\"summary\":\"This tutorial shows you how to create a discord bot in python.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"6 min read\",\"minutes\":5.255,\"time\":315300,\"words\":1051},\"slug\":\"2022/05/05/create-a-discord-bot-in-python\",\"path\":\"blog/2022/05/05/create-a-discord-bot-in-python\",\"filePath\":\"blog/2022/05/05/create-a-discord-bot-in-python.mdx\",\"toc\":[{\"value\":\"About the bot\",\"url\":\"#about-the-bot\",\"depth\":2},{\"value\":\"Dependencies\",\"url\":\"#dependencies\",\"depth\":2},{\"value\":\"Create the Discord Application\",\"url\":\"#create-the-discord-application\",\"depth\":2},{\"value\":\"Developing the Discord Bot\",\"url\":\"#developing-the-discord-bot\",\"depth\":2},{\"value\":\"Resources\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Create a Discord Bot in Python\",\"datePublished\":\"2022-05-05T08:32:12.000Z\",\"dateModified\":\"2022-05-05T08:32:12.000Z\",\"description\":\"This tutorial shows you how to create a discord bot in python.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2022/05/05/create-a-discord-bot-in-python\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Publish and use your Ansible Role from Git\",\"date\":\"2022-04-19T08:35:09.000Z\",\"tags\":[\"devops\",\"ansible\",\"git\"],\"draft\":false,\"summary\":\"This tutorial shows you how to publish and use your own ansible role on git.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"4 min read\",\"minutes\":3.51,\"time\":210600,\"words\":702},\"slug\":\"2022/04/19/publish-and-use-your-ansible-role-from-git\",\"path\":\"blog/2022/04/19/publish-and-use-your-ansible-role-from-git\",\"filePath\":\"blog/2022/04/19/publish-and-use-your-ansible-role-from-git.mdx\",\"toc\":[{\"value\":\"Ansible Installation\",\"url\":\"#ansible-installation\",\"depth\":2},{\"value\":\"Initialize Ansible Role\",\"url\":\"#initialize-ansible-role\",\"depth\":2},{\"value\":\"Define Role Tasks\",\"url\":\"#define-role-tasks\",\"depth\":2},{\"value\":\"Commit to Git\",\"url\":\"#commit-to-git\",\"depth\":2},{\"value\":\"SSH Config Client Side\",\"url\":\"#ssh-config-client-side\",\"depth\":2},{\"value\":\"Installing the Ansible Role from Git\",\"url\":\"#installing-the-ansible-role-from-git\",\"depth\":2},{\"value\":\"Ansible Playbook\",\"url\":\"#ansible-playbook\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Publish and use your Ansible Role from Git\",\"datePublished\":\"2022-04-19T08:35:09.000Z\",\"dateModified\":\"2022-04-19T08:35:09.000Z\",\"description\":\"This tutorial shows you how to publish and use your own ansible role on git.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2022/04/19/publish-and-use-your-ansible-role-from-git\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Provision a AWS EC2 Instance with Terraform\",\"date\":\"2022-04-16T23:04:08.000Z\",\"tags\":[\"devops\",\"terraform\",\"aws\"],\"draft\":false,\"summary\":\"This tutorial shows you how to provision a aws ec2 instance with terraform.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"6 min read\",\"minutes\":5.705,\"time\":342300,\"words\":1141},\"slug\":\"2022/04/16/provision-a-aws-ec2-instance-with-terraform\",\"path\":\"blog/2022/04/16/provision-a-aws-ec2-instance-with-terraform\",\"filePath\":\"blog/2022/04/16/provision-a-aws-ec2-instance-with-terraform.mdx\",\"toc\":[{\"value\":\"Requirements\",\"url\":\"#requirements\",\"depth\":2},{\"value\":\"Terraform\",\"url\":\"#terraform\",\"depth\":2},{\"value\":\"Terraform Project Structure\",\"url\":\"#terraform-project-structure\",\"depth\":2},{\"value\":\"Define Terraform Configuration Code\",\"url\":\"#define-terraform-configuration-code\",\"depth\":2},{\"value\":\"Deploy EC2 Instance\",\"url\":\"#deploy-ec2-instance\",\"depth\":2},{\"value\":\"Access your EC2 Instance\",\"url\":\"#access-your-ec2-instance\",\"depth\":2},{\"value\":\"Cleanup\",\"url\":\"#cleanup\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Provision a AWS EC2 Instance with Terraform\",\"datePublished\":\"2022-04-16T23:04:08.000Z\",\"dateModified\":\"2022-04-16T23:04:08.000Z\",\"description\":\"This tutorial shows you how to provision a aws ec2 instance with terraform.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2022/04/16/provision-a-aws-ec2-instance-with-terraform\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Matrix Bot using SimpleMatrixBotlib in Python\",\"date\":\"2022-03-29T22:50:43.000Z\",\"tags\":[\"python\",\"matrix\",\"bots\"],\"draft\":false,\"summary\":\"This tutorial shows you how to develop a matrix bot using python.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"3 min read\",\"minutes\":2.845,\"time\":170700,\"words\":569},\"slug\":\"2022/03/29/matrix-bot-using-simplematrixbotlib-in-python\",\"path\":\"blog/2022/03/29/matrix-bot-using-simplematrixbotlib-in-python\",\"filePath\":\"blog/2022/03/29/matrix-bot-using-simplematrixbotlib-in-python.mdx\",\"toc\":[{\"value\":\"Matrix Server\",\"url\":\"#matrix-server\",\"depth\":2},{\"value\":\"Matrix Python Bot\",\"url\":\"#matrix-python-bot\",\"depth\":2},{\"value\":\"Resources\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Matrix Bot using SimpleMatrixBotlib in Python\",\"datePublished\":\"2022-03-29T22:50:43.000Z\",\"dateModified\":\"2022-03-29T22:50:43.000Z\",\"description\":\"This tutorial shows you how to develop a matrix bot using python.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2022/03/29/matrix-bot-using-simplematrixbotlib-in-python\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}}
1,{\"title\":\"Setup Matrix and Element Chat Server\",\"date\":\"2022-03-29T22:33:49.000Z\",\"tags\":[\"matrix\",\"element\",\"communication\",\"docker\"],\"draft\":false,\"summary\":\"This tutorial shows you how to setup a matrix and element chat server.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"4 min read\",\"minutes\":3.105,\"time\":186300,\"words\":621},\"slug\":\"2022/03/29/setup-matrix-and-element-chat-server\",\"path\":\"blog/2022/03/29/setup-matrix-and-element-chat-server\",\"filePath\":\"blog/2022/03/29/setup-matrix-and-element-chat-server.mdx\",\"toc\":[{\"value\":\"What is Matrix?\",\"url\":\"#what-is-matrix\",\"depth\":2},{\"value\":\"Install Docker\",\"url\":\"#install-docker\",\"depth\":2},{\"value\":\"Install Matrix Server\",\"url\":\"#install-matrix-server\",\"depth\":2},{\"value\":\"Caddy Reverse Proxy\",\"url\":\"#caddy-reverse-proxy\",\"depth\":2},{\"value\":\"Admin Element User\",\"url\":\"#admin-element-user\",\"depth\":2},{\"value\":\"Resources\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Setup Matrix and Element Chat Server\",\"datePublished\":\"2022-03-29T22:33:49.000Z\",\"dateModified\":\"2022-03-29T22:33:49.000Z\",\"description\":\"This tutorial shows you how to setup a matrix and element chat server.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2022/03/29/setup-matrix-and-element-chat-server\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Load Environment Variables from File in Python\",\"date\":\"2022-03-22T11:34:11.000Z\",\"tags\":[\"python\",\"linux\",\"configuration-management\",\"programming\"],\"draft\":false,\"summary\":\"This tutorial shows you how to load environment variables from a file in python.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"2 min read\",\"minutes\":1.535,\"time\":92100,\"words\":307},\"slug\":\"2022/03/22/load-environment-variables-from-file-in-python\",\"path\":\"blog/2022/03/22/load-environment-variables-from-file-in-python\",\"filePath\":\"blog/2022/03/22/load-environment-variables-from-file-in-python.mdx\",\"toc\":[{\"value\":\"python-dotenv\",\"url\":\"#python-dotenv\",\"depth\":2},{\"value\":\"The env file\",\"url\":\"#the-env-file\",\"depth\":2},{\"value\":\"The application\",\"url\":\"#the-application\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Load Environment Variables from File in Python\",\"datePublished\":\"2022-03-22T11:34:11.000Z\",\"dateModified\":\"2022-03-22T11:34:11.000Z\",\"description\":\"This tutorial shows you how to load environment variables from a file in python.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2022/03/22/load-environment-variables-from-file-in-python\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Run a Basic Python Flask Restful API\",\"date\":\"2022-03-20T21:33:17.000Z\",\"tags\":[\"python\",\"flask\",\"programming\",\"web-development\"],\"draft\":false,\"summary\":\"This tutorial shows you how to run a basic python flask restful api.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"3 min read\",\"minutes\":2.37,\"time\":142200,\"words\":474},\"slug\":\"2022/03/20/run-a-basic-python-flask-restful-api\",\"path\":\"blog/2022/03/20/run-a-basic-python-flask-restful-api\",\"filePath\":\"blog/2022/03/20/run-a-basic-python-flask-restful-api.mdx\",\"toc\":[{\"value\":\"What is Flask Restful\",\"url\":\"#what-is-flask-restful\",\"depth\":2},{\"value\":\"Installation\",\"url\":\"#installation\",\"depth\":2},{\"value\":\"Code\",\"url\":\"#code\",\"depth\":2},{\"value\":\"Run the Server\",\"url\":\"#run-the-server\",\"depth\":2},{\"value\":\"Integration Tests\",\"url\":\"#integration-tests\",\"depth\":2},{\"value\":\"More on Flask-Restful\",\"url\":\"#more-on-flask-restful\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Run a Basic Python Flask Restful API\",\"datePublished\":\"2022-03-20T21:33:17.000Z\",\"dateModified\":\"2022-03-20T21:33:17.000Z\",\"description\":\"This tutorial shows you how to run a basic python flask restful api.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2022/03/20/run-a-basic-python-flask-restful-api\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Run OpenLDAP with a UI on Docker\",\"date\":\"2022-03-20T20:55:39.000Z\",\"tags\":[\"openldap\",\"docker\",\"authentication\"],\"draft\":false,\"summary\":\"Run OpenLDAP with a UI on Docker\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"2 min read\",\"minutes\":1.51,\"time\":90600,\"words\":302},\"slug\":\"2022/03/20/run-openldap-with-a-ui-on-docker\",\"path\":\"blog/2022/03/20/run-openldap-with-a-ui-on-docker\",\"filePath\":\"blog/2022/03/20/run-openldap-with-a-ui-on-docker.mdx\",\"toc\":[{\"value\":\"What is OpenLDAP\",\"url\":\"#what-is-openldap\",\"depth\":2},{\"value\":\"Configuration\",\"url\":\"#configuration\",\"depth\":2},{\"value\":\"Boot\",\"url\":\"#boot\",\"depth\":2},{\"value\":\"Verify Users\",\"url\":\"#verify-users\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Run OpenLDAP with a UI on Docker\",\"datePublished\":\"2022-03-20T20:55:39.000Z\",\"dateModified\":\"2022-03-20T20:55:39.000Z\",\"description\":\"Run OpenLDAP with a UI on Docker\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2022/03/20/run-openldap-with-a-ui-on-docker\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Setup a Monero Testnet Fullnode\",\"date\":\"2022-03-03T00:55:23.000Z\",\"tags\":[\"blockchain\",\"crypto\",\"monero\"],\"draft\":false,\"summary\":\"Blockchain and Monero: This tutorial will demonstrate how to setup a monero fullnode on the testnet chain to interact with the blockchain.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"15 min read\",\"minutes\":14.76,\"time\":885600,\"words\":2952},\"slug\":\"2022/03/02/setup-a-monero-testnet-fullnode\",\"path\":\"blog/2022/03/02/setup-a-monero-testnet-fullnode\",\"filePath\":\"blog/2022/03/02/setup-a-monero-testnet-fullnode.mdx\",\"toc\":[{\"value\":\"About Monero\",\"url\":\"#about-monero\",\"depth\":2},{\"value\":\"Monero Components\",\"url\":\"#monero-components\",\"depth\":2},{\"value\":\"Ports\",\"url\":\"#ports\",\"depth\":2},{\"value\":\"Preparing our Monerod Node\",\"url\":\"#preparing-our-monerod-node\",\"depth\":2},{\"value\":\"Installation of Monerod\",\"url\":\"#installation-of-monerod\",\"depth\":2},{\"value\":\"Configuration of Monerod\",\"url\":\"#configuration-of-monerod\",\"depth\":2},{\"value\":\"Start Monerod\",\"url\":\"#start-monerod\",\"depth\":2},{\"value\":\"Preparing our Monero Wallet RPC Node\",\"url\":\"#preparing-our-monero-wallet-rpc-node\",\"depth\":2},{\"value\":\"Installation of Monero Wallet RPC\",\"url\":\"#installation-of-monero-wallet-rpc\",\"depth\":2},{\"value\":\"Create the Monero Wallet\",\"url\":\"#create-the-monero-wallet\",\"depth\":2},{\"value\":\"Connecting to the Wallet with CLI\",\"url\":\"#connecting-to-the-wallet-with-cli\",\"depth\":2},{\"value\":\"Configuration of the Monero Wallet RPC Server\",\"url\":\"#configuration-of-the-monero-wallet-rpc-server\",\"depth\":2},{\"value\":\"Configuration of the Reverse Proxy\",\"url\":\"#configuration-of-the-reverse-proxy\",\"depth\":2},{\"value\":\"Test via ALB\",\"url\":\"#test-via-alb\",\"depth\":2},{\"value\":\"API Examples\",\"url\":\"#api-examples\",\"depth\":2},{\"value\":\"Monero Testnet Faucet\",\"url\":\"#monero-testnet-faucet\",\"depth\":2},{\"value\":\"Resources\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Setup a Monero Testnet Fullnode\",\"datePublished\":\"2022-03-03T00:55:23.000Z\",\"dateModified\":\"2022-03-03T00:55:23.000Z\",\"description\":\"Blockchain and Monero: This tutorial will demonstrate how to setup a monero fullnode on the testnet chain to interact with the blockchain.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2022/03/02/setup-a-monero-testnet-fullnode\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Create DNS Records with Terraform on Cloudflare\",\"date\":\"2022-02-20T18:11:06.000Z\",\"tags\":[\"terraform\",\"cloudflare\",\"devops\",\"linux\"],\"draft\":false,\"summary\":\"This tutorial shows you how to create dns records with terraform using the cloudflare provider.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"5 min read\",\"minutes\":4.12,\"time\":247200,\"words\":824},\"slug\":\"2022/02/20/create-dns-records-with-terraform-on-cloudflare\",\"path\":\"blog/2022/02/20/create-dns-records-with-terraform-on-cloudflare\",\"filePath\":\"blog/2022/02/20/create-dns-records-with-terraform-on-cloudflare.mdx\",\"toc\":[{\"value\":\"Installing Terraform\",\"url\":\"#installing-terraform\",\"depth\":2},{\"value\":\"Cloudflare Authentication\",\"url\":\"#cloudflare-authentication\",\"depth\":2},{\"value\":\"Terraform Code\",\"url\":\"#terraform-code\",\"depth\":2},{\"value\":\"Creating the Record\",\"url\":\"#creating-the-record\",\"depth\":2},{\"value\":\"Test DNS\",\"url\":\"#test-dns\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Create DNS Records with Terraform on Cloudflare\",\"datePublished\":\"2022-02-20T18:11:06.000Z\",\"dateModified\":\"2022-02-20T18:11:06.000Z\",\"description\":\"This tutorial shows you how to create dns records with terraform using the cloudflare provider.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2022/02/20/create-dns-records-with-terraform-on-cloudflare\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}}
1,{\"title\":\"Bitcoin JSON RPC Usage Examples\",\"date\":\"2022-02-16T00:10:12.000Z\",\"tags\":[\"blockchain\",\"crypto\",\"bitcoin\",\"api\"],\"draft\":false,\"summary\":\"Bitcoin RPC: This tutorial will demonstrate how to interact with your bitcoin wallet node using the json rpc.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"16 min read\",\"minutes\":15.465,\"time\":927900,\"words\":3093},\"slug\":\"2022/02/15/bitcoin-rpc-usage-examples\",\"path\":\"blog/2022/02/15/bitcoin-rpc-usage-examples\",\"filePath\":\"blog/2022/02/15/bitcoin-rpc-usage-examples.mdx\",\"toc\":[{\"value\":\"Bitcoin CLI\",\"url\":\"#bitcoin-cli\",\"depth\":2},{\"value\":\"JSON RPC\",\"url\":\"#json-rpc\",\"depth\":2},{\"value\":\"Wallet Interaction\",\"url\":\"#wallet-interaction\",\"depth\":3},{\"value\":\"Addresses\",\"url\":\"#addresses\",\"depth\":3},{\"value\":\"Labelling Addresses\",\"url\":\"#labelling-addresses\",\"depth\":3},{\"value\":\"Receive tBTC\",\"url\":\"#receive-tbtc\",\"depth\":3},{\"value\":\"Block Explorer\",\"url\":\"#block-explorer\",\"depth\":3},{\"value\":\"Sending a raw transaction\",\"url\":\"#sending-a-raw-transaction\",\"depth\":3},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Bitcoin JSON RPC Usage Examples\",\"datePublished\":\"2022-02-16T00:10:12.000Z\",\"dateModified\":\"2022-02-16T00:10:12.000Z\",\"description\":\"Bitcoin RPC: This tutorial will demonstrate how to interact with your bitcoin wallet node using the json rpc.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2022/02/15/bitcoin-rpc-usage-examples\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Setup a Bitcoin Fullnode\",\"date\":\"2022-02-13T00:00:00.000Z\",\"tags\":[\"blockchain\",\"crypto\",\"bitcoin\"],\"draft\":false,\"summary\":\"Blockchain and Bitcoin: This tutorial will demonstrate how to setup a bitcoin fullnode to interact with the blockchain.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"5 min read\",\"minutes\":4.505,\"time\":270300,\"words\":901},\"slug\":\"2022/02/12/setup-a-bitcoin-fullnode\",\"path\":\"blog/2022/02/12/setup-a-bitcoin-fullnode\",\"filePath\":\"blog/2022/02/12/setup-a-bitcoin-fullnode.mdx\",\"toc\":[{\"value\":\"About\",\"url\":\"#about\",\"depth\":2},{\"value\":\"Installation\",\"url\":\"#installation\",\"depth\":2},{\"value\":\"Configuration\",\"url\":\"#configuration\",\"depth\":2},{\"value\":\"Initial Block Download\",\"url\":\"#initial-block-download\",\"depth\":2},{\"value\":\"Test\",\"url\":\"#test\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Setup a Bitcoin Fullnode\",\"datePublished\":\"2022-02-13T00:00:00.000Z\",\"dateModified\":\"2022-02-13T00:00:00.000Z\",\"description\":\"Blockchain and Bitcoin: This tutorial will demonstrate how to setup a bitcoin fullnode to interact with the blockchain.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2022/02/12/setup-a-bitcoin-fullnode\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Getting to know Blockchain Basics\",\"date\":\"2022-02-11T00:10:01.000Z\",\"tags\":[\"blockchain\",\"bitcoin\",\"crypto\"],\"draft\":false,\"summary\":\"Blockchain Basics: Getting to know the terminology of blockchain before we get our hands dirty.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"4 min read\",\"minutes\":3.915,\"time\":234900,\"words\":783},\"slug\":\"2022/02/10/blockchain-basics\",\"path\":\"blog/2022/02/10/blockchain-basics\",\"filePath\":\"blog/2022/02/10/blockchain-basics.mdx\",\"toc\":[{\"value\":\"Blockchain Basics\",\"url\":\"#blockchain-basics\",\"depth\":2},{\"value\":\"Block\",\"url\":\"#block\",\"depth\":2},{\"value\":\"Blockchain\",\"url\":\"#blockchain\",\"depth\":2},{\"value\":\"Mining\",\"url\":\"#mining\",\"depth\":2},{\"value\":\"Node\",\"url\":\"#node\",\"depth\":2},{\"value\":\"What is a Full Node\",\"url\":\"#what-is-a-full-node\",\"depth\":2},{\"value\":\"Archival Nodes\",\"url\":\"#archival-nodes\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Getting to know Blockchain Basics\",\"datePublished\":\"2022-02-11T00:10:01.000Z\",\"dateModified\":\"2022-02-11T00:10:01.000Z\",\"description\":\"Blockchain Basics: Getting to know the terminology of blockchain before we get our hands dirty.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2022/02/10/blockchain-basics\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Blockchain Basics\",\"date\":\"2021-12-05T13:12:10.000Z\",\"tags\":[\"blockchain\",\"bitcoin\"],\"draft\":false,\"summary\":\"This tutorial provides you the basics and fundamentals of blockchain.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"4 min read\",\"minutes\":3.915,\"time\":234900,\"words\":783},\"slug\":\"2021/12/05/blockchain-basics\",\"path\":\"blog/2021/12/05/blockchain-basics\",\"filePath\":\"blog/2021/12/05/blockchain-basics.mdx\",\"toc\":[{\"value\":\"Blockchain Basics\",\"url\":\"#blockchain-basics\",\"depth\":2},{\"value\":\"Block\",\"url\":\"#block\",\"depth\":2},{\"value\":\"Blockchain\",\"url\":\"#blockchain\",\"depth\":2},{\"value\":\"Mining\",\"url\":\"#mining\",\"depth\":2},{\"value\":\"Node\",\"url\":\"#node\",\"depth\":2},{\"value\":\"What is a Full Node\",\"url\":\"#what-is-a-full-node\",\"depth\":2},{\"value\":\"Archival Nodes\",\"url\":\"#archival-nodes\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Blockchain Basics\",\"datePublished\":\"2021-12-05T13:12:10.000Z\",\"dateModified\":\"2021-12-05T13:12:10.000Z\",\"description\":\"This tutorial provides you the basics and fundamentals of blockchain.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2021/12/05/blockchain-basics\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Run a GETH Ethereum Light Node\",\"date\":\"2021-12-05T09:14:11.000Z\",\"tags\":[\"ethereum\",\"blockchain\",\"geth\"],\"draft\":false,\"summary\":\"This tutorial shows you how to run a geth ethereum blockchain light node.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"9 min read\",\"minutes\":8.96,\"time\":537600,\"words\":1792},\"slug\":\"2021/12/05/run-a-geth-ethereum-light-node\",\"path\":\"blog/2021/12/05/run-a-geth-ethereum-light-node\",\"filePath\":\"blog/2021/12/05/run-a-geth-ethereum-light-node.mdx\",\"toc\":[{\"value\":\"Environment Setup\",\"url\":\"#environment-setup\",\"depth\":2},{\"value\":\"Download Geth\",\"url\":\"#download-geth\",\"depth\":2},{\"value\":\"Setup Geth\",\"url\":\"#setup-geth\",\"depth\":2},{\"value\":\"API\",\"url\":\"#api\",\"depth\":2},{\"value\":\"Hexadecimal and Wei\",\"url\":\"#hexadecimal-and-wei\",\"depth\":2},{\"value\":\"CLI - Accounts\",\"url\":\"#cli---accounts\",\"depth\":2},{\"value\":\"CLI - Attach\",\"url\":\"#cli---attach\",\"depth\":2}
1,{\"value\":\"CLI - SendTransaction\",\"url\":\"#cli---sendtransaction\",\"depth\":2},{\"value\":\"Web3\",\"url\":\"#web3\",\"depth\":2},{\"value\":\"Mining\",\"url\":\"#mining\",\"depth\":2},{\"value\":\"Delete Data\",\"url\":\"#delete-data\",\"depth\":2},{\"value\":\"Resources\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Run a GETH Ethereum Light Node\",\"datePublished\":\"2021-12-05T09:14:11.000Z\",\"dateModified\":\"2021-12-05T09:14:11.000Z\",\"description\":\"This tutorial shows you how to run a geth ethereum blockchain light node.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2021/12/05/run-a-geth-ethereum-light-node\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Run Docker Containers with Terraform\",\"date\":\"2021-11-23T16:06:03.000Z\",\"tags\":[\"terraform\",\"docker\",\"traefik\",\"devops\"],\"draft\":false,\"summary\":\"This tutorial shows you how to run docker containers using terraform.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"10 min read\",\"minutes\":9.005,\"time\":540300,\"words\":1801},\"slug\":\"2021/11/23/run-docker-containers-with-terraform\",\"path\":\"blog/2021/11/23/run-docker-containers-with-terraform\",\"filePath\":\"blog/2021/11/23/run-docker-containers-with-terraform.mdx\",\"toc\":[{\"value\":\"Pre-Requisites\",\"url\":\"#pre-requisites\",\"depth\":2},{\"value\":\"Project Structure\",\"url\":\"#project-structure\",\"depth\":2},{\"value\":\"Deployment\",\"url\":\"#deployment\",\"depth\":2},{\"value\":\"Access our Containers\",\"url\":\"#access-our-containers\",\"depth\":2},{\"value\":\"Cleanup\",\"url\":\"#cleanup\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Run Docker Containers with Terraform\",\"datePublished\":\"2021-11-23T16:06:03.000Z\",\"dateModified\":\"2021-11-23T16:06:03.000Z\",\"description\":\"This tutorial shows you how to run docker containers using terraform.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2021/11/23/run-docker-containers-with-terraform\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Setup Traefik Version 2 on Docker\",\"date\":\"2021-11-03T05:20:27.000Z\",\"tags\":[\"docker\",\"traefik\",\"letsencrypt\",\"devops\"],\"draft\":false,\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"5 min read\",\"minutes\":4.36,\"time\":261600,\"words\":872},\"slug\":\"2021/11/03/setup-traefik-version-2-on-docker\",\"path\":\"blog/2021/11/03/setup-traefik-version-2-on-docker\",\"filePath\":\"blog/2021/11/03/setup-traefik-version-2-on-docker.mdx\",\"toc\":[{\"value\":\"What is Traefik\",\"url\":\"#what-is-traefik\",\"depth\":2},{\"value\":\"Use Case\",\"url\":\"#use-case\",\"depth\":2},{\"value\":\"Our Environment\",\"url\":\"#our-environment\",\"depth\":2},{\"value\":\"Pre-Requisites\",\"url\":\"#pre-requisites\",\"depth\":2},{\"value\":\"Traefik on Docker\",\"url\":\"#traefik-on-docker\",\"depth\":2},{\"value\":\"Test the Application\",\"url\":\"#test-the-application\",\"depth\":2},{\"value\":\"Future Posts\",\"url\":\"#future-posts\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Setup Traefik Version 2 on Docker\",\"datePublished\":\"2021-11-03T05:20:27.000Z\",\"dateModified\":\"2021-11-03T05:20:27.000Z\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2021/11/03/setup-traefik-version-2-on-docker\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Install Nodejs on Linux using NVM\",\"date\":\"2021-10-11T23:07:43.000Z\",\"tags\":[\"nodejs\",\"nvm\",\"linux\",\"javascript\",\"sysadmin\"],\"draft\":false,\"summary\":\"Install Nodejs on Linux using NVM\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"2 min read\",\"minutes\":1.87,\"time\":112200,\"words\":374},\"slug\":\"2021/10/11/install-nodejs-on-linux-using-nvm\",\"path\":\"blog/2021/10/11/install-nodejs-on-linux-using-nvm\",\"filePath\":\"blog/2021/10/11/install-nodejs-on-linux-using-nvm.mdx\",\"toc\":[{\"value\":\"Install\",\"url\":\"#install\",\"depth\":2},{\"value\":\"Verify\",\"url\":\"#verify\",\"depth\":2},{\"value\":\"Installing a Node Version\",\"url\":\"#installing-a-node-version\",\"depth\":2},{\"value\":\"Verify Installation\",\"url\":\"#verify-installation\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Install Nodejs on Linux using NVM\",\"datePublished\":\"2021-10-11T23:07:43.000Z\",\"dateModified\":\"2021-10-11T23:07:43.000Z\",\"description\":\"Install Nodejs on Linux using NVM\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2021/10/11/install-nodejs-on-linux-using-nvm\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Setup TLS and Basic Authentication on Node Exporter for Prometheus\",\"date\":\"2021-10-10T20:50:17.000Z\",\"tags\":[\"monitoring\",\"prometheus\",\"node-exporter\"],\"draft\":false,\"summary\":\"Setup TLS and Basic Authentication on Node Exporter for Prometheus\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"3 min read\",\"minutes\":2.2,\"time\":132000,\"words\":440},\"slug\":\"2021/10/10/setup-basic-authentication-on-node-exporter-and-prometheus\",\"path\":\"blog/2021/10/10/setup-basic-authentication-on-node-exporter-and-prometheus\",\"filePath\":\"blog/2021/10/10/setup-basic-authentication-on-node-exporter-and-prometheus.mdx\",\"toc\":[{\"value\":\"Install Node Exporter\",\"url\":\"#install-node-exporter\",\"depth\":2},{\"value\":\"Configuration\",\"url\":\"#configuration\",\"depth\":2},{\"value\":\"Prometheus Config\",\"url\":\"#prometheus-config\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Setup TLS and Basic Authentication on Node Exporter for Prometheus\",\"datePublished\":\"2021-10-10T20:50:17.000Z\",\"dateModified\":\"2021-10-10T20:50:17.000Z\",\"description\":\"Setup TLS and Basic Authentication on Node Exporter for Prometheus\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2021/10/10/setup-basic-authentication-on-node-exporter-and-prometheus\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Install Concourse CI v7.4 on Ubuntu Linux\",\"date\":\"2021-10-07T23:27:05.000Z\",\"tags\":[\"devops\",\"concourse\",\"cicd\",\"linux\"],\"draft\":false,\"summary\":\"Install Concourse CI v7.4 on Ubuntu Linux\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"7 min read\",\"minutes\":6.135,\"time\":368100,\"words\":1227},\"slug\":\"2021/10/07/install-concourse-ci-v7-dot-4-on-ubuntu-linux\",\"path\":\"blog/2021/10/07/install-concourse-ci-v7-dot-4-on-ubuntu-linux\",\"filePath\":\"blog/2021/10/07/install-concourse-ci-v7-dot-4-on-ubuntu-linux.mdx\",\"toc\":[{\"value\":\"Resources:\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Older Version\",\"url\":\"#older-version\",\"depth\":2},{\"value\":\"What is Concourse CI:\",\"url\":\"#what-is-concourse-ci\",\"depth\":2},{\"value\":\"What will we be doing today\",\"url\":\"#what-will-we-be-doing-today\",\"depth\":2},{\"value\":\"Setup the Server:\",\"url\":\"#setup-the-server\",\"depth\":2},{\"value\":\"Client Side:\",\"url\":\"#client-side\",\"depth\":2},{\"value\":\"Hello World Pipeline:\",\"url\":\"#hello-world-pipeline\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Install Concourse CI v7.4 on Ubuntu Linux\",\"datePublished\":\"2021-10-07T23:27:05.000Z\",\"dateModified\":\"2021-10-07T23:27:05.000Z\",\"description\":\"Install Concourse CI v7.4 on Ubuntu Linux\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2021/10/07/install-concourse-ci-v7-dot-4-on-ubuntu-linux\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"A Tour with Vagrant and Virtualbox on Mac\",\"date\":\"2021-08-14T17:41:32.000Z\",\"tags\":[\"vagrant\",\"virtualbox\",\"macosx\",\"docker\",\"ansible\"],\"draft\":false,\"summary\":\"A Tour with Vagrant and Virtualbox on Mac\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"10 min read\",\"minutes\":9.16,\"time\":549600,\"words\":1832},\"slug\":\"2021/08/14/a-tour-with-vagrant-and-virtualbox-on-mac\",\"path\":\"blog/2021/08/14/a-tour-with-vagrant-and-virtualbox-on-mac\",\"filePath\":\"blog/2021/08/14/a-tour-with-vagrant-and-virtualbox-on-mac.mdx\",\"toc\":[{\"value\":\"What are we doing today?\",\"url\":\"#what-are-we-doing-today\",\"depth\":2},{\"value\":\"Pre-Requisites\",\"url\":\"#pre-requisites\",\"depth\":2},{\"value\":\"Virtualbox\",\"url\":\"#virtualbox\",\"depth\":2},{\"value\":\"Vagrant\",\"url\":\"#vagrant\",\"depth\":2},{\"value\":\"Create your first Vagrant Box\",\"url\":\"#create-your-first-vagrant-box\",\"depth\":2}
1,{\"value\":\"Installing Software with Vagrant\",\"url\":\"#installing-software-with-vagrant\",\"depth\":2},{\"value\":\"Shared Folders\",\"url\":\"#shared-folders\",\"depth\":2},{\"value\":\"Setting Hostname and Configure Memory\",\"url\":\"#setting-hostname-and-configure-memory\",\"depth\":2},{\"value\":\"Provisioners: Shell\",\"url\":\"#provisioners-shell\",\"depth\":2},{\"value\":\"Provisioners: Docker\",\"url\":\"#provisioners-docker\",\"depth\":2},{\"value\":\"Provisioners: Ansible\",\"url\":\"#provisioners-ansible\",\"depth\":2},{\"value\":\"Tear Down\",\"url\":\"#tear-down\",\"depth\":2},{\"value\":\"Resources\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"A Tour with Vagrant and Virtualbox on Mac\",\"datePublished\":\"2021-08-14T17:41:32.000Z\",\"dateModified\":\"2021-08-14T17:41:32.000Z\",\"description\":\"A Tour with Vagrant and Virtualbox on Mac\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2021/08/14/a-tour-with-vagrant-and-virtualbox-on-mac\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"How to specify wallet name in Bitcoin Core walletnotify\",\"date\":\"2021-08-04T13:41:51.000Z\",\"tags\":[\"bitcoin\",\"blockchain\",\"cryptocurrency\"],\"draft\":false,\"summary\":\"How to specify wallet name in Bitcoin Core walletnotify\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"3 min read\",\"minutes\":2.145,\"time\":128700,\"words\":429},\"slug\":\"2021/08/04/how-to-specify-wallet-name-in-bitcoin-core-walletnotify\",\"path\":\"blog/2021/08/04/how-to-specify-wallet-name-in-bitcoin-core-walletnotify\",\"filePath\":\"blog/2021/08/04/how-to-specify-wallet-name-in-bitcoin-core-walletnotify.mdx\",\"toc\":[{\"value\":\"Bitcoind WalletNotify TransactionID Example\",\"url\":\"#bitcoind-walletnotify-transactionid-example\",\"depth\":2},{\"value\":\"Capturing the wallet name in walletnotify\",\"url\":\"#capturing-the-wallet-name-in-walletnotify\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"How to specify wallet name in Bitcoin Core walletnotify\",\"datePublished\":\"2021-08-04T13:41:51.000Z\",\"dateModified\":\"2021-08-04T13:41:51.000Z\",\"description\":\"How to specify wallet name in Bitcoin Core walletnotify\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2021/08/04/how-to-specify-wallet-name-in-bitcoin-core-walletnotify\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"AWS EC2 Linux - warning: setlocale: LC_CTYPE: cannot change locale UTF-8\",\"date\":\"2021-08-02T06:40:53.000Z\",\"tags\":[\"ec2\",\"aws\",\"linux\"],\"draft\":false,\"summary\":\"This tutorial will demonstrate how to fix the warning on AWS EC2 Linux instances - warning: setlocale: LC_CTYPE: cannot change locale UTF-8\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"1 min read\",\"minutes\":0.535,\"time\":32100,\"words\":107},\"slug\":\"2021/08/02/aws-ec2-linux-warning-setlocale-lc-ctype-cannot-change-locale-utf-8\",\"path\":\"blog/2021/08/02/aws-ec2-linux-warning-setlocale-lc-ctype-cannot-change-locale-utf-8\",\"filePath\":\"blog/2021/08/02/aws-ec2-linux-warning-setlocale-lc-ctype-cannot-change-locale-utf-8.mdx\",\"toc\":[{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"AWS EC2 Linux - warning: setlocale: LC_CTYPE: cannot change locale UTF-8\",\"datePublished\":\"2021-08-02T06:40:53.000Z\",\"dateModified\":\"2021-08-02T06:40:53.000Z\",\"description\":\"This tutorial will demonstrate how to fix the warning on AWS EC2 Linux instances - warning: setlocale: LC_CTYPE: cannot change locale UTF-8\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2021/08/02/aws-ec2-linux-warning-setlocale-lc-ctype-cannot-change-locale-utf-8\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Task runner with YAML config written in Go\",\"date\":\"2021-08-01T10:11:54.000Z\",\"tags\":[\"task\",\"taskfile\",\"golang\"],\"draft\":false,\"summary\":\"This tutorial we will explore similar to Makefile but its called Task runner wich is written in Go.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"4 min read\",\"minutes\":3.895,\"time\":233700,\"words\":779},\"slug\":\"2021/08/01/task-runner-with-yaml-config-written-in-go\",\"path\":\"blog/2021/08/01/task-runner-with-yaml-config-written-in-go\",\"filePath\":\"blog/2021/08/01/task-runner-with-yaml-config-written-in-go.mdx\",\"toc\":[{\"value\":\"What to expect\",\"url\":\"#what-to-expect\",\"depth\":2},{\"value\":\"Install\",\"url\":\"#install\",\"depth\":2},{\"value\":\"Usage\",\"url\":\"#usage\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Task runner with YAML config written in Go\",\"datePublished\":\"2021-08-01T10:11:54.000Z\",\"dateModified\":\"2021-08-01T10:11:54.000Z\",\"description\":\"This tutorial we will explore similar to Makefile but its called Task runner wich is written in Go.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2021/08/01/task-runner-with-yaml-config-written-in-go\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Basic Logging with Python\",\"date\":\"2021-07-31T08:17:24.000Z\",\"tags\":[\"python\",\"logging\",\"programming\"],\"draft\":false,\"summary\":\"This short tutorial, we will be exploring how to setup basic Logging with Python.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"1 min read\",\"minutes\":0.945,\"time\":56700,\"words\":189},\"slug\":\"2021/07/31/basic-logging-with-python\",\"path\":\"blog/2021/07/31/basic-logging-with-python\",\"filePath\":\"blog/2021/07/31/basic-logging-with-python.mdx\",\"toc\":[{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Basic Logging with Python\",\"datePublished\":\"2021-07-31T08:17:24.000Z\",\"dateModified\":\"2021-07-31T08:17:24.000Z\",\"description\":\"This short tutorial, we will be exploring how to setup basic Logging with Python.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2021/07/31/basic-logging-with-python\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Difference with ECS Task and Execution IAM Roles on AWS\",\"date\":\"2021-07-31T07:37:34.000Z\",\"tags\":[\"aws\",\"iam\",\"security\"],\"draft\":false,\"summary\":\"This post will explain the difference with AWS ECS Task and Execution IAM Roles on AWS.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"3 min read\",\"minutes\":2.38,\"time\":142800,\"words\":476},\"slug\":\"2021/07/31/difference-with-ecs-task-and-execution-iam-roles-on-aws\",\"path\":\"blog/2021/07/31/difference-with-ecs-task-and-execution-iam-roles-on-aws\",\"filePath\":\"blog/2021/07/31/difference-with-ecs-task-and-execution-iam-roles-on-aws.mdx\",\"toc\":[{\"value\":\"ECS Task Execution Role\",\"url\":\"#ecs-task-execution-role\",\"depth\":2},{\"value\":\"ECS Task Role\",\"url\":\"#ecs-task-role\",\"depth\":2},{\"value\":\"Application Code\",\"url\":\"#application-code\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Difference with ECS Task and Execution IAM Roles on AWS\",\"datePublished\":\"2021-07-31T07:37:34.000Z\",\"dateModified\":\"2021-07-31T07:37:34.000Z\",\"description\":\"This post will explain the difference with AWS ECS Task and Execution IAM Roles on AWS.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2021/07/31/difference-with-ecs-task-and-execution-iam-roles-on-aws\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Install Java 11 and Maven on Ubuntu Linux\",\"date\":\"2021-07-12T06:36:32.000Z\",\"tags\":[\"linux\",\"java\",\"maven\"],\"draft\":false,\"summary\":\"Install Java 11 and Maven on Ubuntu Linux\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"2 min read\",\"minutes\":1.335,\"time\":80100,\"words\":267},\"slug\":\"2021/07/12/install-java-11-and-maven-on-ubuntu-linux\",\"path\":\"blog/2021/07/12/install-java-11-and-maven-on-ubuntu-linux\",\"filePath\":\"blog/2021/07/12/install-java-11-and-maven-on-ubuntu-linux.mdx\",\"toc\":[{\"value\":\"Install\",\"url\":\"#install\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Install Java 11 and Maven on Ubuntu Linux\",\"datePublished\":\"2021-07-12T06:36:32.000Z\",\"dateModified\":\"2021-07-12T06:36:32.000Z\",\"description\":\"Install Java 11 and Maven on Ubuntu Linux\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2021/07/12/install-java-11-and-maven-on-ubuntu-linux\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Setup a Crypto Digibyte Full Node on Linux\",\"date\":\"2021-05-03T21:14:49.000Z\",\"tags\":[\"digibyte\",\"crypto\",\"cryptocurrency\",\"blockchain\"],\"draft\":false,\"summary\":\"setup a cryptocurrency full node for digibyte on a linux server\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"5 min read\",\"minutes\":4.335,\"time\":260100,\"words\":867},\"slug\":\"2021/05/03/setup-a-crypto-digibyte-full-node-on-linux\",\"path\":\"blog/2021/05/03/setup-a-crypto-digibyte-full-node-on-linux\",\"filePath\":\"blog/2021/05/03/setup-a-crypto-digibyte-full-node-on-linux.mdx\",\"toc\":[{\"value\":\"What is a Full Node\",\"url\":\"#what-is-a-full-node\",\"depth\":2},{\"value\":\"Hardware Requirements\",\"url\":\"#hardware-requirements\",\"depth\":2},{\"value\":\"Setup the Pre-Requisites\",\"url\":\"#setup-the-pre-requisites\",\"depth\":2},{\"value\":\"Download the Software\",\"url\":\"#download-the-software\",\"depth\":2},{\"value\":\"SystemD\",\"url\":\"#systemd\",\"depth\":2},{\"value\":\"Interact with the Node\",\"url\":\"#interact-with-the-node\",\"depth\":2},{\"value\":\"Making a Transaction to my Wallet\",\"url\":\"#making-a-transaction-to-my-wallet\",\"depth\":2},{\"value\":\"Resources\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Setup a Crypto Digibyte Full Node on Linux\",\"datePublished\":\"2021-05-03T21:14:49.000Z\",\"dateModified\":\"2021-05-03T21:14:49.000Z\",\"description\":\"setup a cryptocurrency full node for digibyte on a linux server\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2021/05/03/setup-a-crypto-digibyte-full-node-on-linux\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Install Concourse CI v6 on Ubuntu 20.04\",\"date\":\"2021-04-06T21:56:38.000Z\",\"tags\":[\"devops\",\"concourse\",\"cicd\",\"linux\"],\"draft\":false,\"summary\":\"Install Concourse version 6.7.6 CI Server on Ubuntu 20.04\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"6 min read\",\"minutes\":5.725,\"time\":343500,\"words\":1145},\"slug\":\"2021/04/06/install-concourse-ci-v6-on-ubuntu-20-dot-04\",\"path\":\"blog/2021/04/06/install-concourse-ci-v6-on-ubuntu-20-dot-04\",\"filePath\":\"blog/2021/04/06/install-concourse-ci-v6-on-ubuntu-20-dot-04.mdx\",\"toc\":[{\"value\":\"Resources:\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Older Version\",\"url\":\"#older-version\",\"depth\":2},{\"value\":\"What is Concourse CI:\",\"url\":\"#what-is-concourse-ci\",\"depth\":2},{\"value\":\"What will we be doing today\",\"url\":\"#what-will-we-be-doing-today\",\"depth\":2},{\"value\":\"Setup the Server:\",\"url\":\"#setup-the-server\",\"depth\":2},{\"value\":\"Client Side:\",\"url\":\"#client-side\",\"depth\":2},{\"value\":\"Hello World Pipeline:\",\"url\":\"#hello-world-pipeline\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Install Concourse CI v6 on Ubuntu 20.04\",\"datePublished\":\"2021-04-06T21:56:38.000Z\",\"dateModified\":\"2021-04-06T21:56:38.000Z\",\"description\":\"Install Concourse version 6.7.6 CI Server on Ubuntu 20.04\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2021/04/06/install-concourse-ci-v6-on-ubuntu-20-dot-04\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Wireguard VPN with Unbound ADS Blocking DNS\",\"date\":\"2021-03-10T05:59:51.000Z\",\"tags\":[\"linux\",\"vpn\",\"wireguard\"],\"draft\":false,\"summary\":\"Wireguard VPN with Unbound ADS Blocking DNS\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"5 min read\",\"minutes\":4.24,\"time\":254400,\"words\":848},\"slug\":\"2021/03/10/wireguard-vpn-with-unbound-ads-blocking-dns\",\"path\":\"blog/2021/03/10/wireguard-vpn-with-unbound-ads-blocking-dns\",\"filePath\":\"blog/2021/03/10/wireguard-vpn-with-unbound-ads-blocking-dns.mdx\",\"toc\":[{\"value\":\"Install Packages\",\"url\":\"#install-packages\",\"depth\":2},{\"value\":\"Environment Variables\",\"url\":\"#environment-variables\",\"depth\":2}
1,{\"value\":\"Unbound Installation\",\"url\":\"#unbound-installation\",\"depth\":2},{\"value\":\"Wireguard Installation\",\"url\":\"#wireguard-installation\",\"depth\":2},{\"value\":\"Connect your Client\",\"url\":\"#connect-your-client\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Wireguard VPN with Unbound ADS Blocking DNS\",\"datePublished\":\"2021-03-10T05:59:51.000Z\",\"dateModified\":\"2021-03-10T05:59:51.000Z\",\"description\":\"Wireguard VPN with Unbound ADS Blocking DNS\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2021/03/10/wireguard-vpn-with-unbound-ads-blocking-dns\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"SSH using AWS SSM Session Manager\",\"date\":\"2021-03-10T05:52:54.000Z\",\"tags\":[\"aws\",\"ssh\",\"devops\",\"ssm\"],\"draft\":false,\"summary\":\"SSH using AWS SSM Session Manager\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"2 min read\",\"minutes\":1.7,\"time\":102000,\"words\":340},\"slug\":\"2021/03/10/ssh-using-aws-ssm-session-manager\",\"path\":\"blog/2021/03/10/ssh-using-aws-ssm-session-manager\",\"filePath\":\"blog/2021/03/10/ssh-using-aws-ssm-session-manager.mdx\",\"toc\":[{\"value\":\"AWS EC2 Console\",\"url\":\"#aws-ec2-console\",\"depth\":2},{\"value\":\"AWS CLI\",\"url\":\"#aws-cli\",\"depth\":2},{\"value\":\"Bash Functions FTW\",\"url\":\"#bash-functions-ftw\",\"depth\":2},{\"value\":\"Related:\",\"url\":\"#related\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"SSH using AWS SSM Session Manager\",\"datePublished\":\"2021-03-10T05:52:54.000Z\",\"dateModified\":\"2021-03-10T05:52:54.000Z\",\"description\":\"SSH using AWS SSM Session Manager\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2021/03/10/ssh-using-aws-ssm-session-manager\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Bypass the Medium Paywall System\",\"date\":\"2021-03-10T05:45:54.000Z\",\"tags\":[\"tips\",\"medium\"],\"draft\":false,\"summary\":\"Bypass the Medium Paywall System\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"1 min read\",\"minutes\":0.445,\"time\":26700,\"words\":89},\"slug\":\"2021/03/10/bypass-the-medium-paywall-system\",\"path\":\"blog/2021/03/10/bypass-the-medium-paywall-system\",\"filePath\":\"blog/2021/03/10/bypass-the-medium-paywall-system.mdx\",\"toc\":[{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Bypass the Medium Paywall System\",\"datePublished\":\"2021-03-10T05:45:54.000Z\",\"dateModified\":\"2021-03-10T05:45:54.000Z\",\"description\":\"Bypass the Medium Paywall System\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2021/03/10/bypass-the-medium-paywall-system\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Generate Grafana Loki Log Links from Metric Label Values\",\"date\":\"2021-03-10T05:34:04.000Z\",\"tags\":[\"grafana\",\"loki\",\"devops\",\"logging\"],\"draft\":false,\"summary\":\"In this grafana tutorial, we will generate grafana loki log links from metric label values in order to simplify your exploring process.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"2 min read\",\"minutes\":1.37,\"time\":82200,\"words\":274},\"slug\":\"2021/03/10/generate-grafana-loki-log-links-from-metric-label-values\",\"path\":\"blog/2021/03/10/generate-grafana-loki-log-links-from-metric-label-values\",\"filePath\":\"blog/2021/03/10/generate-grafana-loki-log-links-from-metric-label-values.mdx\",\"toc\":[{\"value\":\"Context\",\"url\":\"#context\",\"depth\":2},{\"value\":\"Dashboard Variables\",\"url\":\"#dashboard-variables\",\"depth\":2},{\"value\":\"Grafana Dashboard\",\"url\":\"#grafana-dashboard\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Generate Grafana Loki Log Links from Metric Label Values\",\"datePublished\":\"2021-03-10T05:34:04.000Z\",\"dateModified\":\"2021-03-10T05:34:04.000Z\",\"description\":\"In this grafana tutorial, we will generate grafana loki log links from metric label values in order to simplify your exploring process.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2021/03/10/generate-grafana-loki-log-links-from-metric-label-values\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Visualize Weather Data with Grafana and the DHT22 Sensor\",\"date\":\"2021-03-10T05:06:31.000Z\",\"tags\":[\"raspberrypi\",\"iot\",\"grafana\",\"python\"],\"draft\":false,\"summary\":\"Visualize Weather Data with Grafana and the DHT22 Sensor\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"5 min read\",\"minutes\":4.8,\"time\":288000,\"words\":960}
1,\"slug\":\"2021/03/10/visualize-weather-data-with-grafana-and-the-dht22-sensor\",\"path\":\"blog/2021/03/10/visualize-weather-data-with-grafana-and-the-dht22-sensor\",\"filePath\":\"blog/2021/03/10/visualize-weather-data-with-grafana-and-the-dht22-sensor.mdx\",\"toc\":[{\"value\":\"The Endgoal\",\"url\":\"#the-endgoal\",\"depth\":2},{\"value\":\"The Hardware\",\"url\":\"#the-hardware\",\"depth\":2},{\"value\":\"Connecting the Sensor\",\"url\":\"#connecting-the-sensor\",\"depth\":2},{\"value\":\"Installing Software\",\"url\":\"#installing-software\",\"depth\":2},{\"value\":\"Interact with the Sensor\",\"url\":\"#interact-with-the-sensor\",\"depth\":2},{\"value\":\"Visualize with Grafana\",\"url\":\"#visualize-with-grafana\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Visualize Weather Data with Grafana and the DHT22 Sensor\",\"datePublished\":\"2021-03-10T05:06:31.000Z\",\"dateModified\":\"2021-03-10T05:06:31.000Z\",\"description\":\"Visualize Weather Data with Grafana and the DHT22 Sensor\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2021/03/10/visualize-weather-data-with-grafana-and-the-dht22-sensor\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"CICD with DroneCI and Gitea using Docker Compose\",\"date\":\"2021-03-09T06:10:10.000Z\",\"tags\":[\"devops\",\"gitea\",\"drone\",\"docker\"],\"draft\":false,\"summary\":\"CICD with DroneCI and Gitea using Docker Compose\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"3 min read\",\"minutes\":2.955,\"time\":177300,\"words\":591},\"slug\":\"2021/03/09/cicd-with-droneci-and-gitea-using-docker-compose\",\"path\":\"blog/2021/03/09/cicd-with-droneci-and-gitea-using-docker-compose\",\"filePath\":\"blog/2021/03/09/cicd-with-droneci-and-gitea-using-docker-compose.mdx\",\"toc\":[{\"value\":\"The Source Code\",\"url\":\"#the-source-code\",\"depth\":2},{\"value\":\"Deploy the Stack\",\"url\":\"#deploy-the-stack\",\"depth\":2},{\"value\":\"Drone CLI\",\"url\":\"#drone-cli\",\"depth\":2},{\"value\":\"Build your first pipeline\",\"url\":\"#build-your-first-pipeline\",\"depth\":2},{\"value\":\"More Examples\",\"url\":\"#more-examples\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"CICD with DroneCI and Gitea using Docker Compose\",\"datePublished\":\"2021-03-09T06:10:10.000Z\",\"dateModified\":\"2021-03-09T06:10:10.000Z\",\"description\":\"CICD with DroneCI and Gitea using Docker Compose\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2021/03/09/cicd-with-droneci-and-gitea-using-docker-compose\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Ship your Docker Logs to Loki using Fluentbit\",\"date\":\"2021-02-26T20:26:34.000Z\",\"tags\":[\"logging\",\"docker\",\"loki\",\"fluentbit\"],\"draft\":false,\"summary\":\"Ship your Docker Logs to Loki using Fluentbit\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"3 min read\",\"minutes\":2.645,\"time\":158700,\"words\":529},\"slug\":\"2021/02/26/ship-your-docker-logs-to-loki-using-fluentbit\",\"path\":\"blog/2021/02/26/ship-your-docker-logs-to-loki-using-fluentbit\",\"filePath\":\"blog/2021/02/26/ship-your-docker-logs-to-loki-using-fluentbit.mdx\",\"toc\":[{\"value\":\"Grafana and Loki\",\"url\":\"#grafana-and-loki\",\"depth\":2},{\"value\":\"Fluent Bit\",\"url\":\"#fluent-bit\",\"depth\":2},{\"value\":\"Nginx App\",\"url\":\"#nginx-app\",\"depth\":2},{\"value\":\"Github Repo\",\"url\":\"#github-repo\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Ship your Docker Logs to Loki using Fluentbit\",\"datePublished\":\"2021-02-26T20:26:34.000Z\",\"dateModified\":\"2021-02-26T20:26:34.000Z\",\"description\":\"Ship your Docker Logs to Loki using Fluentbit\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2021/02/26/ship-your-docker-logs-to-loki-using-fluentbit\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Installing Arduino and Setup the NodeMCU ESP32\",\"date\":\"2021-01-31T16:33:31.000Z\",\"tags\":[\"arduino\",\"nodemcu\",\"esp32\"],\"draft\":false,\"summary\":\"Installing Arduino and Setup the NodeMCU ESP32\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"3 min read\",\"minutes\":2.015,\"time\":120900,\"words\":403},\"slug\":\"2021/01/31/installing-arduino-and-setup-the-nodemcu-esp32\",\"path\":\"blog/2021/01/31/installing-arduino-and-setup-the-nodemcu-esp32\",\"filePath\":\"blog/2021/01/31/installing-arduino-and-setup-the-nodemcu-esp32.mdx\",\"toc\":[{\"value\":\"About this Tutorial\",\"url\":\"#about-this-tutorial\",\"depth\":2},{\"value\":\"Installing Arduino\",\"url\":\"#installing-arduino\",\"depth\":2},{\"value\":\"Hello World Application\",\"url\":\"#hello-world-application\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Installing Arduino and Setup the NodeMCU ESP32\",\"datePublished\":\"2021-01-31T16:33:31.000Z\",\"dateModified\":\"2021-01-31T16:33:31.000Z\",\"description\":\"Installing Arduino and Setup the NodeMCU ESP32\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2021/01/31/installing-arduino-and-setup-the-nodemcu-esp32\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Reduce Docker Log Size on Disk\",\"date\":\"2020-12-23T09:11:35.000Z\",\"tags\":[\"docker\",\"storage\",\"sysadmin\"],\"draft\":false,\"summary\":\"This docker troubleshooting tutorial will show you how to free up disk space that was consumed by docker logs.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"1 min read\",\"minutes\":0.88,\"time\":52800,\"words\":176},\"slug\":\"2020/12/23/reduce-docker-log-size-on-disk\",\"path\":\"blog/2020/12/23/reduce-docker-log-size-on-disk\",\"filePath\":\"blog/2020/12/23/reduce-docker-log-size-on-disk.mdx\",\"toc\":[{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Reduce Docker Log Size on Disk\",\"datePublished\":\"2020-12-23T09:11:35.000Z\",\"dateModified\":\"2020-12-23T09:11:35.000Z\",\"description\":\"This docker troubleshooting tutorial will show you how to free up disk space that was consumed by docker logs.\",\"
1image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2020/12/23/reduce-docker-log-size-on-disk\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"HTTPS for Local Development with MiniCA\",\"date\":\"2020-12-23T08:11:08.000Z\",\"tags\":[\"ssl\",\"certificates\",\"docker\",\"minica\",\"https\"],\"draft\":false,\"summary\":\"HTTPS for Local Development with MiniCA\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"3 min read\",\"minutes\":2.345,\"time\":140700,\"words\":469},\"slug\":\"2020/12/23/https-for-local-development-with-minica\",\"path\":\"blog/2020/12/23/https-for-local-development-with-minica\",\"filePath\":\"blog/2020/12/23/https-for-local-development-with-minica.mdx\",\"toc\":[{\"value\":\"Generate Certificates\",\"url\":\"#generate-certificates\",\"depth\":2},{\"value\":\"Application Stack\",\"url\":\"#application-stack\",\"depth\":2},{\"value\":\"Import Certificates\",\"url\":\"#import-certificates\",\"depth\":2},{\"value\":\"Boot the Application Stack\",\"url\":\"#boot-the-application-stack\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"HTTPS for Local Development with MiniCA\",\"datePublished\":\"2020-12-23T08:11:08.000Z\",\"dateModified\":\"2020-12-23T08:11:08.000Z\",\"description\":\"HTTPS for Local Development with MiniCA\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2020/12/23/https-for-local-development-with-minica\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Harden your SSH Security on Linux Servers\",\"date\":\"2020-12-18T13:32:18.000Z\",\"tags\":[\"security\",\"ssh\",\"linux\"],\"draft\":false,\"summary\":\"Harden your SSH Security on Linux Servers\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"4 min read\",\"minutes\":3.45,\"time\":207000,\"words\":690},\"slug\":\"2020/12/18/harden-your-ssh-security-on-linux-servers\",\"path\":\"blog/2020/12/18/harden-your-ssh-security-on-linux-servers\",\"filePath\":\"blog/2020/12/18/harden-your-ssh-security-on-linux-servers.mdx\",\"toc\":[{\"value\":\"Packages\",\"url\":\"#packages\",\"depth\":2},{\"value\":\"Dedicated User\",\"url\":\"#dedicated-user\",\"depth\":2},{\"value\":\"SSH Authorized Keys\",\"url\":\"#ssh-authorized-keys\",\"depth\":2},{\"value\":\"SSH Config\",\"url\":\"#ssh-config\",\"depth\":2},{\"value\":\"Iptables\",\"url\":\"#iptables\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Harden your SSH Security on Linux Servers\",\"datePublished\":\"2020-12-18T13:32:18.000Z\",\"dateModified\":\"2020-12-18T13:32:18.000Z\",\"description\":\"Harden your SSH Security on Linux Servers\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2020/12/18/harden-your-ssh-security-on-linux-servers\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Encrypt and Decrypt files with ccrypt\",\"date\":\"2020-11-20T06:27:01.000Z\",\"tags\":[\"encryption\",\"security\",\"ccrypt\"],\"draft\":false,\"summary\":\"Encrypt and Decrypt files with ccrypt\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"2 min read\",\"minutes\":1.215,\"time\":72900,\"words\":243},\"slug\":\"2020/11/20/encrypt-and-decrypt-files-with-ccrypt\",\"path\":\"blog/2020/11/20/encrypt-and-decrypt-files-with-ccrypt\",\"filePath\":\"blog/2020/11/20/encrypt-and-decrypt-files-with-ccrypt.mdx\",\"toc\":[{\"value\":\"About\",\"url\":\"#about\",\"depth\":2},{\"value\":\"Install\",\"url\":\"#install\",\"depth\":2},{\"value\":\"Usage\",\"url\":\"#usage\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Encrypt and Decrypt files with ccrypt\",\"datePublished\":\"2020-11-20T06:27:01.000Z\",\"dateModified\":\"2020-11-20T06:27:01.000Z\",\"description\":\"Encrypt and Decrypt files with ccrypt\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2020/11/20/encrypt-and-decrypt-files-with-ccrypt\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Deploy Loki on Multipass\",\"date\":\"2020-11-11T14:19:05.000Z\",\"tags\":[\"loki\",\"multipass\",\"docker\",\"grafana\"],\"draft\":false,\"summary\":\"Deploy the Grafana Loki Stack on Multipass\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"8 min read\",\"minutes\":7.785,\"time\":467100,\"words\":1557},\"slug\":\"2020/11/11/deploy-loki-on-multipass\",\"path\":\"blog/2020/11/11/deploy-loki-on-multipass\",\"filePath\":\"blog/2020/11/11/deploy-loki-on-multipass.mdx\",\"toc\":[{\"value\":\"About\",\"url\":\"#about\",\"depth\":2},{\"value\":\"Install Multipass\",\"url\":\"#install-multipass\",\"depth\":2},{\"value\":\"Cloud Init for Loki\",\"url\":\"#cloud-init-for-loki\",\"depth\":2},{\"value\":\"Deploy Loki on Multipass\",\"url\":\"#deploy-loki-on-multipass\",\"depth\":2},{\"value\":\"Test Loki inside the VM\",\"url\":\"#test-loki-inside-the-vm\",\"depth\":2},{\"value\":\"Testing Loki Outside our VM\",\"url\":\"#testing-loki-outside-our-vm\",\"depth\":2},{\"value\":\"Write Logs to Loki using the Loki Docker Driver\",\"url\":\"#write-logs-to-loki-using-the-loki-docker-driver\",\"depth\":2},{\"value\":\"Teardown\",\"url\":\"#teardown\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Deploy Loki on Multipass\",\"datePublished\":\"2020-11-11T14:19:05.000Z\",\"dateModified\":\"2020-11-11T14:19:05.000Z\",\"description\":\"Deploy the Grafana Loki Stack on Multipass\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2020/11/11/deploy-loki-on-multipass\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"How to Setup Alerting with Loki\",\"date\":\"2020-11-06T15:13:53.000Z\",\"tags\":[\"loki\",\"alertmanager\",\"docker\",\"grafana\",\"alerting\"],\"draft\":false,\"summary\":\"How to Setup Alerting with Loki\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"6 min read\",\"minutes\":5.485,\"time\":329100,\"words\":1097},\"slug\":\"2020/11/06/how-to-setup-alerting-with-loki\",\"path\":\"blog/2020/11/06/how-to-setup-alerting-with-loki\",\"filePath\":\"blog/2020/11/06/how-to-setup-alerting-with-loki.mdx\",\"toc\":[{\"value\":\"What will we be doing today\",\"url\":\"#what-will-we-be-doing-today\",\"depth\":2},{\"value\":\"Components\",\"url\":\"#components\",\"depth\":2},{\"value\":\"Demo\",\"url\":\"#demo\",\"depth\":2},{\"value\":\"Get the source\",\"url\":\"#get-the-source\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"How to Setup Alerting with Loki\",\"datePublished\":\"2020-11-06T15:13:53.000Z\",\"dateModified\":\"2020-11-06T15:13:53.000Z\",\"description\":\"How to Setup Alerting with Loki\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2020/11/06/how-to-setup-alerting-with-loki\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Sending Slack Messages with Python\",\"date\":\"2020-11-06T13:58:50.000Z\",\"tags\":[\"slack\",\"python\"],\"draft\":false,\"summary\":\"Sending Slack Messages with Python\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"3 min read\",\"minutes\":2.02,\"time\":121200,\"words\":404},\"slug\":\"2020/11/06/sending-slack-messages-with-python\",\"path\":\"blog/2020/11/06/sending-slack-messages-with-python\",\"filePath\":\"blog/2020/11/06/sending-slack-messages-with-python.mdx\",\"toc\":[{\"value\":\"Create a Webhook\",\"url\":\"#create-a-webhook\",\"depth\":2},{\"value\":\"Creating the Script\",\"url\":\"#creating-the-script\",\"depth\":2},{\"value\":\"Testing it out\",\"url\":\"#testing-it-out\",\"depth\":2},{\"value\":\"Thanks\",\"url\":\"#thanks\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Sending Slack Messages with Python\",\"datePublished\":\"2020-11-06T13:58:50.000Z\",\"dateModified\":\"2020-11-06T13:58:50.000Z\",\"description\":\"Sending Slack Messages with Python\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2020/11/06/sending-slack-messages-with-python\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Running SSH Commands on AWS EC2 Instances with Python\",\"date\":\"2020-11-02T09:55:43.000Z\",\"tags\":[\"python\",\"aws\",\"ec2\",\"ssh\"],\"draft\":false,\"summary\":\"Running SSH Commands on AWS EC2 Instances with Python\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"3 min read\",\"minutes\":2.34,\"time\":140400,\"words\":468},\"slug\":\"2020/11/02/running-ssh-commands-on-aws-ec2-instances-with-python\",\"path\":\"blog/2020/11/02/running-ssh-commands-on-aws-ec2-instances-with-python\",\"filePath\":\"blog/2020/11/02/running-ssh-commands-on-aws-ec2-instances-with-python.mdx\",\"toc\":[{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Running SSH Commands on AWS EC2 Instances with Python\",\"datePublished\":\"2020-11-02T09:55:43.000Z\",\"dateModified\":\"2020-11-02T09:55:43.000Z\",\"description\":\"Running SSH Commands on AWS EC2 Instances with Python\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2020/11/02/running-ssh-commands-on-aws-ec2-instances-with-python\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Running Loki behind Nginx Reverse Proxy\",\"date\":\"2020-10-29T08:29:13.000Z\",\"tags\":[\"loki\",\"grafana\",\"logging\",\"nginx\"],\"draft\":false,\"summary\":\"Running Loki behind Nginx Reverse Proxy\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"7 min read\",\"minutes\":6.99,\"time\":419400,\"words\":1398},\"slug\":\"2020/10/29/running-loki-behind-nginx-reverse-proxy\",\"path\":\"blog/2020/10/29/running-loki-behind-nginx-reverse-proxy\",\"filePath\":\"blog/2020/10/29/running-loki-behind-nginx-reverse-proxy.mdx\",\"toc\":[{\"value\":\"Assumptions\",\"url\":\"#assumptions\",\"depth\":2},{\"value\":\"What can you expect from this blogpost\",\"url\":\"#what-can-you-expect-from-this-blogpost\",\"depth\":2},{\"value\":\"Install Software\",\"url\":\"#install-software\",\"depth\":2},{\"value\":\"Configuration\",\"url\":\"#configuration\",\"depth\":2},{\"value\":\"Enable and Start Services\",\"url\":\"#enable-and-start-services\",\"depth\":2},{\"value\":\"Test Access\",\"url\":\"#test-access\",\"depth\":2},{\"value\":\"LogCLI\",\"url\":\"#logcli\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Running Loki behind Nginx Reverse Proxy\",\"datePublished\":\"2020-10-29T08:29:13.000Z\",\"dateModified\":\"2020-10-29T08:29:13.000Z\",\"description\":\"Running Loki behind Nginx Reverse Proxy\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2020/10/29/running-loki-behind-nginx-reverse-proxy\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Upload Public SSH Keys using Ansible\",\"date\":\"2020-10-26T07:44:25.000Z\",\"tags\":[\"ansible\",\"devops\",\"ssh\"],\"draft\":false,\"summary\":\"Upload Public SSH Keys using Ansible\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"3 min read\",\"minutes\":2.83,\"time\":169800,\"words\":566},\"slug\":\"2020/10/26/upload-public-ssh-keys-using-ansible\",\"path\":\"blog/2020/10/26/upload-public-ssh-keys-using-ansible\",\"filePath\":\"blog/2020/10/26/upload-public-ssh-keys-using-ansible.mdx\",\"toc\":[{\"value\":\"The User Accounts\",\"url\":\"#the-user-accounts\",\"depth\":2},{\"value\":\"The Target Server\",\"url\":\"#the-target-server\",\"depth\":2},{\"value\":\"Our Playbook\",\"url\":\"#our-playbook\",\"depth\":2},{\"value\":\"Deploy\",\"url\":\"#deploy\",\"depth\":2},{\"value\":\"Resources\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Upload Public SSH Keys using Ansible\",\"datePublished\":\"2020-10-26T07:44:25.000Z\",\"dateModified\":\"2020-10-26T07:44:25.000Z\",\"description\":\"Upload Public SSH Keys using Ansible\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2020/10/26/upload-public-ssh-keys-using-ansible\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Easy Ad-Hoc VPNs with sshuttle\",\"date\":\"2020-10-26T06:59:44.000Z\",\"tags\":[\"vpn\",\"networking\",\"sshuttle\"],\"draft\":false,\"summary\":\"Easy Ad-Hoc VPNs with sshuttle\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"3 min read\",\"minutes\":2.79,\"time\":167400,\"words\":558}
1,\"slug\":\"2020/10/26/easy-ad-hoc-vpns-with-sshuttle\",\"path\":\"blog/2020/10/26/easy-ad-hoc-vpns-with-sshuttle\",\"filePath\":\"blog/2020/10/26/easy-ad-hoc-vpns-with-sshuttle.mdx\",\"toc\":[{\"value\":\"SSH Config\",\"url\":\"#ssh-config\",\"depth\":2},{\"value\":\"Install sshuttle\",\"url\":\"#install-sshuttle\",\"depth\":2},{\"value\":\"Usage\",\"url\":\"#usage\",\"depth\":2},{\"value\":\"Bash Functions\",\"url\":\"#bash-functions\",\"depth\":2},{\"value\":\"Sshuttle as a Service\",\"url\":\"#sshuttle-as-a-service\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Easy Ad-Hoc VPNs with sshuttle\",\"datePublished\":\"2020-10-26T06:59:44.000Z\",\"dateModified\":\"2020-10-26T06:59:44.000Z\",\"description\":\"Easy Ad-Hoc VPNs with sshuttle\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2020/10/26/easy-ad-hoc-vpns-with-sshuttle\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Use a SSH Jump Host with Ansible\",\"date\":\"2020-10-26T05:25:18.000Z\",\"tags\":[\"ssh\",\"devops\",\"ansible\"],\"draft\":false,\"summary\":\"Use a SSH Jump Host with Ansible\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"2 min read\",\"minutes\":1.7,\"time\":102000,\"words\":340},\"slug\":\"2020/10/26/use-a-ssh-jump-host-with-ansible\",\"path\":\"blog/2020/10/26/use-a-ssh-jump-host-with-ansible\",\"filePath\":\"blog/2020/10/26/use-a-ssh-jump-host-with-ansible.mdx\",\"toc\":[{\"value\":\"SSH Config\",\"url\":\"#ssh-config\",\"depth\":2},{\"value\":\"Using a Bastion with Ansible\",\"url\":\"#using-a-bastion-with-ansible\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Use a SSH Jump Host with Ansible\",\"datePublished\":\"2020-10-26T05:25:18.000Z\",\"dateModified\":\"2020-10-26T05:25:18.000Z\",\"description\":\"Use a SSH Jump Host with Ansible\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2020/10/26/use-a-ssh-jump-host-with-ansible\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Basic Ping Role with Ansible in a Playbook\",\"date\":\"2020-10-23T13:13:16.000Z\",\"tags\":[\"ansible\",\"devops\"],\"draft\":false,\"summary\":\"In this Ansible tutorial, we will demonstrate a basic Ping Role in a Playbook.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"2 min read\",\"minutes\":1.845,\"time\":110700,\"words\":369},\"slug\":\"2020/10/23/basic-ping-role-with-ansible-in-a-playbook\",\"path\":\"blog/2020/10/23/basic-ping-role-with-ansible-in-a-playbook\",\"filePath\":\"blog/2020/10/23/basic-ping-role-with-ansible-in-a-playbook.mdx\",\"toc\":[{\"value\":\"Directory Structure\",\"url\":\"#directory-structure\",\"depth\":2},{\"value\":\"Install Ansible\",\"url\":\"#install-ansible\",\"depth\":2},{\"value\":\"Run the Ansible Playbook\",\"url\":\"#run-the-ansible-playbook\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Basic Ping Role with Ansible in a Playbook\",\"datePublished\":\"2020-10-23T13:13:16.000Z\",\"dateModified\":\"2020-10-23T13:13:16.000Z\",\"description\":\"In this Ansible tutorial, we will demonstrate a basic Ping Role in a Playbook.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2020/10/23/basic-ping-role-with-ansible-in-a-playbook\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Using the libvirt provisioner with Terraform for KVM\",\"date\":\"2020-10-08T00:06:21.000Z\",\"tags\":[\"terraform\",\"kvm\",\"libvirt\",\"ansible\",\"devops\"],\"draft\":false,\"summary\":\"Using the libvirt provisioner with Terraform for KVM\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"7 min read\",\"minutes\":6.445,\"time\":386700,\"words\":1289},\"slug\":\"2020/10/08/using-the-libvirt-provisioner-with-terraform-for-kvm\",\"path\":\"blog/2020/10/08/using-the-libvirt-provisioner-with-terraform-for-kvm\",\"filePath\":\"blog/2020/10/08/using-the-libvirt-provisioner-with-terraform-for-kvm.mdx\",\"toc\":[{\"value\":\"Install our Dependencies\",\"url\":\"#install-our-dependencies\",\"depth\":2},{\"value\":\"Terraform all the things\",\"url\":\"#terraform-all-the-things\",\"depth\":2},{\"value\":\"Deploy our Terraform Deployment\",\"url\":\"#deploy-our-terraform-deployment\",\"depth\":2},{\"value\":\"Test our VM\",\"url\":\"#test-our-vm\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Using the libvirt provisioner with Terraform for KVM\",\"datePublished\":\"2020-10-08T00:06:21.000Z\",\"dateModified\":\"2020-10-08T00:06:21.000Z\",\"description\":\"Using the libvirt provisioner with Terraform for KVM\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2020/10/08/using-the-libvirt-provisioner-with-terraform-for-kvm\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Setup a KVM Host for Virtualization on OneProvider\",\"date\":\"2020-10-07T23:31:43.000Z\",\"tags\":[\"kvm\",\"oneprovider\",\"virtualization\",\"linux\"],\"draft\":false,\"summary\":\"Setup a KVM Host for Virtualization on OneProvider\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"3 min read\",\"minutes\":2.67,\"time\":160200,\"words\":534},\"slug\":\"2020/10/07/setup-a-kvm-host-for-virtualization-on-oneprovider\",\"path\":\"blog/2020/10/07/setup-a-kvm-host-for-virtualization-on-oneprovider\",\"filePath\":\"blog/2020/10/07/setup-a-kvm-host-for-virtualization-on-oneprovider.mdx\",\"toc\":[{\"value\":\"What are we doing\",\"url\":\"#what-are-we-doing\",\"depth\":2},{\"value\":\"Install KVM\",\"url\":\"#install-kvm\",\"depth\":2},{\"value\":\"Test KVM\",\"url\":\"#test-kvm\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Setup a KVM Host for Virtualization on OneProvider\",\"datePublished\":\"2020-10-07T23:31:43.000Z\",\"dateModified\":\"2020-10-07T23:31:43.000Z\",\"description\":\"Setup a KVM Host for Virtualization on OneProvider\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2020/10/07/setup-a-kvm-host-for-virtualization-on-oneprovider\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Using the local-exec provisioner with Terraform\",\"date\":\"2020-09-27T17:08:49.000Z\",\"tags\":[\"terraform\",\"devops\"],\"draft\":false,\"summary\":\"Using the local-exec provisioner with Terraform\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"2 min read\",\"minutes\":1.905,\"time\":114300,\"words\":381},\"slug\":\"2020/09/27/using-the-local-exec-provisioner-with-terraform\",\"path\":\"blog/2020/09/27/using-the-local-exec-provisioner-with-terraform\",\"filePath\":\"blog/2020/09/27/using-the-local-exec-provisioner-with-terraform.mdx\",\"toc\":[{\"value\":\"Installing Terraform\",\"url\":\"#installing-terraform\",\"depth\":2},{\"value\":\"Terraform local-exec\",\"url\":\"#terraform-local-exec\",\"depth\":2},{\"value\":\"Initialize\",\"url\":\"#initialize\",\"depth\":2},{\"value\":\"Apply\",\"url\":\"#apply\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Using the local-exec provisioner with Terraform\",\"datePublished\":\"2020-09-27T17:08:49.000Z\",\"dateModified\":\"2020-09-27T17:08:49.000Z\",\"description\":\"Using the local-exec provisioner with Terraform\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2020/09/27/using-the-local-exec-provisioner-with-terraform\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Setup a NFS Server with Docker\",\"date\":\"2020-09-20T16:07:09.000Z\",\"tags\":[\"nfs\",\"docker\",\"storage\"],\"draft\":false,\"summary\":\"setup a nfs server with docker for persistent storage for your containers\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"2 min read\",\"minutes\":1.945,\"time\":116700,\"words\":389},\"slug\":\"2020/09/20/setup-a-nfs-server-with-docker\",\"path\":\"blog/2020/09/20/setup-a-nfs-server-with-docker\",\"filePath\":\"blog/2020/09/20/setup-a-nfs-server-with-docker.mdx\",\"toc\":[{\"value\":\"Host Storage Path\",\"url\":\"#host-storage-path\",\"depth\":2},{\"value\":\"NFS Server\",\"url\":\"#nfs-server\",\"depth\":2},{\"value\":\"NFS Client\",\"url\":\"#nfs-client\",\"depth\":2},{\"value\":\"NFS Docker Volume Plugin\",\"url\":\"#nfs-docker-volume-plugin\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Setup a NFS Server with Docker\",\"datePublished\":\"2020-09-20T16:07:09.000Z\",\"dateModified\":\"2020-09-20T16:07:09.000Z\",\"description\":\"setup a nfs server with docker for persistent storage for your containers\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2020/09/20/setup-a-nfs-server-with-docker\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Using if statements in bash to check if environment variables exist\",\"date\":\"2020-08-14T11:00:25.000Z\",\"tags\":[\"bash\",\"linux\",\"sysadmin\"],\"draft\":false,\"summary\":\"Using if statements in bash to check if environment variables exist\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"2 min read\",\"minutes\":1.135,\"time\":68100,\"words\":227},\"slug\":\"2020/08/14/using-if-statements-in-bash-to-check-if-environment-variables-exist\",\"path\":\"blog/2020/08/14/using-if-statements-in-bash-to-check-if-environment-variables-exist\",\"filePath\":\"blog/2020/08/14/using-if-statements-in-bash-to-check-if-environment-variables-exist.mdx\",\"toc\":[{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Using if statements in bash to check if environment variables exist\",\"datePublished\":\"2020-08-14T11:00:25.000Z\",\"dateModified\":\"2020-08-14T11:00:25.000Z\",\"description\":\"Using if statements in bash to check if environment variables exist\",\"
1image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2020/08/14/using-if-statements-in-bash-to-check-if-environment-variables-exist\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Getting Started on Logging with Loki using Docker\",\"date\":\"2020-08-13T13:39:28.000Z\",\"tags\":[\"logging\",\"loki\",\"docker\",\"grafana\"],\"draft\":false,\"summary\":\"Getting Started on Logging with Loki using Docker\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"10 min read\",\"minutes\":9.285,\"time\":557100,\"words\":1857},\"slug\":\"2020/08/13/getting-started-on-logging-with-loki-using-docker\",\"path\":\"blog/2020/08/13/getting-started-on-logging-with-loki-using-docker\",\"filePath\":\"blog/2020/08/13/getting-started-on-logging-with-loki-using-docker.mdx\",\"toc\":[{\"value\":\"What can you expect from this blog\",\"url\":\"#what-can-you-expect-from-this-blog\",\"depth\":2},{\"value\":\"Some useful information about Loki\",\"url\":\"#some-useful-information-about-loki\",\"depth\":2},{\"value\":\"Selecting logstreams with Loki\",\"url\":\"#selecting-logstreams-with-loki\",\"depth\":2},{\"value\":\"Supported Clients\",\"url\":\"#supported-clients\",\"depth\":2},{\"value\":\"Loki in Action\",\"url\":\"#loki-in-action\",\"depth\":2},{\"value\":\"LogCLI\",\"url\":\"#logcli\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Getting Started on Logging with Loki using Docker\",\"datePublished\":\"2020-08-13T13:39:28.000Z\",\"dateModified\":\"2020-08-13T13:39:28.000Z\",\"description\":\"Getting Started on Logging with Loki using Docker\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2020/08/13/getting-started-on-logging-with-loki-using-docker\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Setup a Hugo Blog with the Kiera Theme\",\"date\":\"2020-06-14T13:23:51.000Z\",\"tags\":[\"hugo\",\"blogging\"],\"draft\":false,\"summary\":\"Hugo is a must when you want to start a lightweight blog which is super fast\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"4 min read\",\"minutes\":3.645,\"time\":218700,\"words\":729},\"slug\":\"2020/06/14/setup-a-hugo-blog-with-the-kiera-theme\",\"path\":\"blog/2020/06/14/setup-a-hugo-blog-with-the-kiera-theme\",\"filePath\":\"blog/2020/06/14/setup-a-hugo-blog-with-the-kiera-theme.mdx\",\"toc\":[{\"value\":\"Dependencies\",\"url\":\"#dependencies\",\"depth\":2},{\"value\":\"Create the Hugo Workspace\",\"url\":\"#create-the-hugo-workspace\",\"depth\":2},{\"value\":\"Themes\",\"url\":\"#themes\",\"depth\":2},{\"value\":\"Customize Hugo\",\"url\":\"#customize-hugo\",\"depth\":2},{\"value\":\"Create your First Post\",\"url\":\"#create-your-first-post\",\"depth\":2},{\"value\":\"Creating Pages\",\"url\":\"#creating-pages\",\"depth\":2},{\"value\":\"Production Mode\",\"url\":\"#production-mode\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Setup a Hugo Blog with the Kiera Theme\",\"datePublished\":\"2020-06-14T13:23:51.000Z\",\"dateModified\":\"2020-06-14T13:23:51.000Z\",\"description\":\"Hugo is a must when you want to start a lightweight blog which is super fast\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2020/06/14/setup-a-hugo-blog-with-the-kiera-theme\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Using ProxyJump with SSH for VMs with No Public IPs\",\"date\":\"2020-06-13T18:06:35.000Z\",\"tags\":[\"ssh\",\"linux\"],\"draft\":false,\"summary\":\"Using ProxyJump with SSH for VMs with No Public IPs\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"2 min read\",\"minutes\":1.235,\"time\":74100,\"words\":247},\"slug\":\"2020/06/13/using-proxyjump-with-ssh-for-vms-with-no-public-ips\",\"path\":\"blog/2020/06/13/using-proxyjump-with-ss
1h-for-vms-with-no-public-ips\",\"filePath\":\"blog/2020/06/13/using-proxyjump-with-ssh-for-vms-with-no-public-ips.mdx\",\"toc\":[{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Using ProxyJump with SSH for VMs with No Public IPs\",\"datePublished\":\"2020-06-13T18:06:35.000Z\",\"dateModified\":\"2020-06-13T18:06:35.000Z\",\"description\":\"Using ProxyJump with SSH for VMs with No Public IPs\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2020/06/13/using-proxyjump-with-ssh-for-vms-with-no-public-ips\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Using a SSH Reverse Tunnel to Access Nodes on Private Ranges\",\"date\":\"2020-06-13T17:59:27.000Z\",\"tags\":[\"ssh\",\"tunneling\",\"networking\"],\"draft\":false,\"summary\":\"Using a SSH Reverse Tunnel to Access Nodes on Private Ranges\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"2 min read\",\"minutes\":1.895,\"time\":113700,\"words\":379},\"slug\":\"2020/06/13/using-a-ssh-reverse-tunnel-to-access-nodes-on-private-ranges\",\"path\":\"blog/2020/06/13/using-a-ssh-reverse-tunnel-to-access-nodes-on-private-ranges\",\"filePath\":\"blog/2020/06/13/using-a-ssh-reverse-tunnel-to-access-nodes-on-private-ranges.mdx\",\"toc\":[{\"value\":\"Other Projects\",\"url\":\"#other-projects\",\"depth\":2},{\"value\":\"Overview\",\"url\":\"#overview\",\"depth\":2},{\"value\":\"Progress\",\"url\":\"#progress\",\"depth\":2},{\"value\":\"Usage\",\"url\":\"#usage\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Using a SSH Reverse Tunnel to Access Nodes on Private Ranges\",\"datePublished\":\"2020-06-13T17:59:27.000Z\",\"dateModified\":\"2020-06-13T17:59:27.000Z\",\"description\":\"Using a SSH Reverse Tunnel to Access Nodes on Private Ranges\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2020/06/13/using-a-ssh-reverse-tunnel-to-access-nodes-on-private-ranges\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Get the Top 10 Items on Hackernews in Python\",\"date\":\"2020-06-13T17:53:20.000Z\",\"tags\":[\"python\",\"scripting\",\"programming\"],\"draft\":false,\"summary\":\"Get the Top 10 Items on Hackernews in Python\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"1 min read\",\"minutes\":0.615,\"time\":36900,\"words\":123},\"slug\":\"2020/06/13/get-the-top-10-items-on-hackernews-in-python\",\"path\":\"blog/2020/06/13/get-the-top-10-items-on-hackernews-in-python\",\"filePath\":\"blog/2020/06/13/get-the-top-10-items-on-hackernews-in-python.mdx\",\"toc\":[{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Get the Top 10 Items on Hackernews in Python\",\"datePublished\":\"2020-06-13T17:53:20.000Z\",\"dateModified\":\"2020-06-13T17:53:20.000Z\",\"description\":\"Get the Top 10 Items on Hackernews in Python\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2020/06/13/get-the-top-10-items-on-hackernews-in-python\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Improve MySQL Write Performance using Batch Writes\",\"date\":\"2020-06-13T17:31:32.000Z\",\"tags\":[\"databases\",\"mysql\",\"performance\",\"python\"],\"draft\":false,\"summary\":\"Never use sequential writes when you have lots of records to write at once, rather use batch writes to improve write performance\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"4 min read\",\"minutes\":3.61,\"time\":216600,\"words\":722},\"slug\":\"2020/06/13/improve-mysql-write-performance-using-batch-writes\",\"path\":\"blog/2020/06/13/improve-mysql-write-performance-using-batch-writes\",\"filePath\":\"blog/2020/06/13/improve-mysql-write-performance-using-batch-writes.mdx\",\"toc\":[{\"value\":\"What will we be doing\",\"url\":\"#what-will-we-be-doing\",\"depth\":2},{\"value\":\"Sequential Writes\",\"url\":\"#sequential-writes\",\"depth\":2},{\"value\":\"Batch Writes\",\"url\":\"#batch-writes\",\"depth\":2},{\"value\":\"Looking at the Scripts\",\"url\":\"#looking-at-the-scripts\",\"depth\":2},{\"value\":\"Thanks\",\"url\":\"#thanks\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Improve MySQL Write Performance using Batch Writes\",\"datePublished\":\"2020-06-13T17:31:32.000Z\",\"dateModified\":\"2020-06-13T17:31:32.000Z\",\"description\":\"Never use sequential writes when you have lots of records to write at once, rather use batch writes to improve write performance\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2020/06/13/improve-mysql-write-performance-using-batch-writes\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Increase Performance with your Ghost Blog on Docker\",\"date\":\"2020-06-08T21:28:07.000Z\",\"tags\":[\"docker\",\"ghost\",\"nginx\",\"caching\",\"performance\"],\"draft\":false,\"summary\":\"Increase your blog performance by adding a nginx reverse proxy with caching enabled on Docker\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"3 min read\",\"minutes\":2.795,\"time\":167700,\"words\":559},\"slug\":\"2020/06/08/build-a-ghost-blog-with-nginx-cache-on-docker\",\"path\":\"blog/2020/06/08/build-a-ghost-blog-with-nginx-cache-on-docker\",\"filePath\":\"blog/2020/06/08/build-a-ghost-blog-with-nginx-cache-on-docker.mdx\",\"toc\":[{\"value\":\"But why would you want caching?\",\"url\":\"#but-why-would-you-want-caching\",\"depth\":2},{\"value\":\"Caching Info\",\"url\":\"#caching-info\",\"depth\":2},{\"value\":\"Nginx\",\"url\":\"#nginx\",\"depth\":2},{\"value\":\"Test Caching\",\"url\":\"#test-caching\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Increase Performance with your Ghost Blog on Docker\",\"datePublished\":\"2020-06-08T21:28:07.000Z\",\"dateModified\":\"2020-06-08T21:28:07.000Z\",\"description\":\"Increase your blog performance by adding a nginx reverse proxy with caching enabled on Docker\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2020/06/08/build-a-ghost-blog-with-nginx-cache-on-docker\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Ingesting Pocket.com Links into Elasticsearch\",\"date\":\"2020-06-08T21:06:23.000Z\",\"tags\":[\"elasticsearch\",\"python\",\"pocket\",\"programming\"],\"draft\":false,\"summary\":\"Ingesting Pocket.com Links into Elasticsearch\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"6 min read\",\"minutes\":5.445,\"time\":326700,\"words\":1089},\"slug\":\"2020/06/08/ingesting-pocket-items-into-elasticsearch\",\"path\":\"blog/2020/06/08/ingesting-pocket-items-into-elasticsearch\",\"filePath\":\"blog/2020/06/08/ingesting-pocket-items-into-elasticsearch.mdx\",\"toc\":[{\"value\":\"What will we be doing\",\"url\":\"#what-will-we-be-doing\",\"depth\":2},{\"value\":\"Authentication\",\"url\":\"#authentication\",\"depth\":2},{\"value\":\"Main App\",\"url\":\"#main-app\",\"depth\":2},{\"value\":\"Now what\",\"url\":\"#now-what\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Ingesting Pocket.com Links into Elasticsearch\",\"datePublished\":\"2020-06-08T21:06:23.000Z\",\"dateModified\":\"2020-06-08T21:06:23.000Z\",\"description\":\"Ingesting Pocket.com Links into Elasticsearch\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2020/06/08/ingesting-pocket-items-into-elasticsearch\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Using Python RQ for Task Queues in Python\",\"date\":\"2020-05-16T19:12:36.000Z\",\"tags\":[\"redis\",\"python\",\"python-rq\",\"queueing\",\"programming\"],\"draft\":false,\"summary\":\"Python Redis Queue Getting Started Tutorial by Ruan Bekker\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"6 min read\",\"minutes\":5.685,\"time\":341100,\"words\":1137},\"slug\":\"2020/05/16/using-python-rq-for-task-queues-in-python\",\"path\":\"blog/2020/05/16/using-python-rq-for-task-queues-in-python\",\"filePath\":\"blog/2020/05/16/using-python-rq-for-task-queues-in-python.mdx\",\"toc\":[{\"value\":\"What will we be doing\",\"url\":\"#what-will-we-be-doing\",\"depth\":2},{\"value\":\"Redis Server\",\"url\":\"#redis-server\",\"depth\":2},{\"value\":\"Python RQ\",\"url\":\"#python-rq\",\"depth\":2},{\"value\":\"Submit a Task to the Queue\",\"url\":\"#submit-a-task-to-the-queue\",\"depth\":2},{\"value\":\"Consuming from the Queue\",\"url\":\"#consuming-from-the-queue\",\"depth\":2},{\"value\":\"Naming Queues\",\"url\":\"#naming-queues\",\"depth\":2},{\"value\":\"Cleaning the Queue\",\"url\":\"#cleaning-the-queue\",\"depth\":2},{\"value\":\"Naming Workers\",\"url\":\"#naming-workers\",\"depth\":2},{\"value\":\"Resources\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Using Python RQ for Task Queues in Python\",\"datePublished\":\"2020-05-16T19:12:36.000Z\",\"dateModified\":\"2020-05-16T19:12:36.000Z\",\"description\":\"Python Redis Queue Getting Started Tutorial by Ruan Bekker\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2020/05/16/using-python-rq-for-task-queues-in-python\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Selecting and Returning Specific Data with JQ\",\"date\":\"2020-05-09T20:23:00.000Z\",\"tags\":[\"jq\",\"json\"],\"draft\":false,\"summary\":\"Selecting and Returning Specific Data with JQ\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"3 min read\",\"minutes\":2.175,\"time\":130500,\"words\":435}
1,\"slug\":\"2020/05/09/selecting-and-returning-specific-data-with-jq\",\"path\":\"blog/2020/05/09/selecting-and-returning-specific-data-with-jq\",\"filePath\":\"blog/2020/05/09/selecting-and-returning-specific-data-with-jq.mdx\",\"toc\":[{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Selecting and Returning Specific Data with JQ\",\"datePublished\":\"2020-05-09T20:23:00.000Z\",\"dateModified\":\"2020-05-09T20:23:00.000Z\",\"description\":\"Selecting and Returning Specific Data with JQ\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2020/05/09/selecting-and-returning-specific-data-with-jq\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Server Backups to Google Drive using the Drive CLI tool\",\"date\":\"2020-05-08T16:43:35.000Z\",\"tags\":[\"backups\",\"google-drive\",\"gdrive\",\"sysadmin\"],\"draft\":false,\"summary\":\"Server Backups to Google Drive using the Drive CLI tool\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"4 min read\",\"minutes\":3.595,\"time\":215700,\"words\":719},\"slug\":\"2020/05/08/server-backups-to-google-drive-using-the-drive-cli-tool\",\"path\":\"blog/2020/05/08/server-backups-to-google-drive-using-the-drive-cli-tool\",\"filePath\":\"blog/2020/05/08/server-backups-to-google-drive-using-the-drive-cli-tool.mdx\",\"toc\":[{\"value\":\"What we will be doing\",\"url\":\"#what-we-will-be-doing\",\"depth\":2},{\"value\":\"Setup Drive CLI Tool\",\"url\":\"#setup-drive-cli-tool\",\"depth\":2},{\"value\":\"Credentials\",\"url\":\"#credentials\",\"depth\":2},{\"value\":\"Backup to Google Drive\",\"url\":\"#backup-to-google-drive\",\"depth\":2},{\"value\":\"Scripting our Backup Task\",\"url\":\"#scripting-our-backup-task\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Server Backups to Google Drive using the Drive CLI tool\",\"datePublished\":\"2020-05-08T16:43:35.000Z\",\"dateModified\":\"2020-05-08T16:43:35.000Z\",\"description\":\"Server Backups to Google Drive using the Drive CLI tool\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2020/05/08/server-backups-to-google-drive-using-the-drive-cli-tool\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"How to setup a Redis Exporter for Prometheus\",\"date\":\"2020-05-05T21:14:52.000Z\",\"tags\":[\"prometheus\",\"redis\",\"monitoring\"],\"draft\":false,\"summary\":\"How to setup a Redis Exporter for Prometheus\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"3 min read\",\"minutes\":2.27,\"time\":136200,\"words\":454},\"slug\":\"2020/05/05/how-to-setup-a-redis-exporter-for-prometheus\",\"path\":\"blog/2020/05/05/how-to-setup-a-redis-exporter-for-prometheus\",\"filePath\":\"blog/2020/05/05/how-to-setup-a-redis-exporter-for-prometheus.mdx\",\"toc\":[{\"value\":\"Install Golang\",\"url\":\"#install-golang\",\"depth\":2},{\"value\":\"Redis Exporter\",\"url\":\"#redis-exporter\",\"depth\":2},{\"value\":\"Configure Prometheus\",\"url\":\"#configure-prometheus\",\"depth\":2},{\"value\":\"Grafana\",\"url\":\"#grafana\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"How to setup a Redis Exporter for Prometheus\",\"datePublished\":\"2020-05-05T21:14:52.000Z\",\"dateModified\":\"2020-05-05T21:14:52.000Z\",\"description\":\"How to setup a Redis Exporter for Prometheus\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2020/05/05/how-to-setup-a-redis-exporter-for-prometheus\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Nginx Analysis Dashboard using Grafana and Elasticsearch\",\"date\":\"2020-04-28T18:07:22.000Z\",\"tags\":[\"nginx\",\"elasticsearch\",\"analytics\",\"logstash\",\"filebeat\",\"redis\"],\"draft\":false,\"summary\":\"I will be demonstrating how to build a full analysis dashboard using grafana and elasticsearch. Filebeat will pickup the logs from Nginx and output it to Redis, Logstash will read it from Redis and output to Elasticsearch, where we will visualize it from Grafana.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"8 min read\",\"minutes\":7.985,\"time\":479100,\"words\":1597},\"slug\":\"2020/04/28/nginx-analysis-dashboard-using-grafana-and-elasticsearch\",\"path\":\"blog/2020/04/28/nginx-analysis-dashboard-using-grafana-and-elasticsearch\",\"filePath\":\"blog/2020/04/28/nginx-analysis-dashboard-using-grafana-and-elasticsearch.mdx\",\"toc\":[{\"value\":\"The End Result\",\"url\":\"#the-end-result\",\"depth\":2},{\"value\":\"High Level Overview\",\"url\":\"#high-level-overview\",\"depth\":2},{\"value\":\"Let's build all the things\",\"url\":\"#lets-build-all-the-things\",\"depth\":2},{\"value\":\"Elasticsearch\",\"url\":\"#elasticsearch\",\"depth\":2},{\"value\":\"Redis\",\"url\":\"#redis\",\"depth\":2},{\"value\":\"Logstash\",\"url\":\"#logstash\",\"depth\":2},{\"value\":\"Nginx\",\"url\":\"#nginx\",\"depth\":2},{\"value\":\"Grafana\",\"url\":\"#grafana\",\"depth\":2},{\"value\":\"Prometheus\",\"url\":\"#prometheus\",\"depth\":2},{\"value\":\"Verifying\",\"url\":\"#verifying\",\"depth\":2},{\"value\":\"The Fun Part: Dashboarding\",\"url\":\"#the-fun-part-dashboarding\",\"depth\":2},{\"value\":\"Tour of our Dashboard Panels\",\"url\":\"#tour-of-our-dashboard-panels\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Nginx Analysis Dashboard using Grafana and Elasticsearch\",\"datePublished\":\"2020-04-28T18:07:22.000Z\",\"dateModified\":\"2020-04-28T18:07:22.000Z\",\"description\":\"I will be demonstrating how to build a full analysis dashboard using grafana and elasticsearch. Filebeat will pickup the logs from Nginx and output it to Redis, Logstash will read it from Redis and output to Elasticsearch, where we will visualize it from Grafana.\",\"
1image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2020/04/28/nginx-analysis-dashboard-using-grafana-and-elasticsearch\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"How to do Port Forwarding with Iptables\",\"date\":\"2020-04-27T11:42:41.000Z\",\"tags\":[\"iptables\",\"networking\",\"linux\",\"sysadmin\"],\"draft\":false,\"summary\":\"This tutorial will show you how to do Port Forwarding with Iptables on Linux.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"1 min read\",\"minutes\":0.925,\"time\":55500,\"words\":185},\"slug\":\"2020/04/27/how-to-do-port-forwarding-with-iptables\",\"path\":\"blog/2020/04/27/how-to-do-port-forwarding-with-iptables\",\"filePath\":\"blog/2020/04/27/how-to-do-port-forwarding-with-iptables.mdx\",\"toc\":[{\"value\":\"What would we like to achieve\",\"url\":\"#what-would-we-like-to-achieve\",\"depth\":2},{\"value\":\"LXC Host\",\"url\":\"#lxc-host\",\"depth\":2},{\"value\":\"Test over the Internet\",\"url\":\"#test-over-the-internet\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"How to do Port Forwarding with Iptables\",\"datePublished\":\"2020-04-27T11:42:41.000Z\",\"dateModified\":\"2020-04-27T11:42:41.000Z\",\"description\":\"This tutorial will show you how to do Port Forwarding with Iptables on Linux.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2020/04/27/how-to-do-port-forwarding-with-iptables\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"How to set a Static IP in Ubuntu 18\",\"date\":\"2020-04-27T11:39:19.000Z\",\"tags\":[\"ubuntu\",\"linux\",\"networking\",\"sysadmin\"],\"draft\":false,\"summary\":\"This is a linux tutorial on how to set a Static IP address in Ubuntu 18 Linux.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"1 min read\",\"minutes\":0.765,\"time\":45900,\"words\":153},\"slug\":\"2020/04/27/how-to-set-a-static-ip-in-ubuntu-18\",\"path\":\"blog/2020/04/27/how-to-set-a-static-ip-in-ubuntu-18\",\"filePath\":\"blog/2020/04/27/how-to-set-a-static-ip-in-ubuntu-18.mdx\",\"toc\":[{\"value\":\"Netplan\",\"url\":\"#netplan\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"How to set a Static IP in Ubuntu 18\",\"datePublished\":\"2020-04-27T11:39:19.000Z\",\"dateModified\":\"2020-04-27T11:39:19.000Z\",\"description\":\"This is a linux tutorial on how to set a Static IP address in Ubuntu 18 Linux.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2020/04/27/how-to-set-a-static-ip-in-ubuntu-18\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Graphing Covid-19 Stats with Grafana and Elasticsearch using Python\",\"date\":\"2020-04-26T00:24:27.000Z\",\"tags\":[\"grafana\",\"elasticsearch\",\"python\",\"covid19\",\"monitoring\"],\"draft\":false,\"summary\":\"Graphing Covid-19 Stats with Grafana and Elasticsearch using Python\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"6 min read\",\"minutes\":5.72,\"time\":343200,\"words\":1144},\"slug\":\"2020/04/26/graphing-covid-19-stats-with-grafana-and-elasticsearch-using-python\",\"path\":\"blog/2020/04/26/graphing-covid-19-stats-with-grafana-and-elasticsearch-using-python\",\"filePath\":\"blog/2020/04/26/graphing-covid-19-stats-with-grafana-and-elasticsearch-using-python.mdx\",\"toc\":[{\"value\":\"Sample of the Data\",\"url\":\"#sample-of-the-data\",\"depth\":2},{\"value\":\"Some issues we need to fix\",\"url\":\"#some-issues-we-need-to-fix\",\"depth\":2},{\"value\":\"How we will ingest the data\",\"url\":\"#how-we-will-ingest-the-data\",\"depth\":2},{\"value\":\"Visualize the Data with Grafana\",\"url\":\"#visualize-the-data-with-grafana\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Graphing Covid-19 Stats with Grafana and Elasticsearch using Python\",\"datePublished\":\"2020-04-26T00:24:27.000Z\",\"dateModified\":\"2020-04-26T00:24:27.000Z\",\"description\":\"Graphing Covid-19 Stats with Grafana and Elasticsearch using Python\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2020/04/26/graphing-covid-19-stats-with-grafana-and-elasticsearch-using-python\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Nginx Metrics on Prometheus with the Nginx Log Exporter\",\"date\":\"2020-04-24T23:42:35.000Z\",\"tags\":[\"prometheus\",\"metrics\",\"monitoring\"],\"draft\":false,\"summary\":\"Nginx Metrics on Prometheus with the Nginx Log Exporter\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"6 min read\",\"minutes\":5.675,\"time\":340500,\"words\":1135},\"slug\":\"2020/04/25/nginx-metrics-on-prometheus-with-the-nginx-log-exporter\",\"path\":\"blog/2020/04/25/nginx-metrics-on-prometheus-with-the-nginx-log-exporter\",\"filePath\":\"blog/2020/04/25/nginx-metrics-on-prometheus-with-the-nginx-log-exporter.mdx\",\"toc\":[{\"value\":\"Nginx Webserver\",\"url\":\"#nginx-web
1server\",\"depth\":2},{\"value\":\"Nginx Log Exporter\",\"url\":\"#nginx-log-exporter\",\"depth\":2},{\"value\":\"Test the exporter\",\"url\":\"#test-the-exporter\",\"depth\":2},{\"value\":\"Configure Prometheus\",\"url\":\"#configure-prometheus\",\"depth\":2},{\"value\":\"Dashboarding in Grafana\",\"url\":\"#dashboarding-in-grafana\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Nginx Metrics on Prometheus with the Nginx Log Exporter\",\"datePublished\":\"2020-04-24T23:42:35.000Z\",\"dateModified\":\"2020-04-24T23:42:35.000Z\",\"description\":\"Nginx Metrics on Prometheus with the Nginx Log Exporter\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2020/04/25/nginx-metrics-on-prometheus-with-the-nginx-log-exporter\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"IPSec Site to Site VPN with Dynamic IPs with Openswan\",\"date\":\"2020-04-19T18:58:17.000Z\",\"tags\":[\"strongswan\",\"ipsec\",\"vpn\",\"networking\",\"linux\"],\"draft\":false,\"summary\":\"How to setup a ipsec site to site VPN with Dynamic IPs using Openswan on Linux.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"10 min read\",\"minutes\":9.26,\"time\":555600,\"words\":1852},\"slug\":\"2020/04/19/ipsec-site-to-site-vpn-with-dynamic-ips-with-openswan\",\"path\":\"blog/2020/04/19/ipsec-site-to-site-vpn-with-dynamic-ips-with-openswan\",\"filePath\":\"blog/2020/04/19/ipsec-site-to-site-vpn-with-dynamic-ips-with-openswan.mdx\",\"toc\":[{\"value\":\"Some background\",\"url\":\"#some-background\",\"depth\":2},{\"value\":\"What we will be doing\",\"url\":\"#what-we-will-be-doing\",\"depth\":2},{\"value\":\"Environment\",\"url\":\"#environment\",\"depth\":2},{\"value\":\"Cloudflare Dynamic DNS\",\"url\":\"#cloudflare-dynamic-dns\",\"depth\":2},{\"value\":\"Port Forwarding\",\"url\":\"#port-forwarding\",\"depth\":2},{\"value\":\"Create a Pre-Shared Key\",\"url\":\"#create-a-pre-shared-key\",\"depth\":2},{\"value\":\"Install Strongswan on Side-A\",\"url\":\"#install-strongswan-on-side-a\",\"depth\":2},{\"value\":\"Install Strongswan on Side-B\",\"url\":\"#install-strongswan-on-side-b\",\"depth\":2},{\"value\":\"Verify Status\",\"url\":\"#verify-status\",\"depth\":2},{\"value\":\"Optional: Roadwarrior VPN Clients\",\"url\":\"#optional-roadwarrior-vpn-clients\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"IPSec Site to Site VPN with Dynamic IPs with Openswan\",\"datePublished\":\"2020-04-19T18:58:17.000Z\",\"dateModified\":\"2020-04-19T18:58:17.000Z\",\"description\":\"How to setup a ipsec site to site VPN with Dynamic IPs using Openswan on Linux.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2020/04/19/ipsec-site-to-site-vpn-with-dynamic-ips-with-openswan\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Persistent Volumes with k3d Kubernetes\",\"date\":\"2020-02-20T22:07:48.000Z\",\"tags\":[\"k3d\",\"kubernetes\",\"storage\",\"devops\"],\"draft\":false,\"summary\":\"In this tutorial I will demonstrate how to implement persistent volumes with k3d distribution of Kubernetes.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"4 min read\",\"minutes\":3.09,\"time\":185400,\"words\":618},\"slug\":\"2020/02/21/persistent-volumes-with-k3d-kubernetes\",\"path\":\"blog/2020/02/21/persistent-volumes-with-k3d-kubernetes\",\"filePath\":\"blog/2020/02/21/persistent-volumes-with-k3d-kubernetes.mdx\",\"toc\":[{\"value\":\"The k3d Cluster\",\"url\":\"#the-k3d-cluster\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Persistent Volumes with k3d Kubernetes\",\"datePublished\":\"2020-02-20T22:07:48.000Z\",\"dateModified\":\"2020-02-20T22:07:48.000Z\",\"description\":\"In this tutorial I 
1will demonstrate how to implement persistent volumes with k3d distribution of Kubernetes.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2020/02/21/persistent-volumes-with-k3d-kubernetes\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Asynchronous Function with OpenFaas\",\"date\":\"2020-02-17T21:51:22.000Z\",\"tags\":[\"python\",\"openfaas\",\"devops\"],\"draft\":false,\"summary\":\"This tutorial will show you how to setup a asynchronous function with OpenFaas\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"5 min read\",\"minutes\":4.335,\"time\":260100,\"words\":867},\"slug\":\"2020/02/17/python-asynchronous-function-with-openfaas\",\"path\":\"blog/2020/02/17/python-asynchronous-function-with-openfaas\",\"filePath\":\"blog/2020/02/17/python-asynchronous-function-with-openfaas.mdx\",\"toc\":[{\"value\":\"What are we doing\",\"url\":\"#what-are-we-doing\",\"depth\":2},{\"value\":\"Deploy OpenFaas\",\"url\":\"#deploy-openfaas\",\"depth\":2},{\"value\":\"Webhook Service\",\"url\":\"#webhook-service\",\"depth\":2},{\"value\":\"Deploy the OpenFaas Function\",\"url\":\"#deploy-the-openfaas-function\",\"depth\":2},{\"value\":\"Testing\",\"url\":\"#testing\",\"depth\":2},{\"value\":\"OpenFaas Documentation:\",\"url\":\"#openfaas-documentation\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Asynchronous Function with OpenFaas\",\"datePublished\":\"2020-02-17T21:51:22.000Z\",\"dateModified\":\"2020-02-17T21:51:22.000Z\",\"description\":\"This tutorial will show you how to setup a asynchronous function with OpenFaas\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2020/02/17/python-asynchronous-function-with-openfaas\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Traefik Ingress for OpenFaas on Kubernetes (k3d)\",\"date\":\"2020-02-17T21:36:33.000Z\",\"tags\":[\"kubernetes\",\"k3d\",\"traefik\",\"openfaas\",\"devops\"],\"draft\":false,\"summary\":\"This tutorial demonstrates how to setup a Traefik Ingress for OpenFaas on Kubernetes (k3d)\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"4 min read\",\"minutes\":3.025,\"time\":181500,\"words\":605},\"slug\":\"2020/02/17/traefik-ingress-for-openfaas-on-kubernetes-k3d\",\"path\":\"blog/2020/02/17/traefik-ingress-for-openfaas-on-kubernetes-k3d\",\"filePath\":\"blog/2020/02/17/traefik-ingress-for-openfaas-on-kubernetes-k3d.mdx\",\"toc\":[{\"value\":\"Deploy a Kubernetes Cluster\",\"url\":\"#deploy-a-kubernetes-cluster\",\"depth\":2},{\"value\":\"Deploy OpenFaas\",\"url\":\"#deploy-openfaas\",\"depth\":2},{\"value\":\"Traefik Ingress\",\"url\":\"#traefik-ingress\",\"depth\":2},{\"value\":\"OpenFaas CLI\",\"url\":\"#openfaas-cli\",\"depth\":2},{\"value\":\"Deploy a Function\",\"url\":\"#deploy-a-function\",\"depth\":2},{\"value\":\"Delete the Cluster\",\"url\":\"#delete-the-cluster\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Traefik Ingress for OpenFaas on Kubernetes (k3d)\",\"datePublished\":\"2020-02-17T21:36:33.000Z\",\"dateModified\":\"2020-02-17T21:36:33.000Z\",\"description\":\"This tutorial demonstrates how to setup a Traefik Ingress for OpenFaas on Kubernetes (k3d)\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2020/02/17/traefik-ingress-for-openfaas-on-kubernetes-k3d\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Install OpenFaas on k3d Kubernetes\",\"date\":\"2020-02-11T22:57:47.000Z\",\"tags\":[\"openfaas\",\"kubernetes\",\"k3d\"],\"draft\":false,\"summary\":\"This tutorial shows you how to install OpenFaas on k3d distribution of Kubernetes locally.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"3 min read\",\"minutes\":2.365,\"time\":141900,\"words\":473},\"slug\":\"2020/02/12/install-openfaas-on-k3d-kubernetes\",\"path\":\"blog/2020/02/12/install-openfaas-on-k3d-kubernetes\",\"filePath\":\"blog/2020/02/12/install-openfaas-on-k3d-kubernetes.mdx\",\"toc\":[{\"value\":\"Kubernetes on k3d\",\"url\":\"#kubernetes-on-k3d\",\"depth\":2},{\"value\":\"Deploy a 3 Node Kubernetes Cluster\",\"url\":\"#deploy-a-3-node-kubernetes-cluster\",\"depth\":2},{\"value\":\"Deploy OpenFaas\",\"url\":\"#deploy-openfaas\",\"depth\":2},{\"value\":\"Deploy a OpenFaas Function\",\"url\":\"#deploy-a-openfaas-function\",\"depth\":2},{\"value\":\"Delete your Cluster\",\"url\":\"#delete-your-cluster\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Install OpenFaas on k3d Kubernetes\",\"datePublished\":\"2020-02-11T22:57:47.000Z\",\"dateModified\":\"2020-02-11T22:57:47.000Z\",\"description\":\"This tutorial shows you how to install OpenFaas on k3d distribution of Kubernetes locally.\",\"
1image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2020/02/12/install-openfaas-on-k3d-kubernetes\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Lightweight Development Kubernetes Options: k3d\",\"date\":\"2020-02-11T22:27:00.000Z\",\"tags\":[\"kubernetes\",\"k3d\"],\"draft\":false,\"summary\":\"Lightweight Development Kubernetes Options: k3d\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"3 min read\",\"minutes\":2.14,\"time\":128400,\"words\":428},\"slug\":\"2020/02/12/lightweight-development-kubernetes-options-k3d\",\"path\":\"blog/2020/02/12/lightweight-development-kubernetes-options-k3d\",\"filePath\":\"blog/2020/02/12/lightweight-development-kubernetes-options-k3d.mdx\",\"toc\":[{\"value\":\"What is k3d\",\"url\":\"#what-is-k3d\",\"depth\":2},{\"value\":\"Pre-Requirements\",\"url\":\"#pre-requirements\",\"depth\":2},{\"value\":\"Install k3d\",\"url\":\"#install-k3d\",\"depth\":2},{\"value\":\"Deploy a 3 Node Cluster\",\"url\":\"#deploy-a-3-node-cluster\",\"depth\":2},{\"value\":\"Deploy a Sample App\",\"url\":\"#deploy-a-sample-app\",\"depth\":2},{\"value\":\"Deleting your Cluster\",\"url\":\"#deleting-your-cluster\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Lightweight Development Kubernetes Options: k3d\",\"datePublished\":\"2020-02-11T22:27:00.000Z\",\"dateModified\":\"2020-02-11T22:27:00.000Z\",\"description\":\"Lightweight Development Kubernetes Options: k3d\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2020/02/12/lightweight-development-kubernetes-options-k3d\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Run Localstack as a Service Container for AWS Mock Services on Drone CI\",\"date\":\"2020-02-04T21:43:30.000Z\",\"tags\":[\"aws\",\"localstack\",\"drone\",\"devops\",\"cicd\"],\"draft\":false,\"summary\":\"Run Localstack as a Service Container for AWS Mock Services on Drone CI\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"3 min read\",\"minutes\":2.465,\"time\":147900,\"words\":493},\"slug\":\"2020/02/04/run-localstack-as-a-service-container-for-aws-mock-services-on-drone-ci\",\"path\":\"blog/2020/02/04/run-localstack-as-a-service-container-for-aws-mock-services-on-drone-ci\",\"filePath\":\"blog/2020/02/04/run-localstack-as-a-service-container-for-aws-mock-services-on-drone-ci.mdx\",\"toc\":[{\"value\":\"Gitea and Drone Stack\",\"url\":\"#gitea-and-drone-stack\",\"depth\":2},{\"value\":\"Create the Drone Config\",\"url\":\"#create-the-drone-config\",\"depth\":2},{\"value\":\"Trigger the Pipeline\",\"url\":\"#trigger-the-pipeline\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Run Localstack as a Service Container for AWS Mock Services on Drone CI\",\"datePublished\":\"2020-02-04T21:43:30.000Z\",\"dateModified\":\"2020-02-04T21:43:30.000Z\",\"description\":\"Run Localstack as a Service Container for AWS Mock Services on Drone CI\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2020/02/04/run-localstack-as-a-service-container-for-aws-mock-services-on-drone-ci\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Run Kubernetes (k3s) as a Service Container on Drone CI\",\"date\":\"2020-02-04T20:37:06.000Z\",\"tags\":[\"kubernetes\",\"drone\",\"cicd\",\"devops\"],\"draft\":false,\"summary\":\"Run Kubernetes (k3s) as a Service Container on Drone CI\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"4 min read\",\"minutes\":3.37,\"time\":202200,\"words\":674},\"slug\":\"2020/02/04/run-kubernetes-k3s-as-a-service-container-on-drone-ci\",\"path\":\"blog/2020/02/04/run-kubernetes-k3s-as-a-service-container-on-drone-ci\",\"filePath\":\"blog/2020/02/04/run-kubernetes-k3s-as-a-service-container-on-drone-ci.mdx\",\"toc\":[{\"value\":\"What is Drone\",\"url\":\"#what-is-drone\",\"depth\":2},{\"value\":\"Setup Gitea and Drone\",\"url\":\"#setup-gitea-and-drone\",\"depth\":2},{\"value\":\"Create your Git Repo\",\"url\":\"#create-your-git-repo\",\"depth\":2},{\"value\":\"Activate the Repo in Drone\",\"url\":\"#activate-the-repo-in-drone\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Run Kubernetes (k3s) as a Service Container on Drone CI\",\"datePublished\":\"2020-02-04T20:37:06.000Z\",\"dateModified\":\"2020-02-04T20:37:06.000Z\",\"description\":\"Run Kubernetes (k3s) as a Service Container on Drone CI\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2020/02/04/run-kubernetes-k3s-as-a-service-container-on-drone-ci\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Setup Gitea and Drone on Docker 2020 Edition\",\"date\":\"2020-02-04T19:58:39.000Z\",\"tags\":[\"drone\",\"gitea\",\"devops\",\"cicd\"],\"draft\":false,\"summary\":\"Setup Gitea and Drone on Docker 2020 Edition\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"3 min read\",\"minutes\":2.85,\"time\":171000,\"words\":570}
1,\"slug\":\"2020/02/04/setup-gitea-and-drone-on-docker-2020-edition\",\"path\":\"blog/2020/02/04/setup-gitea-and-drone-on-docker-2020-edition\",\"filePath\":\"blog/2020/02/04/setup-gitea-and-drone-on-docker-2020-edition.mdx\",\"toc\":[{\"value\":\"Deploy Gitea and Drone\",\"url\":\"#deploy-gitea-and-drone\",\"depth\":2},{\"value\":\"Access your Stack\",\"url\":\"#access-your-stack\",\"depth\":2},{\"value\":\"Create a Git Repository\",\"url\":\"#create-a-git-repository\",\"depth\":2},{\"value\":\"Configure Drone\",\"url\":\"#configure-drone\",\"depth\":2},{\"value\":\"Trigger the Build\",\"url\":\"#trigger-the-build\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Setup Gitea and Drone on Docker 2020 Edition\",\"datePublished\":\"2020-02-04T19:58:39.000Z\",\"dateModified\":\"2020-02-04T19:58:39.000Z\",\"description\":\"Setup Gitea and Drone on Docker 2020 Edition\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2020/02/04/setup-gitea-and-drone-on-docker-2020-edition\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Setup Thanos on Docker: A Highly Available Prometheus\",\"date\":\"2020-01-31T23:28:12.000Z\",\"tags\":[\"promteheus\",\"metrics\",\"thanos\"],\"draft\":false,\"summary\":\"Thanos is a open source, highly available prometheus setup with long term storage capabilites\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"6 min read\",\"minutes\":5.88,\"time\":352800,\"words\":1176},\"slug\":\"2020/02/01/setup-thanos-on-docker-a-highly-available-prometheus\",\"path\":\"blog/2020/02/01/setup-thanos-on-docker-a-highly-available-prometheus\",\"filePath\":\"blog/2020/02/01/setup-thanos-on-docker-a-highly-available-prometheus.mdx\",\"toc\":[{\"value\":\"Prometheus\",\"url\":\"#prometheus\",\"depth\":2},{\"value\":\"Thanos\",\"url\":\"#thanos\",\"depth\":2},{\"value\":\"Thanos Components\",\"url\":\"#thanos-components\",\"depth\":2},{\"value\":\"What are we doing today\",\"url\":\"#what-are-we-doing-today\",\"depth\":2},{\"value\":\"Deploy the Cluster\",\"url\":\"#deploy-the-cluster\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Setup Thanos on Docker: A Highly Available Prometheus\",\"datePublished\":\"2020-01-31T23:28:12.000Z\",\"dateModified\":\"2020-01-31T23:28:12.000Z\",\"description\":\"Thanos is a open source, highly available prometheus setup with long term storage capabilites\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2020/02/01/setup-thanos-on-docker-a-highly-available-prometheus\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Save Output to Local File with Ansible\",\"date\":\"2020-01-24T17:56:01.000Z\",\"tags\":[\"ansible\",\"devops\"],\"draft\":false,\"summary\":\"This ansible tutorial shows you how to save the stdout to a local file with ansible.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"1 min read\",\"minutes\":0.955,\"time\":57300,\"words\":191},\"slug\":\"2020/01/24/save-output-to-local-file-with-ansible\",\"path\":\"blog/2020/01/24/save-output-to-local-file-with-ansible\",\"filePath\":\"blog/2020/01/24/save-output-to-local-file-with-ansible.mdx\",\"toc\":[{\"value\":\"Inventory\",\"url\":\"#inventory\",\"depth\":2},{\"value\":\"The Script\",\"url\":\"#the-script\",\"depth\":2},{\"value\":\"Playbook\",\"url\":\"#playbook\",\"depth\":2},{\"value\":\"Running\",\"url\":\"#running\",\"depth\":2},{\"value\":\"Read More\",\"url\":\"#read-more\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Save Output to Local File with Ansible\",\"datePublished\":\"2020-01-24T17:56:01.000Z\",\"dateModified\":\"2020-01-24T17:56:01.000Z\",\"description\":\"This ansible tutorial shows you how to save the stdout to a local file with ansible.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2020/01/24/save-output-to-local-file-with-ansible\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Environment Variables with Ansible\",\"date\":\"2020-01-24T17:28:16.000Z\",\"tags\":[\"ansible\",\"devops\"],\"draft\":false,\"summary\":\"This ansible tutorial shows how to work with environment variables in ansible.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"2 min read\",\"minutes\":1.11,\"time\":66600,\"words\":222},\"slug\":\"2020/01/24/environment-variables-with-ansible\",\"path\":\"blog/2020/01/24/environment-variables-with-ansible\",\"filePath\":\"blog/2020/01/24/environment-variables-with-ansible.mdx\",\"toc\":[{\"value\":\"Inventory\",\"url\":\"#inventory\",\"depth\":2},{\"value\":\"Across Tasks\",\"url\":\"#across-tasks\",\"depth\":2},{\"value\":\"Environment Variables Per Task\",\"url\":\"#environment-variables-per-task\",\"depth\":2},{\"value\":\"Read More\",\"url\":\"#read-more\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Environment Variables with Ansible\",\"datePublished\":\"2020-01-24T17:28:16.000Z\",\"dateModified\":\"2020-01-24T17:28:16.000Z\",\"description\":\"This ansible tutorial shows how to work with environment variables in ansible.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2020/01/24/environment-variables-with-ansible\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Setup a WireGuard VPN Server on Linux\",\"date\":\"2020-01-11T21:37:03.000Z\",\"tags\":[\"vpn\",\"linux\",\"networking\"],\"draft\":false,\"summary\":\"Setup a WireGuard VPN Server on Linux\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"2 min read\",\"minutes\":1.97,\"time\":118200,\"words\":394},\"slug\":\"2020/01/11/setup-a-wireguard-vpn-server-on-linux\",\"path\":\"blog/2020/01/11/setup-a-wireguard-vpn-server-on-linux\",\"filePath\":\"blog/2020/01/11/setup-a-wireguard-vpn-server-on-linux.mdx\",\"toc\":[{\"value\":\"Installation\",\"url\":\"#installation\",\"depth\":2},{\"value\":\"Configuration\",\"url\":\"#configuration\",\"depth\":2},{\"value\":\"Start the Server\",\"url\":\"#start-the-server\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Setup a WireGuard VPN Server on Linux\",\"datePublished\":\"2020-01-11T21:37:03.000Z\",\"dateModified\":\"2020-01-11T21:37:03.000Z\",\"description\":\"Setup a WireGuard VPN Server on Linux\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2020/01/11/setup-a-wireguard-vpn-server-on-linux\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}}
1,{\"title\":\"Managing Background Processes with Screen\",\"date\":\"2020-01-02T08:42:54.000Z\",\"tags\":[\"linux\",\"screen\"],\"draft\":false,\"summary\":\"This tutorial will demonstrate how to manage background processes with screen.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"2 min read\",\"minutes\":1.61,\"time\":96600,\"words\":322},\"slug\":\"2020/01/02/managing-background-processes-with-screen\",\"path\":\"blog/2020/01/02/managing-background-processes-with-screen\",\"filePath\":\"blog/2020/01/02/managing-background-processes-with-screen.mdx\",\"toc\":[{\"value\":\"About\",\"url\":\"#about\",\"depth\":2},{\"value\":\"Install\",\"url\":\"#install\",\"depth\":2},{\"value\":\"Working with Screen\",\"url\":\"#working-with-screen\",\"depth\":2},{\"value\":\"Scripting\",\"url\":\"#scripting\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Managing Background Processes with Screen\",\"datePublished\":\"2020-01-02T08:42:54.000Z\",\"dateModified\":\"2020-01-02T08:42:54.000Z\",\"description\":\"This tutorial will demonstrate how to manage background processes with screen.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2020/01/02/managing-background-processes-with-screen\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"2019: My personal highlights for the year\",\"date\":\"2020-01-01T10:23:08.000Z\",\"tags\":[\"year-in-review\"],\"draft\":false,\"summary\":\"2019: My personal highlights for the year\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"5 min read\",\"minutes\":4.185,\"time\":251100,\"words\":837},\"slug\":\"2020/01/01/2019-my-personal-highlights-for-the-year\",\"path\":\"blog/2020/01/01/2019-my-personal-highlights-for-the-year\",\"filePath\":\"blog/2020/01/01/2019-my-personal-highlights-for-the-year.mdx\",\"toc\":[{\"value\":\"Number of Blogposts per Website:\",\"url\":\"#number-of-blogposts-per-website\",\"depth\":2},{\"value\":\"Learnings\",\"url\":\"#learnings\",\"depth\":2},{\"value\":\"Contributions on Github\",\"url\":\"#contributions-on-github\",\"depth\":2},{\"value\":\"Analytics\",\"url\":\"#analytics\",\"depth\":2},{\"value\":\"ruan.dev\",\"url\":\"#ruandev\",\"depth\":3},{\"value\":\"sysadmins.co.za\",\"url\":\"#sysadminscoza\",\"depth\":4},{\"value\":\"Authors on Blogposts:\",\"url\":\"#authors-on-blogposts\",\"depth\":2},{\"value\":\"Proud Moments\",\"url\":\"#proud-moments\",\"depth\":2},{\"value\":\"2019.06.11 - Scaleway Tweet on Kapsule\",\"url\":\"#20190611---scaleway-tweet-on-kapsule\",\"depth\":4},{\"value\":\"2019.06.11 - Traefik Tweet on Kubernetes\",\"url\":\"#20190611---traefik-tweet-on-kubernetes\",\"depth\":4},{\"value\":\"2019.07.13 - Mention from OpenFaas on VSCode Demo\",\"url\":\"#20190713---mention-from-openfaas-on-vscode-demo\",\"depth\":4},{\"value\":\"2019.07.14 - Elasticsearch Tweet from Devconnected\",\"url\":\"#20190714---elasticsearch-tweet-from-devconnected\",\"depth\":4},{\"value\":\"2019.08.14 - Rancher's Tweet on my Rpi K3s Blogpost\",\"url\":\"#20190814---ranchers-tweet-on-my-rpi-k3s-blogpost\",\"depth\":4},{\"value\":\"2019.08.19 - Civo Learn Guide\",\"url\":\"#20190819---civo-learn-guide\",\"depth\":4},{\"value\":\"2019.10.09 - Civo Marketplace MongoDB\",\"url\":\"#20191009---civo-marketplace-mongodb\",\"depth\":4},{\"value\":\"2019.10.23 - Civo Marketplace Jenkins\",\"url\":\"#20191023---civo-marketplace-jenkins\",\"depth\":4},{\"value\":\"2019.11.05 - Traefik Swag\",\"url\":\"#20191105---traefik-swag\",\"depth\":4},{\"value\":\"2019.11.14 - Mentions on Civo Blog for KUBE100\",\"url\":\"#20191114---mentions-on-civo-blog-for-kube100\",\"depth\":4},{\"value\":\"2019.08.06 - VPNCloud Peer to Peer Docs\",\"url\":\"#20190806---vpncloud-peer-to-peer-docs\",\"depth\":4},{\"value\":\"2019.08.06 - MarkHeath Blog Post Mention\",\"url\":\"#20190806---markheath-blog-post-mention\",\"depth\":4},{\"value\":\"2019.08.08 - Civo Docker Swarm Blogpost\",\"url\":\"#20190808---civo-docker-swarm-blogpost\",\"depth\":4},{\"value\":\"2019.08.13 - Raspberry Pi Post (teamserverless)\",\"url\":\"#20190813---raspberry-pi-post-teamserverless\",\"depth\":4},{\"value\":\"2019.10.11 - Serverless Email - Migration OpenFaas Blog post:\",\"url\":\"#20191011---serverless-email---migration-openfaas-blog-post\",\"depth\":4},{\"value\":\"Certifications:\",\"url\":\"#certifications\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"2019: My personal highlights for the year\",\"datePublished\":\"2020-01-01T10:23:08.000Z\",\"dateModified\":\"2020-01-01T10:23:08.000Z\",\"description\":\"2019: My personal highlights for the year\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2020/01/01/2019-my-pers
1onal-highlights-for-the-year\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Setting the Correct Service Name in Datadog Logging for Docker Swarm\",\"date\":\"2019-12-11T21:35:53.000Z\",\"tags\":[\"datadog\",\"docker\",\"swarm\",\"logging\"],\"draft\":false,\"summary\":\"Setting the Correct Service Name in Datadog Logging for Docker Swarm\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"2 min read\",\"minutes\":1.54,\"time\":92400,\"words\":308},\"slug\":\"2019/12/11/setting-the-correct-service-name-in-datadog-logging-for-docker-swarm\",\"path\":\"blog/2019/12/11/setting-the-correct-service-name-in-datadog-logging-for-docker-swarm\",\"filePath\":\"blog/2019/12/11/setting-the-correct-service-name-in-datadog-logging-for-docker-swarm.mdx\",\"toc\":[{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Setting the Correct Service Name in Datadog Logging for Docker Swarm\",\"datePublished\":\"2019-12-11T21:35:53.000Z\",\"dateModified\":\"2019-12-11T21:35:53.000Z\",\"description\":\"Setting the Correct Service Name in Datadog Logging for Docker Swarm\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2019/12/11/setting-the-correct-service-name-in-datadog-logging-for-docker-swarm\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Setup AWS S3 Cross Account Access\",\"date\":\"2019-11-26T20:40:12.000Z\",\"tags\":[\"aws\",\"s3\",\"iam\"],\"draft\":false,\"summary\":\"In this tutorial we will setup AWS S3 Cross Account Access between Two AWS Accounts\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"4 min read\",\"minutes\":3.56,\"time\":213600,\"words\":712},\"slug\":\"2019/11/26/setup-aws-s3-cross-account-access\",\"path\":\"blog/2019/11/26/setup-aws-s3-cross-account-access\",\"filePath\":\"blog/2019/11/26/setup-aws-s3-cross-account-access.mdx\",\"toc\":[{\"value\":\"Scenario\",\"url\":\"#scenario\",\"depth\":2},{\"value\":\"Setup the Blue Account\",\"url\":\"#setup-the-blue-account\",\"depth\":2},{\"value\":\"Setup the Green Account\",\"url\":\"#setup-the-green-account\",\"depth\":2},{\"value\":\"Test Cross Account Access\",\"url\":\"#test-cross-account-access\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Setup AWS S3 Cross Account Access\",\"datePublished\":\"2019-11-26T20:40:12.000Z\",\"dateModified\":\"2019-11-26T20:40:12.000Z\",\"description\":\"In this tutorial we will setup AWS S3 Cross Account Access between Two AWS Accounts\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2019/11/26/setup-aws-s3-cross-account-access\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"How to Setup VPC Peering on AWS\",\"date\":\"2019-11-23T07:09:40.000Z\",\"tags\":[\"aws\",\"networks\",\"vpc\"],\"draft\":false,\"summary\":\"I will demonstrate how to create a VPC Peering Connection between Two AWS Accounts and how to route traffic between them\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"8 min read\",\"minutes\":7.64,\"time\":458400,\"words\":1528},\"slug\":\"2019/11/23/how-to-setup-vpc-peering-on-aws\",\"path\":\"blog/2019/11/23/how-to-setup-vpc-peering-on-aws\",\"filePath\":\"blog/2019/11/23/how-to-setup-vpc-peering-on-aws.mdx\",\"toc\":[{\"value\":\"Scenario Information\",\"url\":\"#scenario-information\",\"depth\":2},{\"value\":\"Getting Started\",\"url\":\"#getting-started\",\"depth\":2},{\"value\":\"Creating the VPCs\",\"url\":\"#creating-the-vpcs\",\"depth\":2},{\"value\":\"Creating the Subnets\",\"url\":\"#creating-the-subnets\",\"depth\":2},{\"value\":\"Setup VPC Peering Connection\",\"url\":\"#setup-vpc-peering-connection\",\"depth\":2},{\"value\":\"Setup Internet Gateway\",\"url\":\"#setup-internet-gateway\",\"depth\":2},{\"value\":\"Configure Routing Table\",\"url\":\"#configure-routing-table\",\"depth\":2},{\"value\":\"Launch EC2 Instances\",\"url\":\"#launch-ec2-instances\",\"depth\":2},{\"value\":\"Public IP Addressing\",\"url\":\"#public-ip-addressing\",\"depth\":2},{\"value\":\"Test Network Connectivity\",\"url\":\"#test-network-connectivity\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"How to Setup VPC Peering on AWS\",\"datePublished\":\"2019-11-23T07:09:40.000Z\",\"dateModified\":\"2019-11-23T07:09:40.000Z\",\"description\":\"I will demonstrate how to create a VPC Peering Connection between Two AWS Accounts and how to route traffic between them\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2019/11/23/how-to-setup-vpc-
1peering-on-aws\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"How To Deploy a Webapp on a AWS EKS Kubernetes Cluster\",\"date\":\"2019-11-16T22:21:19.000Z\",\"tags\":[\"aws\",\"eks\",\"kubernetes\",\"docker\"],\"draft\":false,\"summary\":\"Now that we have our EKS cluster running, let's deploy a web application to our Kubernetes Cluster\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"4 min read\",\"minutes\":3.415,\"time\":204900,\"words\":683},\"slug\":\"2019/11/17/how-to-deploy-a-webapp-on-a-aws-eks-kubernetes-cluster\",\"path\":\"blog/2019/11/17/how-to-deploy-a-webapp-on-a-aws-eks-kubernetes-cluster\",\"filePath\":\"blog/2019/11/17/how-to-deploy-a-webapp-on-a-aws-eks-kubernetes-cluster.mdx\",\"toc\":[{\"value\":\"What are we doing today\",\"url\":\"#what-are-we-doing-today\",\"depth\":2},{\"value\":\"Deployment Manifests\",\"url\":\"#deployment-manifests\",\"depth\":2},{\"value\":\"Deployment Time\",\"url\":\"#deployment-time\",\"depth\":2},{\"value\":\"Scaling our Deployment\",\"url\":\"#scaling-our-deployment\",\"depth\":2},{\"value\":\"Further Reading on Kubernetes\",\"url\":\"#further-reading-on-kubernetes\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"How To Deploy a Webapp on a AWS EKS Kubernetes Cluster\",\"datePublished\":\"2019-11-16T22:21:19.000Z\",\"dateModified\":\"2019-11-16T22:21:19.000Z\",\"description\":\"Now that we have our EKS cluster running, let's deploy a web application to our Kubernetes Cluster\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2019/11/17/how-to-deploy-a-webapp-on-a-aws-eks-kubernetes-cluster\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"How To Setup a AWS EKS Kubernetes Cluster\",\"date\":\"2019-11-16T20:31:36.000Z\",\"tags\":[\"aws\",\"kubernetes\",\"eks\",\"devops\"],\"draft\":false,\"summary\":\"How to deploy a Kubernetes Cluster on Amazon Web Services with their EKS offering\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"9 min read\",\"minutes\":8.465,\"time\":507900,\"words\":1693},\"slug\":\"2019/11/16/how-to-setup-a-aws-eks-kubernetes-cluster\",\"path\":\"blog/2019/11/16/how-to-setup-a-aws-eks-kubernetes-cluster\",\"filePath\":\"blog/2019/11/16/how-to-setup-a-aws-eks-kubernetes-cluster.mdx\",\"toc\":[{\"value\":\"And then came EKS\",\"url\":\"#and-then-came-eks\",\"depth\":2},{\"value\":\"What are we doing today\",\"url\":\"#what-are-we-doing-today\",\"depth\":2},{\"value\":\"Install Pre-Requirements\",\"url\":\"#install-pre-requirements\",\"depth\":2},{\"value\":\"Deploy EKS\",\"url\":\"#deploy-eks\",\"depth\":2},{\"value\":\"View the Provisioned Resources\",\"url\":\"#view-the-provisioned-resources\",\"depth\":2},{\"value\":\"Navigate using Kubectl:\",\"url\":\"#navigate-using-kubectl\",\"depth\":2},{\"value\":\"Testing the ASG\",\"url\":\"#testing-the-asg\",\"depth\":2},{\"value\":\"Run a Pod\",\"url\":\"#run-a-pod\",\"depth\":2},{\"value\":\"Scaling Nodes\",\"url\":\"#scaling-nodes\",\"depth\":2},{\"value\":\"Clean Up\",\"url\":\"#clean-up\",\"depth\":2},{\"value\":\"Further Reading on Kubernetes\",\"url\":\"#further-reading-on-kubernetes\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"How To Setup a AWS EKS Kubernetes Cluster\",\"datePublished\":\"2019-11-16T20:31:36.000Z\",\"dateModified\":\"2019-11-16T20:31:36.000Z\",\"description\":\"How to deploy a Kubernetes Cluster on Amazon Web Services with their EKS offering\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2019/11/16/how-to-setup-a-aws-eks-kubernetes-cluster\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Testing AWS Lambda Functions Locally on Docker with LambCi\",\"date\":\"2019-11-14T21:57:10.000Z\",\"tags\":[\"docker\",\"aws\",\"lambda\"],\"draft\":false,\"summary\":\"Testing AWS Lambda Functions Locally on Docker with LambCi\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"2 min read\",\"minutes\":1.39,\"time\":83400,\"words\":278},\"slug\":\"2019/11/14/testing-aws-lambda-functions-locally-on-docker-with-lambci\",\"path\":\"blog/2019/11/14/testing-aws-lambda-functions-locally-on-docker-with-lambci\",\"filePath\":\"blog/2019/11/14/testing-aws-lambda-functions-locally-on-docker-with-lambci.mdx\",\"toc\":[{\"value\":\"Python Lambda Function\",\"url\":\"#python-lambda-function\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Testing AWS Lambda Functions Locally on Docker with LambCi\",\"datePublished\":\"2019-11-14T21:57:10.000Z\",\"dateModified\":\"2019-11-14T21:57:10.000Z\",\"description\":\"Testing AWS Lambda Functions Locally on Docker with LambCi\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2019/11/14/testing-aws-lambda-functions-locally-on-docker-with-lambci\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Integrating Google OAuth with Traefik\",\"date\":\"2019-11-10T18:03:06.000Z\",\"tags\":[\"traefik\",\"google\",\"authentication\",\"ext-posts\"],\"draft\":false,\"summary\":\"This tutorial will demonstrate how to integrate Google OAuth with Traefik.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"1 min read\",\"minutes\":0.965,\"time\":57900,\"words\":193},\"slug\":\"2019/11/10/integrating-google-oauth-with-traefik\",\"path\":\"blog/2019/11/10/integrating-google-oauth-with-traefik\",\"filePath\":\"blog/2019/11/10/integrating-google-oauth-with-traefik.mdx\",\"toc\":[{\"value\":\"What are we doing today\",\"url\":\"#what-are-we-doing-today\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Integrating Google OAuth with Traefik\",\"datePublished\":\"2019-11-10T18:03:06.000Z\",\"dateModified\":\"2019-11-10T18:03:06.000Z\",\"description\":\"This tutorial will demonstrate how to integrate Google OAuth with Traefik.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2019/11/10/integrating-google-oauth-with-traefik\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Running VS Code in your Browser with Docker\",\"date\":\"2019-09-14T10:56:05.000Z\",\"tags\":[\"vscode\",\"docker\"],\"draft\":false,\"summary\":\"This tutorial shows how you can run VSCode in your Browser with Docker.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"2 min read\",\"minutes\":1.42,\"time\":85200,\"words\":284},\"slug\":\"2019/09/14/running-vs-code-in-your-browser-with-docker\",\"path\":\"blog/2019/09/14/running-vs-code-in-your-browser-with-docker\",\"filePath\":\"blog/2019/09/14/running-vs-code-in-your-browser-with-docker.mdx\",\"toc\":[{\"value\":\"VSCode in Docker\",\"url\":\"#vscode-in-docker\",\"depth\":2},{\"value\":\"Different versions\",\"url\":\"#different-versions\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Running VS Code in your Browser with Docker\",\"datePublished\":\"2019-09-14T10:56:05.000Z\",\"dateModified\":\"2019-09-14T10:56:05.000Z\",\"description\":\"This tutorial shows how you can run VSCode in your Browser with Docker.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2019/09/14/running-vs-code-in-your-browser-with-docker\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}}
1,{\"title\":\"Expire Objects in AWS S3 Automatically after 30 Days\",\"date\":\"2019-09-12T20:37:11.000Z\",\"tags\":[\"aws\",\"s3\",\"storage\"],\"draft\":false,\"summary\":\"This tutorial shows you how to expire objects in AWS S3 automatically after 30 days.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"2 min read\",\"minutes\":1.225,\"time\":73500,\"words\":245},\"slug\":\"2019/09/12/expire-objects-in-aws-s3-automatically-after-30-days\",\"path\":\"blog/2019/09/12/expire-objects-in-aws-s3-automatically-after-30-days\",\"filePath\":\"blog/2019/09/12/expire-objects-in-aws-s3-automatically-after-30-days.mdx\",\"toc\":[{\"value\":\"Navigate to your Bucket\",\"url\":\"#navigate-to-your-bucket\",\"depth\":2},{\"value\":\"Lifecycle Policies\",\"url\":\"#lifecycle-policies\",\"depth\":2},{\"value\":\"Housecleaning on your S3 Bucket\",\"url\":\"#housecleaning-on-your-s3-bucket\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Expire Objects in AWS S3 Automatically after 30 Days\",\"datePublished\":\"2019-09-12T20:37:11.000Z\",\"dateModified\":\"2019-09-12T20:37:11.000Z\",\"description\":\"This tutorial shows you how to expire objects in AWS S3 automatically after 30 days.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2019/09/12/expire-objects-in-aws-s3-automatically-after-30-days\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Reindex Elasticsearch Indices with Logstash\",\"date\":\"2019-09-08T11:00:59.000Z\",\"tags\":[\"elasticsearch\",\"logstash\"],\"draft\":false,\"summary\":\"How to reindex Elasticsearch indices with Logstash\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"3 min read\",\"minutes\":2.865,\"time\":171900,\"words\":573},\"slug\":\"2019/09/08/reindex-elasticsearch-indices-with-logstash\",\"path\":\"blog/2019/09/08/reindex-elasticsearch-indices-with-logstash\",\"filePath\":\"blog/2019/09/08/reindex-elasticsearch-indices-with-logstash.mdx\",\"toc\":[{\"value\":\"Use Case\",\"url\":\"#use-case\",\"depth\":2},{\"value\":\"Overview of our Setup\",\"url\":\"#overview-of-our-setup\",\"depth\":2},{\"value\":\"Logstash Configuration\",\"url\":\"#logstash-configuration\",\"depth\":2},{\"value\":\"Reindex the Data\",\"url\":\"#reindex-the-data\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Reindex Elasticsearch Indices with Logstash\",\"datePublished\":\"2019-09-08T11:00:59.000Z\",\"dateModified\":\"2019-09-08T11:00:59.000Z\",\"description\":\"How to reindex Elasticsearch indices with Logstash\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2019/09/08/reindex-elasticsearch-indices-with-logstash\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Deploy a Monitoring Stack on Docker Swarm with Grafana and Prometheus\",\"date\":\"2019-09-04T22:07:52.000Z\",\"tags\":[\"prometheus\",\"grafana\",\"docker\",\"swarm\",\"monitoring\"],\"draft\":false,\"summary\":\"Deploy a Monitoring Stack on Docker Swarm with Grafana and Prometheus\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"4 min read\",\"minutes\":3.06,\"time\":183600,\"words\":612},\"slug\":\"2019/09/05/deploy-a-monitoring-stack-on-docker-swarm-with-grafana-and-prometheus\",\"path\":\"blog/2019/09/05/deploy-a-monitoring-stack-on-docker-swarm-with-grafana-and-prometheus\",\"filePath\":\"blog/2019/09/05/deploy-a-monitoring-stack-on-docker-swarm-with-grafana-and-prometheus.mdx\",\"toc\":[{\"value\":\"What you will get out of this\",\"url\":\"#what-you-will-get-out-of-this\",\"depth\":2},{\"value\":\"Deploy Traefik\",\"url\":\"#deploy-traefik\",\"depth\":2},{\"value\":\"Deploy the Monitoring Stack\",\"url\":\"#deploy-the-monitoring-stack\",\"depth\":2},{\"value\":\"Accessing Grafana\",\"url\":\"#accessing-grafana\",\"depth\":2},{\"value\":\"Exploring Metrics in Prometheus\",\"url\":\"#exploring-metrics-in-prometheus\",\"depth\":2},{\"value\":\"Resources\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Deploy a Monitoring Stack on Docker Swarm with Grafana and Prometheus\",\"datePublished\":\"2019-09-04T22:07:52.000Z\",\"dateModified\":\"2019-09-04T22:07:52.000Z\",\"description\":\"Deploy a Monitoring Stack on Docker Swarm with Grafana and Prometheus\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2019/09/05/deploy-a-monitoring-stack-on-docker-swarm-with-grafana-and-prometheus\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Deploy Traefik using Bekker Stacks\",\"date\":\"2019-09-04T19:46:35.000Z\",\"tags\":[\"traefik\",\"docker\",\"swarm\"],\"draft\":false,\"summary\":\"Deploy Traefik using Bekker Stacks\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"4 min read\",\"minutes\":3.95,\"time\":237000,\"words\":790},\"slug\":\"2019/09/04/deploy-traefik-using-bekker-stacks\",\"path\":\"blog/2019/09/04/deploy-traefik-using-bekker-stacks\",\"filePath\":\"blog/2019/09/04/deploy-traefik-using-bekker-stacks.mdx\",\"toc\":[{\"value\":\"The Main Idea\",\"url\":\"#the-main-idea\",\"depth\":2},{\"value\":\"Future Ideas\",\"url\":\"#future-ideas\",\"depth\":2},{\"value\":\"What are we doing today\",\"url\":\"#what-are-we-doing-today\",\"depth\":2},{\"value\":\"Local Dev\",\"url\":\"#local-dev\",\"depth\":2},{\"value\":\"Deploy Traefik\",\"url\":\"#deploy-traefik\",\"depth\":2},{\"value\":\"Deploy Traefik in HTTP Mode\",\"url\":\"#deploy-traefik-in-http-mode\",\"depth\":2},{\"value\":\"More Info\",\"url\":\"#more-info\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Deploy Traefik using Bekker Stacks\",\"datePublished\":\"2019-09-04T19:46:35.000Z\",\"dateModified\":\"2019-09-04T19:46:35.000Z\",\"description\":\"Deploy Traefik using Bekker Stacks\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2019/09/04/deploy-traefik-using-bekker-stacks\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"AWS S3 KMS and Python for Secrets Management\",\"date\":\"2019-09-04T17:58:45.000Z\",\"tags\":[\"aws\",\"s3\",\"kms\",\"python\"],\"draft\":false,\"summary\":\"AWS S3 KMS and Python for Secrets Management\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"6 min read\",\"minutes\":5.6,\"time\":336000,\"words\":1120},\"slug\":\"2019/09/04/aws-s3-kms-and-python-for-secrets-management\",\"path\":\"blog/2019/09/04/aws-s3-kms-and-python-for-secrets-management\",\"filePath\":\"blog/2019/09/04/aws-s3-kms-and-python-for-secrets-management.mdx\",\"toc\":[{\"value\":\"High Level Goal\",\"url\":\"#high-level-goal\",\"depth\":2},{\"value\":\"Requirements\",\"url\":\"#requirements\",\"depth\":2},{\"value\":\"Provision AWS Resources\",\"url\":\"#provision-aws-resources\",\"depth\":2},{\"value\":\"Create a IAM Policy for our App User\",\"url\":\"#create-a-iam-policy-for-our-app-user\",\"depth\":2},{\"value\":\"Encrypt and Put to S3\",\"url\":\"#encrypt-and-put-to-s3\",\"depth\":2},{\"value\":\"Using it in a Application\",\"url\":\"#using-it-in-a-application\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"AWS S3 KMS and Python for Secrets Management\",\"datePublished\":\"2019-09-04T17:58:45.000Z\",\"dateModified\":\"2019-09-04T17:58:45.000Z\",\"description\":\"AWS S3 KMS and Python for Secrets Management\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2019/09/04/aws-s3-kms-and-python-for-secrets-management\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Making deploying functions even easier with faas-cl
1i up using OpenFaaS\",\"date\":\"2019-07-07T07:53:59.000Z\",\"tags\":[\"openfaas\",\"python\",\"serverless\"],\"draft\":false,\"summary\":\"Making deploying functions even easier with faas-cli up using OpenFaaS\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"3 min read\",\"minutes\":2.16,\"time\":129600,\"words\":432},\"slug\":\"2019/07/07/making-deploying-functions-even-easier-with-faas-cli-up-using-openfaas\",\"path\":\"blog/2019/07/07/making-deploying-functions-even-easier-with-faas-cli-up-using-openfaas\",\"filePath\":\"blog/2019/07/07/making-deploying-functions-even-easier-with-faas-cli-up-using-openfaas.mdx\",\"toc\":[{\"value\":\"The way I always did it:\",\"url\":\"#the-way-i-always-did-it\",\"depth\":2},{\"value\":\"The new discovered way\",\"url\":\"#the-new-discovered-way\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Making deploying functions even easier with faas-cli up using OpenFaaS\",\"datePublished\":\"2019-07-07T07:53:59.000Z\",\"dateModified\":\"2019-07-07T07:53:59.000Z\",\"description\":\"Making deploying functions even easier with faas-cli up using OpenFaaS\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2019/07/07/making-deploying-functions-even-easier-with-faas-cli-up-using-openfaas\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Using OpenFaas with Amazon DynamoDB\",\"date\":\"2019-07-06T23:11:23.000Z\",\"tags\":[\"openfaas\",\"aws\",\"dynamodb\",\"serverless\"],\"draft\":false,\"summary\":\"This tutorial will demonstrate how to use OpenFaas with Amazon DynamoDB.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"12 min read\",\"minutes\":11.67,\"time\":700200,\"words\":2334},\"slug\":\"2019/07/06/using-openfaas-with-amazon-dynamodb\",\"path\":\"blog/2019/07/06/using-openfaas-with-amazon-dynamodb\",\"filePath\":\"blog/2019/07/06/using-openfaas-with-amazon-dynamodb.mdx\",\"toc\":[{\"value\":\"Using OpenFaaS with Amazon DynamoDB\",\"url\":\"#using-openfaas-with-amazon-dynamodb\",\"depth\":1},{\"value\":\"What we will be doing in this Tutorial\",\"url\":\"#what-we-will-be-doing-in-this-tutorial\",\"depth\":2},{\"value\":\"The Use-Case Scenario\",\"url\":\"#the-use-case-scenario\",\"depth\":2},{\"value\":\"Note on Secrets and Environment Variables\",\"url\":\"#note-on-secrets-and-environment-variables\",\"depth\":2},{\"value\":\"Pre-Requirements:\",\"url\":\"#pre-requirements\",\"depth\":2},{\"value\":\"Provision a DynamoDB Table\",\"url\":\"#provision-a-dynamodb-table\",\"depth\":2},{\"value\":\"Create the OpenFaaS IAM User\",\"url\":\"#create-the-openfaas-iam-user\",\"depth\":2},{\"value\":\"Create OpenFaaS Secrets\",\"url\":\"#create-openfaas-secrets\",\"depth\":3},{\"value\":\"Login to OpenFaaS\",\"url\":\"#login-to-openfaas\",\"depth\":2},{\"value\":\"One Stack File for All 3 Functions:\",\"url\":\"#one-stack-file-for-all-3-functions\",\"depth\":2},{\"value\":\"Create the Lookup Function:\",\"url\":\"#create-the-lookup-function\",\"depth\":2},{\"value\":\"Create the Write Function:\",\"url\":\"#create-the-write-function\",\"depth\":2},{\"value\":\"Create the Get Function:\",\"url\":\"#create-the-get-function\",\"depth\":2},{\"value\":\"Build, Push and Deploy:\",\"url\":\"#build-push-and-deploy\",\"depth\":2},{\"value\":\"Time for our Functions to interact with DynamoDB:\",\"url\":\"#time-for-our-functions-to-interact-with-dynamodb\",\"depth\":2},{\"value\":\"Thanks\",\"url\":\"#thanks\",\"depth\":2},{\"value\":\"Resources:\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Using OpenFaas with Amazon DynamoDB\",\"datePublished\":\"2019-07-06T23:11:23.000Z\",\"dateModified\":\"2019-07-06T23:11:23.000Z\",\"description\":\"This tutorial will demonstrate how to use OpenFaas with Amazon DynamoDB.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2019/07/06/using-openfaas-with-amazon-dynamodb\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Using OpenFaas with Amazon DynamoDB\",\"date\":\"2019-07-06T00:00:00.000Z\",\"tags\":[\"openfaas\",\"aws\"],\"draft\":false,\"summary\":\"Using OpenFaas with AWS DynamoDB\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"12 min read\",\"minutes\":11.33,\"time\":679800,\"words\":2266}
1,\"slug\":\"2019/07/06/2019-07-06-using-openfaas-with-amazon-dynamodb\",\"path\":\"blog/2019/07/06/2019-07-06-using-openfaas-with-amazon-dynamodb\",\"filePath\":\"blog/2019/07/06/2019-07-06-using-openfaas-with-amazon-dynamodb.mdx\",\"toc\":[{\"value\":\"Using OpenFaaS with Amazon DynamoDB\",\"url\":\"#using-openfaas-with-amazon-dynamodb\",\"depth\":1},{\"value\":\"What we will be doing in this Tutorial\",\"url\":\"#what-we-will-be-doing-in-this-tutorial\",\"depth\":2},{\"value\":\"The Use-Case Scenario\",\"url\":\"#the-use-case-scenario\",\"depth\":2},{\"value\":\"Note on Secrets and Environment Variables\",\"url\":\"#note-on-secrets-and-environment-variables\",\"depth\":2},{\"value\":\"Pre-Requirements:\",\"url\":\"#pre-requirements\",\"depth\":2},{\"value\":\"Provision a DynamoDB Table\",\"url\":\"#provision-a-dynamodb-table\",\"depth\":2},{\"value\":\"Create the OpenFaaS IAM User\",\"url\":\"#create-the-openfaas-iam-user\",\"depth\":2},{\"value\":\"Create OpenFaaS Secrets\",\"url\":\"#create-openfaas-secrets\",\"depth\":3},{\"value\":\"Login to OpenFaaS\",\"url\":\"#login-to-openfaas\",\"depth\":2},{\"value\":\"One Stack File for All 3 Functions:\",\"url\":\"#one-stack-file-for-all-3-functions\",\"depth\":2},{\"value\":\"Create the Lookup Function:\",\"url\":\"#create-the-lookup-function\",\"depth\":2},{\"value\":\"Create the Write Function:\",\"url\":\"#create-the-write-function\",\"depth\":2},{\"value\":\"Create the Get Function:\",\"url\":\"#create-the-get-function\",\"depth\":2},{\"value\":\"Build, Push and Deploy:\",\"url\":\"#build-push-and-deploy\",\"depth\":2},{\"value\":\"Time for our Functions to interact with DynamoDB:\",\"url\":\"#time-for-our-functions-to-interact-with-dynamodb\",\"depth\":2},{\"value\":\"Thanks\",\"url\":\"#thanks\",\"depth\":2},{\"value\":\"Resources:\",\"url\":\"#resources\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Using OpenFaas with Amazon DynamoDB\",\"datePublished\":\"2019-07-06T00:00:00.000Z\",\"dateModified\":\"2019-07-06T00:00:00.000Z\",\"description\":\"Using OpenFaas with AWS DynamoDB\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2019/07/06/2019-07-06-using-openfaas-with-amazon-dynamodb\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Play with Kinesis Data Streams for Free\",\"date\":\"2019-06-22T21:35:19.000Z\",\"tags\":[\"kinesis\",\"streaming\",\"aws\",\"amazon\",\"python\"],\"draft\":false,\"summary\":\"Play with Kinesis Data Streams for Free\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"7 min read\",\"minutes\":6.355,\"time\":381300,\"words\":1271},\"slug\":\"2019/06/22/play-with-kinesis-data-streams-for-free\",\"path\":\"blog/2019/06/22/play-with-kinesis-data-streams-for-free\",\"filePath\":\"blog/2019/06/22/play-with-kinesis-data-streams-for-free.mdx\",\"toc\":[{\"value\":\"What will we be doing?\",\"url\":\"#what-will-we-be-doing\",\"depth\":2},{\"value\":\"Building Kinesis Local on Docker\",\"url\":\"#building-kinesis-local-on-docker\",\"depth\":2},{\"value\":\"Interact with Kinesis Local:\",\"url\":\"#interact-with-kinesis-local\",\"depth\":2},{\"value\":\"Our Kinesis Producer\",\"url\":\"#our-kinesis-producer\",\"depth\":2},{\"value\":\"Our Kinesis Local Consumer:\",\"url\":\"#our-kinesis-local-consumer\",\"depth\":2},{\"value\":\"Demo Time!\",\"url\":\"#demo-time\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Play with Kinesis Data Streams for Free\",\"datePublished\":\"2019-06-22T21:35:19.000Z\",\"dateModified\":\"2019-06-22T21:35:19.000Z\",\"description\":\"Play with Kinesis Data Streams for Free\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2019/06/22/play-with-kinesis-data-streams-for-free\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Setup Traefik as an Ingress Controller on Kubernetes\",\"date\":\"2019-06-10T20:21:36.000Z\",\"tags\":[\"scaleway\",\"traefik\",\"kubernetes\",\"devops\"],\"draft\":false,\"summary\":\"This tutorial will show you how to setup Traefik as an Ingress Controller on Kubernetes.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"4 min read\",\"minutes\":3.875,\"time\":232500,\"words\":775},\"slug\":\"2019/06/10/setup-traefik-as-an-ingress-controller-on-kubernetes\",\"path\":\"blog/2019/06/10/setup-traefik-as-an-ingress-controller-on-kubernetes\",\"filePath\":\"blog/2019/06/10/setup-traefik-as-an-ingress-controller-on-kubernetes.mdx\",\"toc\":[{\"value\":\"What will we be doing\",\"url\":\"#what-will-we-be-doing\",\"depth\":2},{\"value\":\"Get the sources\",\"url\":\"#get-the-sources\",\"depth\":2},{\"value\":\"Provision Traefik as an Ingress Controller\",\"url\":\"#provision-traefik-as-an-ingress-controller\",\"depth\":2},{\"value\":\"Deploy the Logo App to the Cluster\",\"url\":\"#deploy-the-logo-app-to-the-cluster\",\"depth\":2},{\"value\":\"Navigating with Kubectl\",\"url\":\"#navigating-with-kubectl\",\"depth\":2}
1,{\"value\":\"Access your Applications\",\"url\":\"#access-your-applications\",\"depth\":2},{\"value\":\"Resources\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Setup Traefik as an Ingress Controller on Kubernetes\",\"datePublished\":\"2019-06-10T20:21:36.000Z\",\"dateModified\":\"2019-06-10T20:21:36.000Z\",\"description\":\"This tutorial will show you how to setup Traefik as an Ingress Controller on Kubernetes.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2019/06/10/setup-traefik-as-an-ingress-controller-on-kubernetes\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Testing out Scaleways Kapsule their Kubernetes as a Service offering\",\"date\":\"2019-06-10T16:28:45.000Z\",\"tags\":[\"kubernetes\",\"scaleway\",\"kapsule\",\"devops\"],\"draft\":false,\"summary\":\"Testing out Scaleways Kapsule their Kubernetes as a Service offering\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"3 min read\",\"minutes\":2.1,\"time\":126000,\"words\":420},\"slug\":\"2019/06/10/testing-out-scaleways-kapsule-their-kubernetes-as-a-service-offering\",\"path\":\"blog/2019/06/10/testing-out-scaleways-kapsule-their-kubernetes-as-a-service-offering\",\"filePath\":\"blog/2019/06/10/testing-out-scaleways-kapsule-their-kubernetes-as-a-service-offering.mdx\",\"toc\":[{\"value\":\"What are we doing today?\",\"url\":\"#what-are-we-doing-today\",\"depth\":2},{\"value\":\"Provision a Kapsule Cluster\",\"url\":\"#provision-a-kapsule-cluster\",\"depth\":2},{\"value\":\"Interact with your Cluster\",\"url\":\"#interact-with-your-cluster\",\"depth\":2},{\"value\":\"Add more nodes:\",\"url\":\"#add-more-nodes\",\"depth\":2},{\"value\":\"Master / Node Capabilities\",\"url\":\"#master--node-capabilities\",\"depth\":2},{\"value\":\"Well Done Scaleway\",\"url\":\"#well-done-scaleway\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Testing out Scaleways Kapsule their Kubernetes as a Service offering\",\"datePublished\":\"2019-06-10T16:28:45.000Z\",\"dateModified\":\"2019-06-10T16:28:45.000Z\",\"description\":\"Testing out Scaleways Kapsule their Kubernetes as a Service offering\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2019/06/10/testing-out-scaleways-kapsule-their-kubernetes-as-a-service-offering\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Setup a Logstash Server for Amazon Elasticsearch Service and auth with IAM\",\"date\":\"2019-06-04T21:46:27.000Z\",\"tags\":[\"logstash\",\"elk\",\"elasticsearch\",\"aws\",\"iam\"],\"draft\":false,\"summary\":\"Setup a Logstash Server for Amazon Elasticsearch Service and auth with IAM\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"5 min read\",\"minutes\":4.33,\"time\":259800,\"words\":866},\"slug\":\"2019/06/04/setup-a-logstash-server-for-amazon-elasticsearch-service-and-auth-with-iam\",\"path\":\"blog/2019/06/04/setup-a-logstash-server-for-amazon-elasticsearch-service-and-auth-with-iam\",\"filePath\":\"blog/2019/06/04/setup-a-logstash-server-for-amazon-elasticsearch-service-and-auth-with-iam.mdx\",\"toc\":[{\"value\":\"What will we be doing\",\"url\":\"#what-will-we-be-doing\",\"depth\":2},{\"value\":\"Create the IAM Policy:\",\"url\":\"#create-the-iam-policy\",\"depth\":2},{\"value\":\"Authorize your Role in Elasticsearch Policy\",\"url\":\"#authorize-your-role-in-elasticsearch-policy\",\"depth\":2},{\"value\":\"Install Logstash on EC2\",\"url\":\"#install-logstash-on-ec2\",\"depth\":2},{\"value\":\"Install the Amazon ES Logstash Output Plugin\",\"url\":\"#install-the-amazon-es-logstash-output-plugin\",\"depth\":2},{\"value\":\"Configure Logstash\",\"url\":\"#configure-logstash\",\"depth\":2},{\"value\":\"Start Logstash\",\"url\":\"#start-logstash\",\"depth\":2},{\"value\":\"Install Nginx\",\"url\":\"#install-nginx\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Setup a Logstash Server for Amazon Elasticsearch Service and auth with IAM\",\"datePublished\":\"2019-06-04T21:46:27.000Z\",\"dateModified\":\"2019-06-04T21:46:27.000Z\",\"description\":\"Setup a Logstash Server for Amazon Elasticsearch Service and auth with IAM\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2019/06/04/setup-a-logstash-server-for-amazon-elasticsearch-service-and-auth-with-iam\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Use Vagrant to Setup a Local Development Environment on Linux\",\"date\":\"2019-05-30T19:14:15.000Z\",\"tags\":[\"vagrant\",\"development\",\"virtualbox\"],\"draft\":false,\"summary\":\"Use Vagrant to Setup a Local Development Environment on Linux\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"6 min read\",\"minutes\":5.095,\"time\":305700,\"words\":1019},\"slug\":\"2019/05/30/use-vagrant-to-setup-a-local-development-environment-on-linux\",\"path\":\"blog/2019/05
1/30/use-vagrant-to-setup-a-local-development-environment-on-linux\",\"filePath\":\"blog/2019/05/30/use-vagrant-to-setup-a-local-development-environment-on-linux.mdx\",\"toc\":[{\"value\":\"What are we doing today?\",\"url\":\"#what-are-we-doing-today\",\"depth\":2},{\"value\":\"Virtualbox\",\"url\":\"#virtualbox\",\"depth\":2},{\"value\":\"Install Vagrant\",\"url\":\"#install-vagrant\",\"depth\":2},{\"value\":\"Provision a Box with Vagrant\",\"url\":\"#provision-a-box-with-vagrant\",\"depth\":2},{\"value\":\"Making changes to your config\",\"url\":\"#making-changes-to-your-config\",\"depth\":2},{\"value\":\"Tear down\",\"url\":\"#tear-down\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Use Vagrant to Setup a Local Development Environment on Linux\",\"datePublished\":\"2019-05-30T19:14:15.000Z\",\"dateModified\":\"2019-05-30T19:14:15.000Z\",\"description\":\"Use Vagrant to Setup a Local Development Environment on Linux\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2019/05/30/use-vagrant-to-setup-a-local-development-environment-on-linux\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Prometheus Series of Tutorials for your Guide to Epic Metrics\",\"date\":\"2019-05-17T18:24:40.000Z\",\"tags\":[\"prometheus\",\"prometheus-series\",\"metrics\",\"monitoring\",\"grafana\",\"alertmanager\"],\"draft\":false,\"summary\":\"Prometheus Series of Tutorials for your Guide to Epic Metrics\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"1 min read\",\"minutes\":0.62,\"time\":37200,\"words\":124},\"slug\":\"2019/05/17/prometheus-series-of-tutorials-for-your-guide-to-epic-metrics\",\"path\":\"blog/2019/05/17/prometheus-series-of-tutorials-for-your-guide-to-epic-metrics\",\"filePath\":\"blog/2019/05/17/prometheus-series-of-tutorials-for-your-guide-to-epic-metrics.mdx\",\"toc\":[{\"value\":\"The List\",\"url\":\"#the-list\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Prometheus Series of Tutorials for your Guide to Epic Metrics\",\"datePublished\":\"2019-05-17T18:24:40.000Z\",\"dateModified\":\"2019-05-17T18:24:40.000Z\",\"description\":\"Prometheus Series of Tutorials for your Guide to Epic Metrics\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2019/05/17/prometheus-series-of-tutorials-for-your-guide-to-epic-metrics\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Install Blackbox Exporter to Monitor Websites with Prometheus\",\"date\":\"2019-05-17T16:55:15.000Z\",\"tags\":[\"prometheus\",\"metrics\",\"monitoring\",\"blackbox\",\"linux\"],\"draft\":false,\"summary\":\"This tutorial will show you how to install Blackbox Exporter on Linux to Monitor Websites with Prometheus\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"4 min read\",\"minutes\":3.275,\"time\":196500,\"words\":655},\"slug\":\"2019/05/17/install-blackbox-exporter-to-monitor-websites-with-prometheus\",\"path\":\"blog/2019/05/17/install-blackbox-exporter-to-monitor-websites-with-prometheus\",\"filePath\":\"blog/2019/05/17/install-blackbox-exporter-to-monitor-websites-with-prometheus.mdx\",\"toc\":[{\"value\":\"What will we be doing\",\"url\":\"#what-will-we-be-doing\",\"depth\":2},{\"value\":\"Install the Blackbox Exporter\",\"url\":\"#install-the-blackbox-exporter\",\"depth\":2},{\"value\":\"Configure Prometheus\",\"url\":\"#configure-prometheus\",\"depth\":2},{\"value\":\"Configure the Alarm definition:\",\"url\":\"#configure-the-alarm-definition\",\"depth\":2},{\"value\":\"Blackbox Exporter Dashboard\",\"url\":\"#blackbox-exporter-dashboard\",\"depth\":2},{\"value\":\"Next up, Alertmanager\",\"url\":\"#next-up-alertmanager\",\"depth\":2},{\"value\":\"Resources\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Install Blackbox Exporter to Monitor Websites with Prometheus\",\"datePublished\":\"2019-05-17T16:55:15.000Z\",\"dateModified\":\"2019-05-17T16:55:15.000Z\",\"description\":\"This tutorial will show you how to install Blackbox Exporter on Linux to Monitor Websites with Prometheus\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2019/05
1/17/install-blackbox-exporter-to-monitor-websites-with-prometheus\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Install Alertmanager to Alert based on Metrics from Prometheus\",\"date\":\"2019-05-17T16:49:26.000Z\",\"tags\":[\"alertmanager\",\"prometheus\",\"monitoring\",\"metrics\",\"linux\"],\"draft\":false,\"summary\":\"Install Alertmanager on Linux to Alert based on Metrics from Prometheus\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"4 min read\",\"minutes\":3.82,\"time\":229200,\"words\":764},\"slug\":\"2019/05/17/install-alertmanager-to-alert-based-on-metrics-from-prometheus\",\"path\":\"blog/2019/05/17/install-alertmanager-to-alert-based-on-metrics-from-prometheus\",\"filePath\":\"blog/2019/05/17/install-alertmanager-to-alert-based-on-metrics-from-prometheus.mdx\",\"toc\":[{\"value\":\"What we will be doing:\",\"url\":\"#what-we-will-be-doing\",\"depth\":2},{\"value\":\"Install Alertmanager\",\"url\":\"#install-alertmanager\",\"depth\":2},{\"value\":\"Configure Alertmanager:\",\"url\":\"#configure-alertmanager\",\"depth\":2},{\"value\":\"Access Alertmanager:\",\"url\":\"#access-alertmanager\",\"depth\":2},{\"value\":\"Install Prometheus Alertmanager Plugin\",\"url\":\"#install-prometheus-alertmanager-plugin\",\"depth\":2},{\"value\":\"Resources\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Install Alertmanager to Alert based on Metrics from Prometheus\",\"datePublished\":\"2019-05-17T16:49:26.000Z\",\"dateModified\":\"2019-05-17T16:49:26.000Z\",\"description\":\"Install Alertmanager on Linux to Alert based on Metrics from Prometheus\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2019/05/17/install-alertmanager-to-alert-based-on-metrics-from-prometheus\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Install Grafana to Visualize your Metrics from datasources such as Prometheus on Linux\",\"date\":\"2019-05-17T16:08:02.000Z\",\"tags\":[\"grafana\",\"prometheus\",\"metrics\",\"monitoring\",\"linux\"],\"draft\":false,\"summary\":\"Install Grafana to Visualize your Metrics from datasources such as Prometheus on Linux\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"3 min read\",\"minutes\":2.055,\"time\":123300,\"words\":411},\"slug\":\"2019/05/17/install-grafana-to-visualize-your-metrics-from-datasources-such-as-prometheus-on-linux\",\"path\":\"blog/2019/05/17/install-grafana-to-visualize-your-metrics-from-datasources-such-as-prometheus-on-linux\",\"filePath\":\"blog/2019/05/17/install-grafana-to-visualize-your-metrics-from-datasources-such-as-prometheus-on-linux.mdx\",\"toc\":[{\"value\":\"What are we doing today\",\"url\":\"#what-are-we-doing-today\",\"depth\":2},{\"value\":\"Install Grafana\",\"url\":\"#install-grafana\",\"depth\":2},{\"value\":\"Optional: Nginx Reverse Proxy\",\"url\":\"#optional-nginx-reverse-proxy\",\"depth\":2},{\"value\":\"Access Grafana\",\"url\":\"#access-grafana\",\"depth\":2},{\"value\":\"Dashboarding Tutorials\",\"url\":\"#dashboarding-tutorials\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Install Grafana to Visualize your Metrics from datasources such as Prometheus on Linux\",\"datePublished\":\"2019-05-17T16:08:02.000Z\",\"dateModified\":\"2019-05-17T16:08:02.000Z\",\"description\":\"Install Grafana to Visualize your Metrics from datasources such as Prometheus on Linux\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2019/05/17/install-grafana-to-visualize-your-metrics-from-datasources-such-as-prometheus-on-linux\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Install Pushgateway to Expose Metrics to Prometheus\",\"date\":\"2019-05-17T11:04:03.000Z\",\"tags\":[\"pushgateway\",\"prometheus\",\"metrics\",\"monitoring\"],\"draft\":false,\"summary\":\"Install Pushgateway to Expose Metrics to Prometheus\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"3 min read\",\"minutes\":2.92,\"t
1ime\":175200,\"words\":584},\"slug\":\"2019/05/17/install-pushgateway-to-expose-metrics-to-prometheus\",\"path\":\"blog/2019/05/17/install-pushgateway-to-expose-metrics-to-prometheus\",\"filePath\":\"blog/2019/05/17/install-pushgateway-to-expose-metrics-to-prometheus.mdx\",\"toc\":[{\"value\":\"Pre-Requirements\",\"url\":\"#pre-requirements\",\"depth\":2},{\"value\":\"What we will do?\",\"url\":\"#what-we-will-do\",\"depth\":2},{\"value\":\"Install Pushgateway\",\"url\":\"#install-pushgateway\",\"depth\":2},{\"value\":\"Configure Prometheus\",\"url\":\"#configure-prometheus\",\"depth\":2},{\"value\":\"Push metrics to pushgateway\",\"url\":\"#push-metrics-to-pushgateway\",\"depth\":2},{\"value\":\"Resources:\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Install Pushgateway to Expose Metrics to Prometheus\",\"datePublished\":\"2019-05-17T11:04:03.000Z\",\"dateModified\":\"2019-05-17T11:04:03.000Z\",\"description\":\"Install Pushgateway to Expose Metrics to Prometheus\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2019/05/17/install-pushgateway-to-expose-metrics-to-prometheus\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Running a HA MySQL Galera Cluster on Docker Swarm\",\"date\":\"2019-05-10T11:02:39.000Z\",\"tags\":[\"mysql\",\"galera\",\"docker\",\"swarm\",\"databases\"],\"draft\":false,\"summary\":\"Running a HA MySQL Galera Cluster on Docker Swarm\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"5 min read\",\"minutes\":4.69,\"time\":281400,\"words\":938},\"slug\":\"2019/05/10/running-a-ha-mysql-galera-cluster-on-docker-swarm\",\"path\":\"blog/2019/05/10/running-a-ha-mysql-galera-cluster-on-docker-swarm\",\"filePath\":\"blog/2019/05/10/running-a-ha-mysql-galera-cluster-on-docker-swarm.mdx\",\"toc\":[{\"value\":\"About\",\"url\":\"#about\",\"depth\":2},{\"value\":\"Deploy the MySQL Cluster\",\"url\":\"#deploy-the-mysql-cluster\",\"depth\":2},{\"value\":\"The Backup Client\",\"url\":\"#the-backup-client\",\"depth\":2},{\"value\":\"Scale the Cluster\",\"url\":\"#scale-the-cluster\",\"depth\":2},{\"value\":\"Simulate a Node Failure:\",\"url\":\"#simulate-a-node-failure\",\"depth\":2},{\"value\":\"How to Restore?\",\"url\":\"#how-to-restore\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Running a HA MySQL Galera Cluster on Docker Swarm\",\"datePublished\":\"2019-05-10T11:02:39.000Z\",\"dateModified\":\"2019-05-10T11:02:39.000Z\",\"description\":\"Running a HA MySQL Galera Cluster on Docker Swarm\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2019/05/10/running-a-ha-mysql-galera-cluster-on-docker-swarm\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Create Secrets with Vaults Transits Secret Engine\",\"date\":\"2019-05-07T20:31:54.000Z\",\"tags\":[\"vault\",\"hashicorp\",\"encryption\",\"secrets\"],\"draft\":false,\"summary\":\"Create Secrets with Vaults Transits Secret Engine\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"2 min read\",\"minutes\":1.78,\"time\":106800,\"words\":356},\"slug\":\"2019/05/07/create-secrets-with-vaults-transits-secret-engine\",\"path\":\"blog/2019/05/07/create-secrets-with-vaults-transits-secret-engine\",\"filePath\":\"blog/2019/05/07/create-secrets-with-vaults-transits-secret-engine.mdx\",\"toc\":[{\"value\":\"Enable the Transit Engine:\",\"url\":\"#enable-the-transit-engine\",\"depth\":2},{\"value\":\"Create the Key Ring:\",\"url\":\"#create-the-key-ring\",\"depth\":2},{\"value\":\"Encoding\",\"url\":\"#encoding\",\"depth\":2},{\"value\":\"Encrypt\",\"url\":\"#encrypt\",\"depth\":2},{\"value\":\"Decrypt:\",\"url\":\"#decrypt\",\"depth\":2},{\"value\":\"Decoding\",\"url\":\"#decoding\",\"depth\":2},{\"value\":\"Resources\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Create Secrets with Vaults Transits Secret Engine\",\"datePublished\":\"2019-05-07T20:31:54.000Z\",\"dateModified\":\"2019-05-07T20:31:54.000Z\",\"description\":\"Create Secrets with Vaults Transits Secret Engine\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2019/05
1/07/create-secrets-with-vaults-transits-secret-engine\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Use the Vault API to Provision App Keys and Create KV Pairs\",\"date\":\"2019-05-07T20:23:10.000Z\",\"tags\":[\"hashicorp\",\"vault\",\"api\",\"secrets\",\"secrets-management\"],\"draft\":false,\"summary\":\"Use the Vault API to Provision App Keys and Create Key Value Pairs\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"5 min read\",\"minutes\":4.41,\"time\":264600,\"words\":882},\"slug\":\"2019/05/07/use-the-vault-api-to-provision-app-keys-and-create-kv-pairs\",\"path\":\"blog/2019/05/07/use-the-vault-api-to-provision-app-keys-and-create-kv-pairs\",\"filePath\":\"blog/2019/05/07/use-the-vault-api-to-provision-app-keys-and-create-kv-pairs.mdx\",\"toc\":[{\"value\":\"Credentials / Authentication\",\"url\":\"#credentials--authentication\",\"depth\":2},{\"value\":\"Create the Roles\",\"url\":\"#create-the-roles\",\"depth\":2},{\"value\":\"Create the User Credentials\",\"url\":\"#create-the-user-credentials\",\"depth\":2},{\"value\":\"Create KV Pairs with New User\",\"url\":\"#create-kv-pairs-with-new-user\",\"depth\":2},{\"value\":\"Resources:\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Use the Vault API to Provision App Keys and Create KV Pairs\",\"datePublished\":\"2019-05-07T20:23:10.000Z\",\"dateModified\":\"2019-05-07T20:23:10.000Z\",\"description\":\"Use the Vault API to Provision App Keys and Create Key Value Pairs\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2019/05/07/use-the-vault-api-to-provision-app-keys-and-create-kv-pairs\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Persist Vault Data with Amazon S3 as a Storage Backend\",\"date\":\"2019-05-07T20:01:45.000Z\",\"tags\":[\"vault\",\"storage\",\"secrets\",\"s3\"],\"draft\":false,\"summary\":\"Persist Vault Data with Amazon S3 as a Storage Backend\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"2 min read\",\"minutes\":1.375,\"time\":82500,\"words\":275},\"slug\":\"2019/05/07/persist-vault-data-with-amazon-s3-as-a-storage-backend\",\"path\":\"blog/2019/05/07/persist-vault-data-with-amazon-s3-as-a-storage-backend\",\"filePath\":\"blog/2019/05/07/persist-vault-data-with-amazon-s3-as-a-storage-backend.mdx\",\"toc\":[{\"value\":\"Provision S3 Bucket\",\"url\":\"#provision-s3-bucket\",\"depth\":2},{\"value\":\"Vault Config\",\"url\":\"#vault-config\",\"depth\":2},{\"value\":\"Docker Compose\",\"url\":\"#docker-compose\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Persist Vault Data with Amazon S3 as a Storage Backend\",\"datePublished\":\"2019-05-07T20:01:45.000Z\",\"dateModified\":\"2019-05-07T20:01:45.000Z\",\"description\":\"Persist Vault Data with Amazon S3 as a Storage Backend\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2019/05/07/persist-vault-data-with-amazon-s3-as-a-storage-backend\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Setup Prometheus and Node Exporter on Ubuntu for Epic Monitoring\",\"date\":\"2019-05-07T13:55:37.000Z\",\"tags\":[\"prometheus\",\"monitoring\",\"node-exporter\"],\"draft\":false,\"summary\":\"Setup Prometheus and Node Exporter on Ubuntu for Epic Monitoring\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"6 min read\",\"minutes\":5.875,\"time\":352500,\"words\":1175},\"slug\":\"2019/05/07/setup-prometheus-and-node-exporter-on-ubuntu-for-epic-monitoring\",\"path\":\"blog/2019/05/07/setup-prometheus-and-node-exporter-on-ubuntu-for-epic-monitoring\",\"filePath\":\"blog/2019/05/07/setup-prometheus-and-node-exporter-on-ubuntu-for-epic-monitoring.mdx\",\"toc\":[{\"value\":\"What are we doing today\",\"url\":\"#what-are-we-doing-today\",\"depth\":2},{\"value\":\"Install Prometheus\",\"url\":\"#install-prometheus\",\"depth\":2},{\"value\":\"Configure Prometheus\",\"url\":\"#configure-prometheus\",\"depth\":2},{\"value\":\"Install Node Exporter\",\"url\":\"#install-node-exporter\",\"depth\":2},{\"value\":\"Configure Node Exporter\",\"url\":\"#configure-node-exporter\",\"depth\":2},{\"value\":\"Nginx Reverse Proxy\",\"url\":\"#nginx-reverse-proxy\",\"depth\":2},{\"value\":\"Access the Beauty of Prometheus Land!\",\"url\":\"#access-the-beauty-of-prometheus-land\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Setup Prometheus and Node Exporter on Ubuntu for Epic Monitoring\",\"datePublished\":\"2019-05-07T13:55:37.000Z\",\"dateModified\":\"2019-05-07T13:55:37.000Z\",\"description\":\"Setup Prometheus and Node Exporter on Ubuntu for Epic Monitoring\",\"
1image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2019/05/07/setup-prometheus-and-node-exporter-on-ubuntu-for-epic-monitoring\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"How to fix the following signatures couldnt be verified because the public key is not available with apt\",\"date\":\"2019-05-07T10:16:31.000Z\",\"tags\":[\"apt\",\"debian\",\"ubuntu\",\"linux\"],\"draft\":false,\"summary\":\"How to fix the following signatures couldnt be verified because the public key is not available with apt\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"2 min read\",\"minutes\":1.295,\"time\":77700,\"words\":259},\"slug\":\"2019/05/07/how-to-fix-the-following-signatures-couldnt-be-verified-because-the-public-key-is-not-available-with-apt\",\"path\":\"blog/2019/05/07/how-to-fix-the-following-signatures-couldnt-be-verified-because-the-public-key-is-not-available-with-apt\",\"filePath\":\"blog/2019/05/07/how-to-fix-the-following-signatures-couldnt-be-verified-because-the-public-key-is-not-available-with-apt.mdx\",\"toc\":[{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"How to fix the following signatures couldnt be verified because the public key is not available with apt\",\"datePublished\":\"2019-05-07T10:16:31.000Z\",\"dateModified\":\"2019-05-07T10:16:31.000Z\",\"description\":\"How to fix the following signatures couldnt be verified because the public key is not available with apt\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2019/05/07/how-to-fix-the-following-signatures-couldnt-be-verified-because-the-public-key-is-not-available-with-apt\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Setup Hashicorp Vault Server on Docker and a Getting Started CLI Guide\",\"date\":\"2019-05-06T20:49:09.000Z\",\"tags\":[\"vault\",\"secrets\",\"docker\"],\"draft\":false,\"summary\":\"Setup Hashicorp Vault Server on Docker and a Getting Started CLI Guide\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"5 min read\",\"minutes\":4.66,\"time\":279600,\"words\":932},\"slug\":\"2019/05/06/setup-hashicorp-vault-server-on-docker-and-cli-guide\",\"path\":\"blog/2019/05/06/setup-hashicorp-vault-server-on-docker-and-cli-guide\",\"filePath\":\"blog/2019/05/06/setup-hashicorp-vault-server-on-docker-and-cli-guide.mdx\",\"toc\":[{\"value\":\"What will we be doing today\",\"url\":\"#what-will-we-be-doing-today\",\"depth\":2},{\"value\":\"Setting up the Vault Server\",\"url\":\"#setting-up-the-vault-server\",\"depth\":2},{\"value\":\"Interacting with the Vault CLI\",\"url\":\"#interacting-with-the-vault-cli\",\"depth\":2},{\"value\":\"Initialize the Vault Cluster:\",\"url\":\"#initialize-the-vault-cluster\",\"depth\":2},{\"value\":\"Create and Read Secrets\",\"url\":\"#create-and-read-secrets\",\"depth\":2},{\"value\":\"Key with Multiple Secrets\",\"url\":\"#key-with-multiple-secrets\",\"depth\":2},{\"value\":\"Versioning\",\"url\":\"#versioning\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Setup Hashicorp Vault Server on Docker and a Getting Started CLI Guide\",\"datePublished\":\"2019-05-06T20:49:09.000Z\",\"dateModified\":\"2019-05-06T20:49:09.000Z\",\"description\":\"Setup Hashicorp Vault Server on Docker and a Getting Started CLI Guide\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2019/05/06/setup-hashicorp-vault-server-on-docker-and-cli-guide\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Using Concourse CI to Deploy to Docker Swarm\",\"date\":\"2019-05-04T21:11:17.000Z\",\"tags\":[\"concourse\",\"cicd\",\"devops\",\"docker\",\"swarm\"],\"draft\":false,\"summary\":\"This tutorial shows you how to use Concourse CI to Deploy to Docker Swarm\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"5 min read\",\"minutes\":4.535,\"time\":272100,\"words\":907},\"slug\":\"2019/05/04/using-concourse-ci-to-deploy-to-docker-swarm\",\"path\":\"blog/2019/05
1/04/using-concourse-ci-to-deploy-to-docker-swarm\",\"filePath\":\"blog/2019/05/04/using-concourse-ci-to-deploy-to-docker-swarm.mdx\",\"toc\":[{\"value\":\"The Flow\",\"url\":\"#the-flow\",\"depth\":2},{\"value\":\"Application Structure\",\"url\":\"#application-structure\",\"depth\":2},{\"value\":\"Pipeline Walktrough\",\"url\":\"#pipeline-walktrough\",\"depth\":2},{\"value\":\"Set the Pipeline in Concourse\",\"url\":\"#set-the-pipeline-in-concourse\",\"depth\":2},{\"value\":\"Testing our Application\",\"url\":\"#testing-our-application\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Using Concourse CI to Deploy to Docker Swarm\",\"datePublished\":\"2019-05-04T21:11:17.000Z\",\"dateModified\":\"2019-05-04T21:11:17.000Z\",\"description\":\"This tutorial shows you how to use Concourse CI to Deploy to Docker Swarm\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2019/05/04/using-concourse-ci-to-deploy-to-docker-swarm\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Using MongoDB inside Drone CI Services for Unit Testing\",\"date\":\"2019-05-04T18:52:37.000Z\",\"tags\":[\"mongodb\",\"drone\",\"cicd\",\"devops\",\"linux\"],\"draft\":false,\"summary\":\"Using MongoDB inside Drone CI Services for Unit Testing\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"4 min read\",\"minutes\":3.385,\"time\":203100,\"words\":677},\"slug\":\"2019/05/04/using-mongodb-inside-drone-ci-services-for-unit-testing\",\"path\":\"blog/2019/05/04/using-mongodb-inside-drone-ci-services-for-unit-testing\",\"filePath\":\"blog/2019/05/04/using-mongodb-inside-drone-ci-services-for-unit-testing.mdx\",\"toc\":[{\"value\":\"What are we doing today\",\"url\":\"#what-are-we-doing-today\",\"depth\":2},{\"value\":\"Our Drone Pipeline\",\"url\":\"#our-drone-pipeline\",\"depth\":2},{\"value\":\"Demo and Screenshots\",\"url\":\"#demo-and-screenshots\",\"depth\":2},{\"value\":\"Resources\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Using MongoDB inside Drone CI Services for Unit Testing\",\"datePublished\":\"2019-05-04T18:52:37.000Z\",\"dateModified\":\"2019-05-04T18:52:37.000Z\",\"description\":\"Using MongoDB inside Drone CI Services for Unit Testing\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2019/05/04/using-mongodb-inside-drone-ci-services-for-unit-testing\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Queries Failing via Beeline due to Anonymous User\",\"date\":\"2019-04-28T16:25:12.000Z\",\"tags\":[\"bigdata\",\"hadoop\",\"beeline\",\"hive\"],\"draft\":false,\"summary\":\"Queries Failing via Beeline due to Anonymous User\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"2 min read\",\"minutes\":1.775,\"time\":106500,\"words\":355},\"slug\":\"2019/04/28/queries-failing-via-beeline-due-to-anonymous-user\",\"path\":\"blog/2019/04/28/queries-failing-via-beeline-due-to-anonymous-user\",\"filePath\":\"blog/2019/04/28/queries-failing-via-beeline-due-to-anonymous-user.mdx\",\"toc\":[{\"value\":\"Issue:\",\"url\":\"#issue\",\"depth\":2},{\"value\":\"Debugging:\",\"url\":\"#debugging\",\"depth\":2},{\"value\":\"Resolution:\",\"url\":\"#resolution\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Queries Failing via Beeline due to Anonymous User\",\"datePublished\":\"2019-04-28T16:25:12.000Z\",\"dateModified\":\"2019-04-28T16:25:12.000Z\",\"description\":\"Queries Failing via Beeline due to Anonymous User\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2019/04/28/queries-failing-via-beeline-due-to-anonymous-user\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Using Drone CI to Build a Jekyll Site and Deploy to Docker Swarm\",\"date\":\"2019-04-23T21:57:02.000Z\",\"tags\":[\"drone\",\"cicd\",\"devops\",\"docker\",\"swarm\"],\"draft\":false,\"summary\":\"cicd pipelines - build a jekyll site and deploy to docker swarm with drone ci\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"6 min read\",\"minutes\":5.025,\"time\":301500,\"words\":1005},\"slug\":\"2019/04/23/using-drone-ci-to-build-a-jekyll-site-and-deploy-to-docker-swarm\",\"path\":\"blog/2019/04/23/using-drone-ci-to-build-a-jekyll-site-and-deploy-to-docker-swarm\",\"filePath\":\"blog/2019/04/23/using-drone-ci-to-build-a-jekyll-site-and-deploy-to-docker-swarm.mdx\",\"toc\":[{\"value\":\"Environment Overview\",\"url\":\"#environment-overview\",\"depth\":2},{\"value\":\"Install Jekyll Locally\",\"url\":\"#install-jekyll-locally\",\"depth\":2},{\"value\":\"Create a Github Repository\",\"url\":\"#create-a-github-repository\",\"depth\":2},{\"value\":\"Create Secrets on Drone\",\"url\":\"#create-secrets-on-drone\",\"depth\":2},{\"value\":\"Add the Drone Config\",\"url\":\"#add-the-drone-config\",\"depth\":2},{\"value\":\"Notifications?\",\"url\":\"#notifications\",\"depth\":2},{\"value\":\"Add the Docker Compose\",\"url\":\"#add-the-docker-compose\",\"depth\":2},{\"value\":\"Push to Github\",\"url\":\"#push-to-github\",\"depth\":2},{\"value\":\"Test Jekyll\",\"url\":\"#test-jekyll\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Using Drone CI to Build a Jekyll Site and Deploy to Docker Swarm\",\"datePublished\":\"2019-04-23T21:57:02.000Z\",\"dateModified\":\"2019-04-23T21:57:02.000Z\",\"description\":\"cicd pipelines - build a jekyll site and deploy to docker swarm with drone ci\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2019/04/23/using-drone-ci-to-build-a-jekyll-site-and-deploy-to-docker-swarm\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Setup a Blog with Hugo\",\"date\":\"2019-04-23T09:41:10.000Z\",\"tags\":[\"hugo\",\"blogging\"],\"draft\":false,\"summary\":\"This tutorial will show you how to setup a blog with Hugo.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"3 min read\",\"minutes\":2.88,\"time\":172800,\"words\":576},\"slug\":\"2019/04/23/setup-a-blog-with-hugo\",\"path\":\"blog/2019/04/23/setup-a-blog-with-hugo\",\"filePath\":\"blog/2019/04/23/setup-a-blog-with-hugo.mdx\",\"toc\":[{\"value\":\"What is Hugo\",\"url\":\"#what-is-hugo\",\"depth\":2},{\"value\":\"Installing Hugo\",\"url\":\"#installing-hugo\",\"depth\":2},{\"value\":\"Install a Theme\",\"url\":\"#install-a-theme\",\"depth\":2},{\"value\":\"Custom Syntax Highlighting\",\"url\":\"#custom-syntax-highlighting\",\"depth\":2},{\"value\":\"Create your First Blogpost\",\"url\":\"#create-your-first-blogpost\",\"depth\":2},{\"value\":\"Run the Server\",\"url\":\"#run-the-server\",\"depth\":2},{\"value\":\"Screenshots\",\"url\":\"#screenshots\",\"depth\":2},{\"value\":\"References:\",\"url\":\"#references\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Setup a Blog with Hugo\",\"datePublished\":\"2019-04-23T09:41:10.000Z\",\"dateModified\":\"2019-04-23T09:41:10.000Z\",\"description\":\"This tutorial will show you how to setup a blog with Hugo.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2019/04/23/setup-a-blog-with-hugo\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Setup a Drone CICD Environment on Docker with Letsencrypt\",\"date\":\"2019-04-18T16:53:49.000Z\",\"tags\":[\"docker\",\"drone\",\"cicd\",\"devops\"],\"draft\":false,\"summary\":\"Setup a Drone CICD Environment on Docker with Letsencrypt\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"4 min read\",\"minutes\":3.915,\"time\":234900,\"words\":783},\"slug\":\"2019/04/18/setup-a-drone-cicd-environment-on-docker-with-letsencrypt\",\"path\":\"blog/2019/04/18/setup-a-drone-cicd-environment-on-docker-with-letsencrypt\",\"filePath\":\"blog/2019/04/18/setup-a-drone-cicd-environment-on-docker-with-letsencrypt.mdx\",\"toc\":[{\"value\":\"What is Drone?\",\"url\":\"#what-is-drone\",\"depth\":2},{\"value\":\"Show me pipelines!\",\"url\":\"#show-me-pipelines\",\"depth\":2},{\"value\":\"Open for Testing!\",\"url\":\"#open-for-testing\",\"depth\":2},{\"value\":\"What are we doing?\",\"url\":\"#what-are-we-doing\",\"depth\":2},{\"value\":\"Deploy the Servers\",\"url\":\"#deploy-the-servers\",\"depth\":2},{\"value\":\"Access Drone\",\"url\":\"#access-drone\",\"depth\":2},{\"value\":\"Add drone config to your repository:\",\"url\":\"#add-drone-config-to-your-repository\",\"depth\":2}
1,{\"value\":\"Trigger a Build\",\"url\":\"#trigger-a-build\",\"depth\":2},{\"value\":\"Debugging\",\"url\":\"#debugging\",\"depth\":2},{\"value\":\"More on Drone\",\"url\":\"#more-on-drone\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Setup a Drone CICD Environment on Docker with Letsencrypt\",\"datePublished\":\"2019-04-18T16:53:49.000Z\",\"dateModified\":\"2019-04-18T16:53:49.000Z\",\"description\":\"Setup a Drone CICD Environment on Docker with Letsencrypt\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2019/04/18/setup-a-drone-cicd-environment-on-docker-with-letsencrypt\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Setup a Slack Webhook for Sending Messages from Applications\",\"date\":\"2019-04-18T10:07:42.000Z\",\"tags\":[\"slack\",\"notifications\",\"messages\"],\"draft\":false,\"summary\":\"setup a slack webhook to notify you in response of events\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"2 min read\",\"minutes\":1.63,\"t
1ime\":97800,\"words\":326},\"slug\":\"2019/04/18/setup-a-slack-webhook-for-sending-messages-from-applications\",\"path\":\"blog/2019/04/18/setup-a-slack-webhook-for-sending-messages-from-applications\",\"filePath\":\"blog/2019/04/18/setup-a-slack-webhook-for-sending-messages-from-applications.mdx\",\"toc\":[{\"value\":\"What we will be doing\",\"url\":\"#what-we-will-be-doing\",\"depth\":2},{\"value\":\"Configuration\",\"url\":\"#configuration\",\"depth\":2},{\"value\":\"Sending Messages\",\"url\":\"#sending-messages\",\"depth\":2},{\"value\":\"Join my Slack\",\"url\":\"#join-my-slack\",\"depth\":2},{\"value\":\"Resources:\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Setup a Slack Webhook for Sending Messages from Applications\",\"datePublished\":\"2019-04-18T10:07:42.000Z\",\"dateModified\":\"2019-04-18T10:07:42.000Z\",\"description\":\"setup a slack webhook to notify you in response of events\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2019/04/18/setup-a-slack-webhook-for-sending-messages-from-applications\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"MongoDB Examples with Golang\",\"date\":\"2019-04-17T12:51:35.000Z\",\"tags\":[\"mongodb\",\"golang\",\"databases\",\"programming\"],\"draft\":false,\"summary\":\"MongoDB Examples with Golang\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"4 min read\",\"minutes\":3.51,\"time\":210600,\"words\":702},\"slug\":\"2019/04/17/mongodb-examples-with-golang\",\"path\":\"blog/2019/04/17/mongodb-examples-with-golang\",\"filePath\":\"blog/2019/04/17/mongodb-examples-with-golang.mdx\",\"toc\":[{\"value\":\"What are we doing?\",\"url\":\"#what-are-we-doing\",\"depth\":2},{\"value\":\"Environment:\",\"url\":\"#environment\",\"depth\":2},{\"value\":\"Connecting to MongoDB in Golang\",\"url\":\"#connecting-to-mongodb-in-golang\",\"depth\":2},{\"value\":\"Writing to MongoDB with Golang\",\"url\":\"#writing-to-mongodb-with-golang\",\"depth\":2},{\"value\":\"Updating Documents in MongoDB using Golang\",\"url\":\"#updating-documents-in-mongodb-using-golang\",\"depth\":2},{\"value\":\"Reading Data from MongoDB\",\"url\":\"#reading-data-from-mongodb\",\"depth\":2},{\"value\":\"Deleting Data from MongoDB:\",\"url\":\"#deleting-data-from-mongodb\",\"depth\":2},{\"value\":\"Resources:\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"MongoDB Examples with Golang\",\"datePublished\":\"2019-04-17T12:51:35.000Z\",\"dateModified\":\"2019-04-17T12:51:35.000Z\",\"description\":\"MongoDB Examples with Golang\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2019/04/17/mongodb-examples-with-golang\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"SQL Inner Joins Examples with SQLite\",\"date\":\"2019-04-06T19:47:38.000Z\",\"tags\":[\"sql\",\"sqlite\",\"databases\"],\"draft\":false,\"summary\":\"SQL Inner Joins Examples with SQLite\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"4 min read\",\"minutes\":3.675,\"time\":220500,\"words\":735},\"slug\":\"2019/04/06/sql-inner-joins-examples-with-sqlite\",\"path\":\"blog/2019/04/06/sql-inner-joins-examples-with-sqlite\",\"filePath\":\"blog/2019/04/06/sql-inner-joins-examples-with-sqlite.mdx\",\"toc\":[{\"value\":\"Overview\",\"url\":\"#overview\",\"depth\":2},{\"value\":\"Connecting to your Sqlite Database\",\"url\":\"#connecting-to-your-sqlite-database\",\"depth\":2},{\"value\":\"Create the Tables\",\"url\":\"#create-the-tables\",\"depth\":2},{\"value\":\"Write to Sqlite Database\",\"url\":\"#write-to-sqlite-database\",\"depth\":2},{\"value\":\"Read from the Sqlite Database\",\"url\":\"#read-from-the-sqlite-database\",\"depth\":2},{\"value\":\"Inner Joins with Sqlite\",\"url\":\"#inner-joins-with-sqlite\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"SQL Inner Joins Examples with SQLite\",\"datePublished\":\"2019-04-06T19:47:38.000Z\",\"dateModified\":\"2019-04-06T19:47:38.000Z\",\"description\":\"SQL Inner Joins Examples with SQLite\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2019/04/06/sql-inner-joins-examples-with-sqlite\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Install Elasticsearch with Ansible Tutorial\",\"date\":\"2019-04-06T19:45:09.000Z\",\"tags\":[\"elasticsearch\",\"ansible\",\"devops\"],\"draft\":false,\"summary\":\"In this tutorial we will install Elasticsearch with Ansible.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"3 min read\",\"minutes\":2.725,\"time\":163500,\"words\":545},\"slug\":\"2019/04/06/install-elasticsearch-with-ansible-tutorial\",\"path\":\"blog/2019/04/06/install-elasticsearch-with-ansible-tutorial\",\"filePath\":\"blog/2019/04/06/install-elasticsearch-with-ansible-tutorial.mdx\",\"toc\":[{\"value\":\"Deploy Elasticsearch\",\"url\":\"#deploy-elasticsearch\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Install Elasticsearch with Ansible Tutorial\",\"datePublished\":\"2019-04-06T19:45:09.000Z\",\"dateModified\":\"2019-04-06T19:45:09.000Z\",\"description\":\"In this tutorial we will install Elasticsearch with Ansible.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2019/04/06/install-elasticsearch-with-ansible-tutorial\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Elasticsearch Templates Tutorial\",\"date\":\"2019-04-06T19:41:53.000Z\",\"tags\":[\"elasticsearch\",\"elasticsearch-tutorial\",\"sysadmin\"],\"draft\":false,\"summary\":\"Elasticsearch Templates Tutorial\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"8 min read\",\"minutes\":7.53,\"time\":451800,\"words\":1506},\"slug\":\"2019/04/06/elasticsearch-templates-tutorial\",\"path\":\"blog/2019/04/06/elasticsearch-templates-tutorial\",\"filePath\":\"blog/2019/04/06/elasticsearch-templates-tutorial.mdx\",\"toc\":[{\"value\":\"What are we doing?\",\"url\":\"#what-are-we-doing\",\"depth\":2},{\"value\":\"String Fields\",\"url\":\"#string-fields\",\"depth\":2},{\"value\":\"Note about templates:\",\"url\":\"#note-about-templates\",\"depth\":2},{\"value\":\"Resources:\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Elasticsearch Templates Tutorial\",\"datePublished\":\"2019-04-06T19:41:53.000Z\",\"dateModified\":\"2019-04-06T19:41:53.000Z\",\"description\":\"Elasticsearch Templates Tutorial\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2019/04/06/elasticsearch-templates-tutorial\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Reindex your Elasticsearch Indexes Tutorial\",\"date\":\"2019-04-06T19:37:18.000Z\",\"tags\":[\"elasticsearch\",\"elasticsearch-tutorial\",\"sysadmin\"],\"draft\":false,\"summary\":\"Reindex your Elasticsearch Indexes Tutorial\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"4 min read\",\"minutes\":3.345,\"time\":200700,\"words\":669}
1,\"slug\":\"2019/04/06/reindex-your-elasticsearch-indexes-tutorial\",\"path\":\"blog/2019/04/06/reindex-your-elasticsearch-indexes-tutorial\",\"filePath\":\"blog/2019/04/06/reindex-your-elasticsearch-indexes-tutorial.mdx\",\"toc\":[{\"value\":\"Reindexing Elasticsearch Indexes\",\"url\":\"#reindexing-elasticsearch-indexes\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Reindex your Elasticsearch Indexes Tutorial\",\"datePublished\":\"2019-04-06T19:37:18.000Z\",\"dateModified\":\"2019-04-06T19:37:18.000Z\",\"description\":\"Reindex your Elasticsearch Indexes Tutorial\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2019/04/06/reindex-your-elasticsearch-indexes-tutorial\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Shrink your Elasticsearch Index by Reducing the Shard Count with the Shards API\",\"date\":\"2019-04-06T19:33:48.000Z\",\"tags\":[\"elasticsearch\",\"elasticsearch-tutorial\",\"databases\",\"sysadmin\"],\"draft\":false,\"summary\":\"Shrink your Elasticsearch Index by Reducing the Shard Count with the Shards API\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"7 min read\",\"minutes\":6.06,\"time\":363600,\"words\":1212},\"slug\":\"2019/04/06/shrink-your-elasticsearch-index-by-reducing-the-shard-count-with-the-shards-api\",\"path\":\"blog/2019/04/06/shrink-your-elasticsearch-index-by-reducing-the-shard-count-with-the-shards-api\",\"filePath\":\"blog/2019/04/06/shrink-your-elasticsearch-index-by-reducing-the-shard-count-with-the-shards-api.mdx\",\"toc\":[{\"value\":\"The Shrink API\",\"url\":\"#the-shrink-api\",\"depth\":2},{\"value\":\"Reduce the Primary Shards of an Index.\",\"url\":\"#reduce-the-primary-shards-of-an-index\",\"depth\":2},{\"value\":\"Resources:\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Shrink your Elasticsearch Index by Reducing the Shard Count with the Shards API\",\"datePublished\":\"2019-04-06T19:33:48.000Z\",\"dateModified\":\"2019-04-06T19:33:48.000Z\",\"description\":\"Shrink your Elasticsearch Index by Reducing the Shard Count with the Shards API\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2019/04/06/shrink-your-elasticsearch-index-by-reducing-the-shard-count-with-the-shards-api\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Self Hosted Git and CICD Platform with Gitea and Drone on Docker\",\"date\":\"2019-04-04T21:57:16.000Z\",\"tags\":[\"gitea\",\"drone\",\"devops\",\"python\",\"pipelines\"],\"draft\":false,\"summary\":\"cicd pipelines with gitea and drone running on golang\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"6 min read\",\"minutes\":5.615,\"time\":336900,\"words\":1123},\"slug\":\"2019/04/04/self-hosted-git-and-cicd-platform-with-gitea-and-drone-on-docker\",\"path\":\"blog/2019/04/04/self-hosted-git-and-cicd-platform-with-gitea-and-drone-on-docker\",\"filePath\":\"blog/2019/04/04/self-hosted-git-and-cicd-platform-with-gitea-and-drone-on-docker.mdx\",\"toc\":[{\"value\":\"Some definition\",\"url\":\"#some-definition\",\"depth\":2},{\"value\":\"Server Confguration\",\"url\":\"#server-confguration\",\"depth\":2},{\"value\":\"Pre-Requirements\",\"url\":\"#pre-requirements\",\"depth\":2},{\"value\":\"Deploy Gitea and Drone\",\"url\":\"#deploy-gitea-and-drone\",\"depth\":2},{\"value\":\"Register on Gitea\",\"url\":\"#register-on-gitea\",\"depth\":2},{\"value\":\"Setup SSH Key and Repo\",\"url\":\"#setup-ssh-key-and-repo\",\"depth\":2},{\"value\":\"Enable Repo on Drone\",\"url\":\"#enable-repo-on-drone\",\"depth\":2},{\"value\":\"Clone the repository\",\"url\":\"#clone-the-repository\",\"depth\":2},{\"value\":\"Add Example Python Flask app to git\",\"url\":\"#add-example-python-flask-app-to-git\",\"depth\":2},{\"value\":\"Look at Drone Running\",\"url\":\"#look-at-drone-running\",\"depth\":2},{\"value\":\"Build Status Badges\",\"url\":\"#build-status-badges\",\"depth\":2},{\"value\":\"Resources\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Self Hosted Git and CICD Platform with Gitea and Drone on Docker\",\"datePublished\":\"2019-04-04T21:57:16.000Z\",\"dateModified\":\"2019-04-04T21:57:16.000Z\",\"description\":\"cicd pipelines with gitea and drone running on golang\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2019/04/04/self-hosted-git-and-cicd-platform-with-gitea-and-drone-
1on-docker\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Build Small Golang Docker Containers\",\"date\":\"2019-04-03T12:24:08.000Z\",\"tags\":[\"docker\",\"golang\",\"alpine\"],\"draft\":false,\"summary\":\"building small golang docker images for having small golang docker containers\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"3 min read\",\"minutes\":2.065,\"time\":123900,\"words\":413},\"slug\":\"2019/04/03/build-small-golang-docker-containers\",\"path\":\"blog/2019/04/03/build-small-golang-docker-containers\",\"filePath\":\"blog/2019/04/03/build-small-golang-docker-containers.mdx\",\"toc\":[{\"value\":\"But Alpine..\",\"url\":\"#but-alpine\",\"depth\":2},{\"value\":\"Multi Stage Builds\",\"url\":\"#multi-stage-builds\",\"depth\":2},{\"value\":\"Resources\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Build Small Golang Docker Containers\",\"datePublished\":\"2019-04-03T12:24:08.000Z\",\"dateModified\":\"2019-04-03T12:24:08.000Z\",\"description\":\"building small golang docker images for having small golang docker containers\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2019/04/03/build-small-golang-docker-containers\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Secure your Elasticsearch Cluster with Basic Auth using Nginx and SSL from Letsencrypt\",\"date\":\"2019-04-02T18:55:58.000Z\",\"tags\":[\"nginx\",\"authentication\",\"elasticsearch\",\"security\",\"letsencrypt\",\"ssl\"],\"draft\":false,\"summary\":\"Secure your Elasticsearch Cluster with Basic Auth using Nginx and SSL from Letsencrypt\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"6 min read\",\"minutes\":5.545,\"time\":332700,\"words\":1109},\"slug\":\"2019/04/02/secure-your-elasticsearch-cluster-with-basic-auth-using-nginx\",\"path\":\"blog/2019/04/02/secure-your-elasticsearch-cluster-with-basic-auth-using-nginx\",\"filePath\":\"blog/2019/04/02/secure-your-elasticsearch-cluster-with-basic-auth-using-nginx.mdx\",\"toc\":[{\"value\":\"Install Nginx:\",\"url\":\"#install-nginx\",\"depth\":2},{\"value\":\"Configure Nginx for Reverse Proxy\",\"url\":\"#configure-nginx-for-reverse-proxy\",\"depth\":2},{\"value\":\"Test it\",\"url\":\"#test-it\",\"depth\":2},{\"value\":\"Letsencrypt SSL Certificates\",\"url\":\"#letsencrypt-ssl-certificates\",\"depth\":2},{\"value\":\"Update Nginx Config\",\"url\":\"#update-nginx-config\",\"depth\":2},{\"value\":\"Test the Nginx Proxy with SSL\",\"url\":\"#test-the-nginx-proxy-with-ssl\",\"depth\":2},{\"value\":\"Resources:\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Secure your Elasticsearch Cluster with Basic Auth using Nginx and SSL from Letsencrypt\",\"datePublished\":\"2019-04-02T18:55:58.000Z\",\"dateModified\":\"2019-04-02T18:55:58.000Z\",\"description\":\"Secure your Elasticsearch Cluster with Basic Auth using Nginx and SSL from Letsencrypt\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2019/04/02/secure-your-elasticsearch-cluster-with-basic-auth-using-nginx\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Setup Kibana Dashboards for Nginx log data to understand the behavior\",\"date\":\"2019-04-02T16:34:18.000Z\",\"tags\":[\"kibana\",\"elasticsearch\",\"logging\",\"analytics\"],\"draft\":false,\"summary\":\"build kibana dashboards to understand your web servers logs for analysis\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"6 min read\",\"minutes\":5.125,\"time\":307500,\"words\":1025},\"slug\":\"2019/04/02/setup-kibana-dashboards-for-nginx-log-data-to-understand-the-behavior\",\"path\":\"blog/2019/04/02/setup-kibana-dashboards-for-nginx-log-data-to-understand-the-behavior\",\"filePath\":\"blog/2019/04/02/setup-kibana-dashboards-for-nginx-log-data-to-un
1derstand-the-behavior.mdx\",\"toc\":[{\"value\":\"What do we want to achieve?\",\"url\":\"#what-do-we-want-to-achieve\",\"depth\":2},{\"value\":\"Pre-Requirements\",\"url\":\"#pre-requirements\",\"depth\":2},{\"value\":\"Setup Kibana Visulizations\",\"url\":\"#setup-kibana-visulizations\",\"depth\":2},{\"value\":\"Geomap: Map to see where people are connecting from\",\"url\":\"#geomap-map-to-see-where-people-are-connecting-from\",\"depth\":2},{\"value\":\"Piechart: Cities\",\"url\":\"#piechart-cities\",\"depth\":2},{\"value\":\"Top 10 Accessed Pages\",\"url\":\"#top-10-accessed-pages\",\"depth\":2},{\"value\":\"Top 5 HTTP Status Codes\",\"url\":\"#top-5-http-status-codes\",\"depth\":2},{\"value\":\"Top 404 Pages\",\"url\":\"#top-404-pages\",\"depth\":2},{\"value\":\"Top 10 User Agents\",\"url\":\"#top-10-user-agents\",\"depth\":2},{\"value\":\"Timeseries: Status Codes over Time\",\"url\":\"#timeseries-status-codes-over-time\",\"depth\":2},{\"value\":\"Timeseries: Successfull Website Hits over Time\",\"url\":\"#timeseries-successfull-website-hits-over-time\",\"depth\":2},{\"value\":\"Count Metric: Website Hits\",\"url\":\"#count-metric-website-hits\",\"depth\":2},{\"value\":\"Average Bytes Transferred\",\"url\":\"#average-bytes-transferred\",\"depth\":2},{\"value\":\"Tag Cloud with Most Popular Cities\",\"url\":\"#tag-cloud-with-most-popular-cities\",\"depth\":2},{\"value\":\"Create the Dashboard\",\"url\":\"#create-the-dashboard\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Setup Kibana Dashboards for Nginx log data to understand the behavior\",\"datePublished\":\"2019-04-02T16:34:18.000Z\",\"dateModified\":\"2019-04-02T16:34:18.000Z\",\"description\":\"build kibana dashboards to understand your web servers logs for analysis\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2019/04/02/setup-kibana-dashboards-for-nginx-log-data-to-understand-the-behavior\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Setup a 5 Node Highly Available Elasticsearch Cluster\",\"date\":\"2019-04-02T09:05:19.000Z\",\"tags\":[\"elasticsearch\",\"clustering\",\"databases\",\"elasticsearch-tutorial\"],\"draft\":false,\"summary\":\"Deploy a highly available 5 node elasticsearch cluster with elasticsearch master and elasticsearch data nodes. search and analytic engine on ubuntu linux.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"13 min read\",\"minutes\":12.735,\"time\":764100,\"words\":2547},\"slug\":\"2019/04/02/setup-a-5-node-highly-available-elasticsearch-cluster\",\"path\":\"blog/2019/04/02/setup-a-5-node-highly-available-elasticsearch-cluster\",\"filePath\":\"blog/2019/04/02/setup-a-5-node-highly-available-elasticsearch-cluster.mdx\",\"toc\":[{\"value\":\"The Overview:\",\"url\":\"#the-overview\",\"depth\":2},{\"value\":\"Setup the Elasticsearch Master Nodes\",\"url\":\"#setup-the-elasticsearch-master-nodes\",\"depth\":2},{\"value\":\"Setup the Elasticsearch Data Nodes\",\"url\":\"#setup-the-elasticsearch-data-nodes\",\"depth\":2},{\"value\":\"Interact with Elasticsearch\",\"url\":\"#interact-with-elasticsearch\",\"depth\":2},{\"value\":\"More on Elasticsearch\",\"url\":\"#more-on-elasticsearch\",\"depth\":2},{\"value\":\"Resources\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Setup a 5 Node Highly Available Elasticsearch Cluster\",\"datePublished\":\"2019-04-02T09:05:19.000Z\",\"dateModified\":\"2019-04-02T09:05:19.000Z\",\"description\":\"Deploy a highly available 5 node elasticsearch cluster with elasticsearch master and elasticsearch data nodes. search and analytic engine on ubuntu linux.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2019/04/02/setup-a-5-node-highly-available-elasticsearch-cluster\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Snippet: Create Custom CloudWatch Metrics with Python\",\"date\":\"2019-03-28T12:05:28.000Z\",\"tags\":[\"cloudwatch\",\"python\",\"aws\",\"metrics\"],\"draft\":false,\"summary\":\"Snippet: Create Custom CloudWatch Metrics with Python\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"1 min read\",\"minutes\":0.91,\"time\":54600,\"words\":182},\"slug\":\"2019/03/28/snippet-create-custom-cloudwatch-metrics-with-python\",\"path\":\"blog/2019/03/28/snippet-create-custom-cloudwatch-metrics-with-python\",\"filePath\":\"blog/2019/03/28/snippet-create-custom-cloudwatch-metrics-with-python.mdx\",\"toc\":[{\"value\":\"The Script:\",\"url\":\"#the-script\",\"depth\":2},{\"value\":\"Resources:\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Snippet: Create Custom CloudWatch Metrics with Python\",\"datePublished\":\"2019-03-28T12:05:28.000Z\",\"dateModified\":\"2019-03-28T12:05:28.000Z\",\"description\":\"Snippet: Create Custom CloudWatch Metrics with Python\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2019/03/28/snippet-create-custom-cloudwatch-metrics-with-python\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Concourse Pipeline to Build a Docker Image Automatically on Git Commit\",\"date\":\"2019-03-27T21:50:54.000Z\",\"tags\":[\"docker\",\"cicd\",\"concourse\",\"devops\"],\"draft\":false,\"summary\":\"Automatically Build and Push a Docker Image to Docker Hub using Concourse whenever a Git Commit is Published\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"3 min read\",\"minutes\":2.99,\"time\":179400,\"words\":598},\"slug\":\"2019/03/27/concourse-pipeline-to-build-a-docker-image-automatically-on-git-commit\",\"path\":\"blog/2019/03/27/concourse-pipeline-to-build-a-docker-image-automatically-on-git-commit\",\"filePath\":\"blog/2019/03/27/concourse-pipeline-to-build-a-docker-image-automatically-on-git-commit.mdx\",\"toc\":[{\"value\":\"Our Project Setup\",\"url\":\"#our-project-setup\",\"depth\":2},{\"value\":\"Our Pipeline\",\"url\":\"#our-pipeline\",\"depth\":2},{\"value\":\"Set the Pipeline:\",\"url\":\"#set-the-pipeline\",\"depth\":2},{\"value\":\"Test your Pipeline\",\"url\":\"#test-your-pipeline\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Concourse Pipeline to Build a Docker Image Automatically on Git Commit\",\"datePublished\":\"2019-03-27T21:50:54.000Z\",\"dateModified\":\"2019-03-27T21:50:54.000Z\",\"description\":\"Automatically Build and Push a Docker Image to Docker Hub using Concourse whenever a Git Commit is Published\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2019/03/27/concourse-pipeline-to-build-a-docker-image-automatically-on-git-commit\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Ship your Logs to Elasticsearch with Filebeat\",\"date\":\"2019-03-27T14:52:21.000Z\",\"tags\":[\"filebeat\",\"logging\",\"kibana\",\"elasticsearch\"],\"draft\":false,\"summary\":\"Ship your Logs to Elasticsearch with Filebeat\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"3 min read\",\"minutes\":2.845,\"time\":170700,\"words\":569},\"slug\":\"2019/03/27/ship-your-logs-to-elasticsearch-with-filebeat\",\"path\":\"blog/2019/03/27/ship-your-logs-to-elasticsearch-with-filebeat\",\"filePath\":\"blog/2019/03/27/ship-your-logs-to-elasticsearch-with-filebeat.mdx\",\"toc\":[{\"value\":\"Filebeat Overview\",\"url\":\"#f
1ilebeat-overview\",\"depth\":2},{\"value\":\"Installing Filebeat\",\"url\":\"#installing-filebeat\",\"depth\":2},{\"value\":\"Configure Filebeat\",\"url\":\"#configure-filebeat\",\"depth\":2},{\"value\":\"Filebeat Modules\",\"url\":\"#filebeat-modules\",\"depth\":2},{\"value\":\"Kibana\",\"url\":\"#kibana\",\"depth\":2},{\"value\":\"Resources:\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Ship your Logs to Elasticsearch with Filebeat\",\"datePublished\":\"2019-03-27T14:52:21.000Z\",\"dateModified\":\"2019-03-27T14:52:21.000Z\",\"description\":\"Ship your Logs to Elasticsearch with Filebeat\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2019/03/27/ship-your-logs-to-elasticsearch-with-filebeat\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"How to Deploy a Docker Swarm Cluster on Scaleway with Terraform\",\"date\":\"2019-03-21T06:15:07.000Z\",\"tags\":[\"docker\",\"swarm\",\"scaleway\",\"terraform\",\"devops\"],\"draft\":false,\"summary\":\"How to Deploy a Docker Swarm Cluster on Scaleway with Terraform\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"7 min read\",\"minutes\":6.33,\"time\":379800,\"words\":1266},\"slug\":\"2019/03/21/how-to-deploy-a-docker-swarm-cluster-on-scaleway-with-terraform\",\"path\":\"blog/2019/03/21/how-to-deploy-a-docker-swarm-cluster-on-scaleway-with-terraform\",\"filePath\":\"blog/2019/03/21/how-to-deploy-a-docker-swarm-cluster-on-scaleway-with-terraform.mdx\",\"toc\":[{\"value\":\"Pre-Requisites\",\"url\":\"#pre-requisites\",\"depth\":2},{\"value\":\"Terraform\",\"url\":\"#terraform\",\"depth\":2},{\"value\":\"Deploy your Swarm\",\"url\":\"#deploy-your-swarm\",\"depth\":2},{\"value\":\"References:\",\"url\":\"#references\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"How to Deploy a Docker Swarm Cluster on Scaleway with Terraform\",\"datePublished\":\"2019-03-21T06:15:07.000Z\",\"dateModified\":\"2019-03-21T06:15:07.000Z\",\"description\":\"How to Deploy a Docker Swarm Cluster on Scaleway with Terraform\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2019/03/21/how-to-deploy-a-docker-swarm-cluster-on-scaleway-with-terraform\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Deploy Scaleway Servers via the API in Python\",\"date\":\"2019-03-20T23:04:00.000Z\",\"tags\":[\"scaleway\",\"python\",\"api\",\"programming\"],\"draft\":false,\"summary\":\"Deploy Scaleway Servers via the API in Python\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"2 min read\",\"minutes\":1.845,\"time\":110700,\"words\":369},\"slug\":\"2019/03/20/deploy-scaleway-servers-via-the-api-in-python\",\"path\":\"blog/2019/03/20/deploy-scaleway-servers-via-the-api-in-python\",\"filePath\":\"blog/2019/03/20/deploy-scaleway-servers-via-the-api-in-python.mdx\",\"toc\":[{\"value\":\"API Documentation\",\"url\":\"#api-documentation\",\"depth\":2},{\"value\":\"Python\",\"url\":\"#python\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Deploy Scaleway Servers via the API in Python\",\"datePublished\":\"2019-03-20T23:04:00.000Z\",\"dateModified\":\"2019-03-20T23:04:00.000Z\",\"description\":\"Deploy Scaleway Servers via the API in Python\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2019/03/20/deploy-scaleway-servers-via-the-api-in-python\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Setup NRPE Client and Server for Monitoring Remote Services in Nagios\",\"date\":\"2019-03-18T16:49:59.000Z\",\"tags\":[\"nagios\",\"monitoring\",\"nrpe\",\"linux\"],\"draft\":false,\"summary\":\"Setup NRPE Client and Server for Monitoring Remote Services in Nagios\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"2 min read\",\"minutes\":1.415,\"time\":84900,\"words\":283},\"slug\":\"2019/03/18/setup-nrpe-client-and-server-for-monitoring-remote-services-in-nagios\",\"path\":\"blog/2019/03/18/setup-nrpe-client-and-server-for-monitoring-remote-services-in-nagios\",\"filePath\":\"blog/2019/03/18/setup-nrpe-client-and-server-for-monitoring-remote-services-in-nagios.mdx\",\"toc\":[{\"value\":\"Nagios NRPE\",\"url\":\"#nagios-nrpe\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Setup NRPE Client and Server for Monitoring Remote Services in Nagios\",\"datePublished\":\"2019-03-18T16:49:59.000Z\",\"dateModified\":\"2019-03-18T16:49:59.000Z\",\"description\":\"Setup NRPE Client and Server for Monitoring Remote Services in Nagios\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2019/03/18/setup-nrpe-client-and-server-for-monitoring-remote-services-in-nagios\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Monitor your First Host and Services with Nagios\",\"date\":\"2019-03-18T16:49:23.000Z\",\"tags\":[\"nagios\",\"monitoring\",\"linux\"],\"draft\":false,\"summary\":\"Monitor your First Host and Services with Nagios\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"3 min read\",\"minutes\":2.255,\"time\":135300,\"words\":451},\"slug\":\"2019/03/18/monitor-your-first-host-and-services-with-nagios\",\"path\":\"blog/2019/03/18/monitor-your-first-host-and-services-with-nagios\",\"filePath\":\"blog/2019/03/18/monitor-your-first-host-and-services-with-nagios.mdx\",\"toc\":[{\"value\":\"Configure Nagios to Monitor our first Host\",\"url\":\"#configure-nagios-to-monitor-our-first-host\",\"depth\":2},{\"value\":\"Up Next\",\"url\":\"#up-next\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Monitor your First Host and Services with Nagios\",\"datePublished\":\"2019-03-18T16:49:23.000Z\",\"dateModified\":\"2019-03-18T16:49:23.000Z\",\"description\":\"Monitor your First Host and Services with Nagios\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2019/03/18/monitor-your-first-host-and-services-with-nagios\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"How to Setup the NagiosGraph Plugin on Nagios Monitoring Server\",\"date\":\"2019-03-18T16:27:11.000Z\",\"tags\":[\"nagios\",\"monitoring\",\"linux\"],\"draft\":false,\"summary\":\"How to Setup the NagiosGraph Plugin on Nagios Monitoring Server\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"3 min read\",\"minutes\":2.89,\"time\":173400,\"words\":578},\"slug\":\"2019/03/18/how-to-setup-the-nagiosgraph-plugin-on-nagios-monitoring-server\",\"path\":\"blog/2019/03/18/how-to-setup-the-nagiosgraph-plugin-on-nagios-monitoring-server\",\"filePath\":\"blog/2019/03/18/how-to-setup-the-nagiosgraph-plugin-on-nagios-monitoring-server.mdx\",\"toc\":[{\"value\":\"NagiosGraph\",\"url\":\"#nagiosgraph\",\"depth\":2},{\"value\":\"Download and Install\",\"url\":\"#download-and-install\",\"depth\":2},{\"value\":\"Up Next\",\"url\":\"#up-next\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"How to Setup the NagiosGraph Plugin on Nagios Monitoring Server\",\"datePublished\":\"2019-03-18T16:27:11.000Z\",\"dateModified\":\"2019-03-18T16:27:11.000Z\",\"description\":\"How to Setup the NagiosGraph Plugin on Nagios Monitoring Server\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2019/03/18/how-to-setup-the-nagiosgraph-plugin-on-nagios-monitoring-server\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"How to Setup a Nagios Monitoring Server\",\"date\":\"2019-03-13T21:53:42.000Z\",\"tags\":[\"nagios\",\"monitoring\",\"linux\"],\"draft\":false,\"summary\":\"How to Setup a Nagios Monitoring Server\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"4 min read\",\"minutes\":3.065,\"time\":183900,\"words\":613},\"slug\":\"2019/03/13/how-to-setup-a-nagios-monitoring-server\",\"path\":\"blog/2019/03/13/how-to-setup-a-nagios-monitoring-server\",\"filePath\":\"blog/2019/03/13/how-to-setup-a-nagios-monitoring-server.mdx\",\"toc\":[{\"value\":\"What we are doing today\",\"url\":\"#what-we-are-doing-today\",\"depth\":2},{\"value\":\"Installing Dependencies:\",\"url\":\"#installing-dependencies\",\"depth\":2},{\"value\":\"Install Nagios\",\"url\":\"#install-nagios\",\"depth\":2},{\"value\":\"Install Nagios Plugins\",\"url\":\"#install-nagios-plugins\",\"depth\":2},{\"value\":\"Access Nagios\",\"url\":\"#access-nagios\",\"depth\":2},{\"value\":\"Up Next\",\"url\":\"#up-next\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"How to Setup a Nagios Monitoring Server\",\"datePublished\":\"2019-03-13T21:53:42.000Z\",\"dateModified\":\"2019-03-13T21:53:42.000Z\",\"description\":\"How to Setup a Nagios Monitoring Server\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2019/03/13/how-to-setup-a-nagios-monitoring-server\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Setup a Reverse Proxy on Nginx for your Backend Applications\",\"date\":\"2019-03-09T22:50:32.000Z\",\"tags\":[\"nginx\",\"reverse-proxy\",\"flask\"],\"draft\":false,\"summary\":\"Setup a Reverse Proxy on Nginx for your Backend Applications\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"2 min read\",\"minutes\":1.495,\"time\":89700,\"words\":299},\"slug\":\"2019/03/09/setup-a-reverse-proxy-on-nginx-for-your-backend-applications\",\"path\":\"blog/2019/03/09/setup-a-reverse-proxy-on-nginx-for-your-backend-applications\",\"filePath\":\"blog/2019/03/09/setup-a-reverse-proxy-on-nginx-for-your-backend-applications.mdx\",\"toc\":[{\"value\":\"Our Setup\",\"url\":\"#our-setup\",\"depth\":2},{\"value\":\"Our Backend Application\",\"url\":\"#our-backend-application\",\"depth\":2},{\"value\":\"Nginx\",\"url\":\"#nginx\",\"depth\":2},{\"value\":\"Test your Application:\",\"url\":\"#test-your-application\",\"depth\":2},{\"value\":\"Resoures\",\"url\":\"#resoures\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Setup a Reverse Proxy on Nginx for your Backend Applications\",\"datePublished\":\"2019-03-09T22:50:32.000Z\",\"dateModified\":\"2019-03-09T22:50:32.000Z\",\"description\":\"Setup a Reverse Proxy on Nginx for your Backend Applications\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2019/03/09/setup-a-reverse-proxy-on-nginx-for-your-backend-applications\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Create Users Databases and Granting Access for Users on PostgreSQL\",\"date\":\"2019-03-06T21:28:25.000Z\",\"tags\":[\"postgresql\",\"databases\"],\"draft\":false,\"summary\":\"This tutorial will demonstrate how to create user databases and granting access for users on postgresql.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"2 min read\",\"minutes\":1.325,\"time\":79500,\"words\":265},\"slug\":\"2019/03/06/create-users-databases-and-granting-access-for-users-on-postgresql\",\"path\":\"blog/2019/03/06/create-users-databases-and-granting-access-for-users-on-postgresql\",\"filePath\":\"blog/2019/03/06/create-users-databases-and-granting-access-for-users-on-postgresql.mdx\",\"toc\":[{\"value\":\"Create and Apply Permissions\",\"url\":\"#create-and-apply-permissions\",\"depth\":2},{\"value\":\"Allowing Remote Conenctions\",\"url\":\"#allowing-remote-conenctions\",\"depth\":2},{\"value\":\"PostgreSQL Client\",\"url\":\"#postgresql-client\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Create Users Databases and Granting Access for Users on PostgreSQL\",\"datePublished\":\"2019-03-06T21:28:25.000Z\",\"dateModified\":\"2019-03-06T21:28:25.000Z\",\"description\":\"This tutorial will demonstrate how to create user databases and granting access for users on postgresql.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2019/03/06/create-users-databases-and-granting-access-for-users-on-postgresql\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Setup a 3 Node Replicated Storage Volume with GlusterFS\",\"date\":\"2019-03-05T19:01:37.000Z\",\"tags\":[\"glusterfs\",\"storage\",\"clustering\",\"linux\"],\"draft\":false,\"summary\":\"This tutorial will demonstrate how to setup a 3 node Replicated Storage Volume with GlusterFS\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"6 min read\",\"minutes\":5.45,\"time\":327000,\"words\":1090},\"slug\":\"2019/03/05/setup-a-3-node-replicated-storage-volume-with-glusterfs\",\"path\":\"blog/2019/03/05/setup-a-3-node-replicated-storage-volume-with-glusterfs\",\"filePath\":\"blog/2019/03/05/setup-a-3-node-replicated-storage-volume-with-glusterfs.mdx\",\"toc\":[{\"value\":\"What will we be doing today with GlusterFS?\",\"url\":\"#what-will-we-be-doing-today-with-glusterfs\",\"depth\":2},{\"value\":\"Getting Started:\",\"url\":\"#getting-started\",\"depth\":2}
1,{\"value\":\"Installing GlusterFS on Each Node:\",\"url\":\"#installing-glusterfs-on-each-node\",\"depth\":2},{\"value\":\"Create the Replicated GlusterFS Volume:\",\"url\":\"#create-the-replicated-glusterfs-volume\",\"depth\":2},{\"value\":\"Security:\",\"url\":\"#security\",\"depth\":2},{\"value\":\"Mount the GlusterFS Volume to the Host:\",\"url\":\"#mount-the-glusterfs-volume-to-the-host\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Setup a 3 Node Replicated Storage Volume with GlusterFS\",\"datePublished\":\"2019-03-05T19:01:37.000Z\",\"dateModified\":\"2019-03-05T19:01:37.000Z\",\"description\":\"This tutorial will demonstrate how to setup a 3 node Replicated Storage Volume with GlusterFS\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2019/03/05/setup-a-3-node-replicated-storage-volume-with-glusterfs\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Container Persistent Storage for Docker Swarm using a GlusterFS Volume Plugin\",\"date\":\"2019-03-05T18:18:30.000Z\",\"tags\":[\"docker\",\"swarm\",\"glusterfs\",\"storage\",\"linux\"],\"draft\":false,\"summary\":\"This tutorial will demonstrate how to provide persistent storage for Docker Swarm using a GlusterFS Volume Plugin\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"4 min read\",\"minutes\":3.895,\"time\":233700,\"words\":779},\"slug\":\"2019/03/05/container-persistent-storage-for-docker-swarm-using-a-glusterfs-volume-plugin\",\"path\":\"blog/2019/03/05/container-persistent-storage-for-docker-swarm-using-a-glusterfs-volume-plugin\",\"filePath\":\"blog/2019/03/05/container-persistent-storage-for-docker-swarm-using-a-glusterfs-volume-plugin.mdx\",\"toc\":[{\"value\":\"What we will be doing today\",\"url\":\"#what-we-will-be-doing-today\",\"depth\":2},{\"value\":\"Setup GlusterFS\",\"url\":\"#setup-glusterfs\",\"depth\":2},{\"value\":\"Install the GlusterFS Volume Plugin\",\"url\":\"#install-the-glusterfs-volume-plugin\",\"depth\":2},{\"value\":\"Create a Service in Docker Swarm\",\"url\":\"#create-a-service-in-docker-swarm\",\"depth\":2},{\"value\":\"Testing Data Persistence\",\"url\":\"#testing-data-persistence\",\"depth\":2},{\"value\":\"Resources\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Container Persistent Storage for Docker Swarm using a GlusterFS Volume Plugin\",\"datePublished\":\"2019-03-05T18:18:30.000Z\",\"dateModified\":\"2019-03-05T18:18:30.000Z\",\"description\":\"This tutorial will demonstrate how to provide persistent storage for Docker Swarm using a GlusterFS Volume Plugin\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2019/03/05/container-persistent-storage-for-docker-swarm-using-a-glusterfs-volume-plugin\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Setup a Distributed Storage Volume with GlusterFS\",\"date\":\"2019-03-04T20:32:53.000Z\",\"tags\":[\"glusterfs\",\"storage\",\"clustering\",\"linux\"],\"draft\":false,\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"6 min read\",\"minutes\":5.135,\"time\":308100,\"words\":1027},\"slug\":\"2019/03/04/setup-a-distributed-storage-volume-with-glusterfs\",\"path\":\"blog/2019/03/04/setup-a-distributed-storage-volume-with-glusterfs\",\"filePath\":\"blog/2019/03/04/setup-a-distributed-storage-volume-with-glusterfs.mdx\",\"toc\":[{\"value\":\"Different GlusterFS Volume Types:\",\"url\":\"#different-glusterfs-volume-types\",\"depth\":2},{\"value\":\"Setup a Distributed Gluster Volume:\",\"url\":\"#setup-a-distributed-gluster-volume\",\"depth\":2},{\"value\":\"Setup: Our Environment\",\"url\":\"#setup-our-environment\",\"depth\":2},{\"value\":\"Install GlusterFS from the Package Manager:\",\"url\":\"#install-glusterfs-from-the-package-manager\",\"depth\":2},{\"value\":\"Format and Prepare the Gluster Disks:\",\"url\":\"#format-and-prepare-the-gluster-disks\",\"depth\":2},{\"value\":\"Start GlusterFS Service:\",\"url\":\"#start-glusterfs-service\",\"depth\":2},{\"value\":\"Discover All the Nodes for our Cluster:\",\"url\":\"#discover-all-the-nodes-for-our-cluster\",\"depth\":2},{\"value\":\"Create the Distributed GlusterFS Volume:\",\"url\":\"#create-the-distributed-glusterfs-volume\",\"depth\":2},{\"value\":\"Start the GlusterFS Volume:\",\"url\":\"#start-the-glusterfs-volume\",\"depth\":2},{\"value\":\"Mounting our GlusterFS Volume:\",\"url\":\"#mounting-our-glusterfs-volume\",\"depth\":2},{\"value\":\"Resources:\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Setup a Distributed Storage Volume with GlusterFS\",\"datePublished\":\"2019-03-04T20:32:53.000Z\",\"dateModified\":\"2019-03-04T20:32:53.000Z\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2019/03/04/setup-a-distributed-storage-volume-with-glusterfs\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Use Swarm Managed Configs in Docker Swarm to store your Application Configs\",\"date\":\"2019-02-28T14:48:28.000Z\",\"tags\":[\"docker\",\"swarm\",\"configs\",\"configuration-management\"],\"draft\":false,\"summary\":\"This tutorial will demonstrate how to use Docker Swarm managed configs in Docker Swarm to store your application configs.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"3 min read\",\"minutes\":2.955,\"time\":177300,\"words\":591},\"slug\":\"2019/02/28/use-swarm-managed-configs-in-docker-swarm-to-store-your-application-configs\",\"path\":\"blog/2019/02/28/use-swarm-managed-configs-in-docker-swarm-to-store-your-application-configs\",\"filePath\":\"blog/2019/02/28/use-swarm-managed-configs-in-docker-swarm-to-store-your-application-configs.mdx\",\"toc\":[{\"value\":\"Creating the Config\",\"url\":\"#creating-the-config\",\"depth\":2},{\"value\":\"Create the Service\",\"url\":\"#create-the-service\",\"depth\":2},{\"value\":\"Create the Service using Compose:\",\"url\":\"#create-the-service-using-compose\",\"depth\":2},{\"value\":\"Resources:\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Use Swarm Managed Configs in Docker Swarm to store your Application Configs\",\"datePublished\":\"2019-02-28T14:48:28.000Z\",\"dateModified\":\"2019-02-28T14:48:28.000Z\",\"description\":\"This tutorial will demonstrate how to use Docker Swarm managed configs in Docker Swarm to store your application configs.\",\"
1image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2019/02/28/use-swarm-managed-configs-in-docker-swarm-to-store-your-application-configs\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"How to Validate Strings in Python with Regex\",\"date\":\"2019-02-27T11:47:53.000Z\",\"tags\":[\"python\",\"regex\",\"validation\",\"scripting\"],\"draft\":false,\"summary\":\"This tutorial will demonstrate how to Validate Strings in Python with Regex.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"2 min read\",\"minutes\":1.49,\"time\":89400,\"words\":298},\"slug\":\"2019/02/27/how-to-validate-strings-in-python-with-regex\",\"path\":\"blog/2019/02/27/how-to-validate-strings-in-python-with-regex\",\"filePath\":\"blog/2019/02/27/how-to-validate-strings-in-python-with-regex.mdx\",\"toc\":[{\"value\":\"The Scenario\",\"url\":\"#the-scenario\",\"depth\":2},{\"value\":\"The Script\",\"url\":\"#the-script\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"How to Validate Strings in Python with Regex\",\"datePublished\":\"2019-02-27T11:47:53.000Z\",\"dateModified\":\"2019-02-27T11:47:53.000Z\",\"description\":\"This tutorial will demonstrate how to Validate Strings in Python with Regex.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2019/02/27/how-to-validate-strings-in-python-with-regex\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"How to Tag all your AWS IAM Users with Python\",\"date\":\"2019-02-25T11:44:55.000Z\",\"tags\":[\"aws\",\"iam\",\"python\",\"boto3\",\"scripting\"],\"draft\":false,\"summary\":\"This tutorial will demonstrate how to Tag all your AWS IAM Users with Python.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"2 min read\",\"minutes\":1.615,\"time\":96900,\"words\":323},\"slug\":\"2019/02/25/how-to-tag-all-your-aws-iam-users-with-python\",\"path\":\"blog/2019/02/25/how-to-tag-all-your-aws-iam-users-with-python\",\"filePath\":\"blog/2019/02/25/how-to-tag-all-your-aws-iam-users-with-python.mdx\",\"toc\":[{\"value\":\"Batch Tagging AWS IAM Users with Python\",\"url\":\"#batch-tagging-aws-iam-users-with-python\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"How to Tag all your AWS IAM Users with Python\",\"datePublished\":\"2019-02-25T11:44:55.000Z\",\"dateModified\":\"2019-02-25T11:44:55.000Z\",\"description\":\"This tutorial will demonstrate how to Tag all your AWS IAM Users with Python.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2019/02/25/how-to-tag-all-your-aws-iam-users-with-python\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Building Python Serverless Slack Apps on OpenFaas\",\"date\":\"2019-02-21T21:29:15.000Z\",\"tags\":[\"openfaas\",\"serverless\",\"slack\",\"python\"],\"draft\":false,\"summary\":\"This tutorial will demonstrate how to build python serverless slack apps on OpenFaas\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"6 min read\",\"minutes\":5.65,\"time\":339000,\"words\":1130},\"slug\":\"2019/02/21/building-python-serverless-slack-apps-on-openfaas\",\"path\":\"blog/2019/02/21/building-python-serverless-slack-apps-on-openfaas\",\"filePath\":\"blog/2019/02/21/building-python-serverless-slack-apps-on-openfaas.mdx\",\"toc\":[{\"value\":\"What are we doing today?\",\"url\":\"#what-are-we-doing-today\",\"depth\":2},{\"value\":\"Deploying OpenFaas\",\"url\":\"#deploying-openfaas\",\"depth\":2},{\"value\":\"Create the Functions\",\"url\":\"#create-the-functions\",\"depth\":2},{\"value\":\"Create the Slack App\",\"url\":\"#create-the-slack-app\",\"depth\":2},{\"value\":\"Test your Slack App\",\"url\":\"#test-your-slack-app\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Building Python Serverless Slack Apps on OpenFaas\",\"datePublished\":\"2019-02-21T21:29:15.000Z\",\"dateModified\":\"2019-02-21T21:29:15.000Z\",\"description\":\"This tutorial will demonstrate how to build python serverless slack apps on OpenFaas\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2019/02/21/building-python-serverless-slack-apps-on-openfaas\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Parallel Processing on AWS Lambda with Python using Multiprocessing\",\"date\":\"2019-02-19T14:39:47.000Z\",\"tags\":[\"aws\",\"lambda\",\"python\"],\"draft\":false,\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"2 min read\",\"minutes\":1.25,\"time\":75000,\"words\":250},\"slug\":\"2019/02/19/parallel-processing-on-aws-lambda-with-python-using-multiprocessing\",\"path\":\"blog/2019/02/19/parallel-processing-on-aws-lambda-with-python-using-multiprocessing\",\"filePath\":\"blog/2019/02/19/parallel-processing-on-aws-lambda-with-python-using-multiprocessing.mdx\",\"toc\":[{\"value\":\"Parallel Processing on Lambda Example\",\"url\":\"#parallel-processing-on-lambda-example\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Parallel Processing on AWS Lambda with Python using Multiprocessing\",\"datePublished\":\"2019-02-19T14:39:47.000Z\",\"dateModified\":\"2019-02-19T14:39:47.000Z\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2019/02/19/parallel-processing-on-aws-lambda-with-python-using-multiprocessing\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Sharing Global Variables in Python using Multiprocessing\",\"date\":\"2019-02-19T14:02:43.000Z\",\"tags\":[\"python\",\"multiprocessing\",\"programming\"],\"draft\":false,\"summary\":\"This tutorial will demonstrate how to share global variables in python using multiprocessing.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"2 min read\",\"minutes\":1.505,\"time\":90300,\"words\":301},\"slug\":\"2019/02/19/sharing-global-variables-in-python-using-multiprocessing\",\"path\":\"blog/2019/02/19/sharing-global-variables-in-python-using-multiprocessing\",\"filePath\":\"blog/2019/02/19/sharing-global-variables-in-python-using-multiprocessing.mdx\",\"toc\":[{\"value\":\"Example of the Issue\",\"url\":\"#example-of-the-issue\",\"depth\":2},{\"value\":\"Resolution\",\"url\":\"#resolution\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Sharing Global Variables in Python using Multiprocessing\",\"datePublished\":\"2019-02-19T14:02:43.000Z\",\"dateModified\":\"2019-02-19T14:02:43.000Z\",\"description\":\"This tutorial will demonstrate how to share global variables in python using multiprocessing.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2019/02/19/sharing-global-variables-in-python-using-multiprocessing\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Parallel Processing with Python and Multiprocessing using Queue\",\"date\":\"2019-02-19T13:05:47.000Z\",\"tags\":[\"python\",\"multiprocessing\",\"programming\"],\"draft\":false,\"summary\":\"This tutorial will demonstrate how to Parallel Processing with Python and Multiprocessing using Queue\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"3 min read\",\"minutes\":2.49,\"time\":149400,\"words\":498},\"slug\":\"2019/02/19/parallel-processing-with-python-and-multiprocessing-using-queue\",\"path\":\"blog/2019/02/19/parallel-processing-with-python-and-multiprocessing-using-queue\",\"filePath\":\"blog/2019/02/19/parallel-processing-with-python-and-multiprocessing-using-queue.mdx\",\"toc\":[{\"value\":\"The task to be achieved\",\"url\":\"#the-task-to-be-achieved\",\"depth\":2},{\"value\":\"Multiprocesing Queues\",\"url\":\"#multiprocesing-queues\",\"depth\":2},{\"value\":\"Our Workflow\",\"url\":\"#our-workflow\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Parallel Processing with Python and Multiprocessing using Queue\",\"datePublished\":\"2019-02-19T13:05:47.000Z\",\"dateModified\":\"2019-02-19T13:05:47.000Z\",\"description\":\"This tutorial will demonstrate how to Parallel Processing with Python and Multiprocessing using Queue\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2019/02/19/parallel-processing-with-python-and-multiprocessing-using-queue\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Concourse Pipeline with Resources Tutorial\",\"date\":\"2019-02-14T20:58:10.000Z\",\"tags\":[\"concourse\",\"pipelines\",\"cicd\",\"devops\"],\"draft\":false,\"summary\":\"This is a tutorial about concourse-ci pipeline with resources.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"2 min read\",\"minutes\":1.715,\"time\":102900,\"words\":343},\"slug\":\"2019/02/14/concourse-pipeline-with-resources-tutorial\",\"path\":\"blog/2019/02/14/concourse-pipeline-with-resources-tutorial\",\"filePath\":\"blog/2019/02/14/concourse-pipeline-with-resources-tutorial.mdx\",\"toc\":[{\"value\":\"Concourse Github Resourse Example\",\"url\":\"#concourse-github-resourse-example\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Concourse Pipeline with Resources Tutorial\",\"datePublished\":\"2019-02-14T20:58:10.000Z\",\"dateModified\":\"2019-02-14T20:58:10.000Z\",\"description\":\"This is a tutorial about concourse-ci pipeline with resources.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2019/02/14/concourse-pipeline-with-resources-tutorial\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"How to Cache Data with Python Flask\",\"date\":\"2019-02-14T11:37:30.000Z\",\"tags\":[\"python\",\"flask\",\"caching\"],\"draft\":false,\"summary\":\"This tutorial will demonstrate how to cache data with python flask.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"2 min read\",\"minutes\":1.515,\"time\":90900,\"words\":303},\"slug\":\"2019/02/14/how-to-cache-data-with-python-flask\",\"path\":\"blog/2019/02/14/how-to-cache-data-with-python-flask\",\"filePath\":\"blog/2019/02/14/how-to-cache-data-with-python-flask.mdx\",\"toc\":[{\"value\":\"Example\",\"url\":\"#example\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"How to Cache Data with Python Flask\",\"datePublished\":\"2019-02-14T11:37:30.000Z\",\"dateModified\":\"2019-02-14T11:37:30.000Z\",\"description\":\"This tutorial will demonstrate how to cache data with python flask.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2019/02/14/how-to-cache-data-with-python-flask\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Concourse Tasks and Inputs Tutorial\",\"date\":\"2019-02-12T19:57:27.
1000Z\",\"tags\":[\"concourse\",\"devops\",\"ci\"],\"draft\":false,\"summary\":\"Concourse Tasks and Inputs Tutorial\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"4 min read\",\"minutes\":3.935,\"time\":236100,\"words\":787},\"slug\":\"2019/02/12/concourse-tasks-and-inputs-tutorial\",\"path\":\"blog/2019/02/12/concourse-tasks-and-inputs-tutorial\",\"filePath\":\"blog/2019/02/12/concourse-tasks-and-inputs-tutorial.mdx\",\"toc\":[{\"value\":\"Task Inputs\",\"url\":\"#task-inputs\",\"depth\":2},{\"value\":\"Tasks Inputs: Specify Path\",\"url\":\"#tasks-inputs-specify-path\",\"depth\":2},{\"value\":\"Task Inputs: Parent Directory\",\"url\":\"#task-inputs-parent-directory\",\"depth\":2},{\"value\":\"Task Scripts:\",\"url\":\"#task-scripts\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Concourse Tasks and Inputs Tutorial\",\"datePublished\":\"2019-02-12T19:57:27.000Z\",\"dateModified\":\"2019-02-12T19:57:27.000Z\",\"description\":\"Concourse Tasks and Inputs Tutorial\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2019/02/12/concourse-tasks-and-inputs-tutorial\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Sysadmin Linux Troubleshooting Cheatsheet\",\"date\":\"2019-02-10T19:17:54.000Z\",\"tags\":[\"linux\",\"sysadmin\",\"cheatsheet\",\"troubleshooting\"],\"draft\":false,\"summary\":\"Sysadmin Linux Troubleshooting Cheatsheet\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"4 min read\",\"minutes\":3.46,\"time\":207600,\"words\":692},\"slug\":\"2019/02/10/sysadmin-linux-troubleshooting-cheatsheet\",\"path\":\"blog/2019/02/10/sysadmin-linux-troubleshooting-cheatsheet\",\"filePath\":\"blog/2019/02/10/sysadmin-linux-troubleshooting-cheatsheet.mdx\",\"toc\":[{\"value\":\"Curl / Web Response Times\",\"url\":\"#curl--web-response-times\",\"depth\":2},{\"value\":\"MTR / Network Latencies / Packetloss\",\"url\":\"#mtr--network-latencies--packetloss\",\"depth\":2},{\"value\":\"TCPTraceroute\",\"url\":\"#tcptraceroute\",\"depth\":2},{\"value\":\"Connection Related:\",\"url\":\"#connection-related\",\"depth\":2},{\"value\":\"Network Throughput\",\"url\":\"#network-throughput\",\"depth\":2},{\"value\":\"Resources\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Sysadmin Linux Troubleshooting Cheatsheet\",\"datePublished\":\"2019-02-10T19:17:54.000Z\",\"dateModified\":\"2019-02-10T19:17:54.000Z\",\"description\":\"Sysadmin Linux Troubleshooting Cheatsheet\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2019/02/10/sysadmin-linux-troubleshooting-cheatsheet\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Port Status Checker Script in C Language\",\"date\":\"2019-02-08T13:56:11.000Z\",\"tags\":[\"c\",\"linux\",\"programming\",\"scripting\"],\"draft\":false,\"summary\":\"Port Status Checker Script in C Language\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"2 min read\",\"minutes\":1.255,\"time\":75300,\"words\":251},\"slug\":\"2019/02/08/port-status-checker-script-in-c-language\",\"path\":\"blog/2019/02/08/port-status-checker-script-in-c-language\",\"filePath\":\"blog/2019/02/08/port-status-checker-script-in-c-language.mdx\",\"toc\":[{\"value\":\"Requirements:\",\"url\":\"#requirements\",\"depth\":2},{\"value\":\"Check TCP Port Status in C Language:\",\"url\":\"#check-tcp-port-status-in-c-language\",\"depth\":2},{\"value\":\"Compile:\",\"url\":\"#compile\",\"depth\":2},{\"value\":\"Execute:\",\"url\":\"#execute\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Port Status Checker Script in C Language\",\"datePublished\":\"2019-02-08T13:56:11.000Z\",\"dateModified\":\"2019-02-08T13:56:11.000Z\",\"description\":\"Port Status Checker Script in C Language\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2019/02/08/port-status-checker-script-in-c-language\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"The AWS CLI Cheatsheet for Bash\",\"date\":\"2019-02-07T08:24:12.000Z\",\"tags\":[\"aws\",\"bash\",\"cli\"],\"draft\":false,\"summary\":\"The AWS CLI Cheatsheet for Bash\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"2 min read\",\"minutes\":1.79,\"time\":107400,\"words\":358},\"slug\":\"2019/02/07/the-aws-cli-cheatsheet-for-bash\",\"path\":\"blog/2019/02/07/the-aws-cli-cheatsheet-for-bash\",\"filePath\":\"blog/2019/02/07/the-aws-cli-cheatsheet-for-bash.mdx\",\"toc\":[{\"value\":\"RDS\",\"url\":\"#rds\",\"depth\":2},{\"value\":\"SSM Parameter Store:\",\"url\":\"#ssm-parameter-store\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"The AWS CLI Cheatsheet for Bash\",\"datePublished\":\"2019-02-07T08:24:12.000Z\",\"dateModified\":\"2019-02-07T08:24:12.000Z\",\"description\":\"The AWS CLI Cheatsheet for Bash\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2019/02/07/the-aws-cli-cheatsheet-for-bash\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Python Multiprocessing Tutorial\",\"date\":\"2019-02-05T15:05:49.000Z\",\"tags\":[\"python\",\"multiprocessing\",\"dynamodb\",\"aws\"],\"draft\":false,\"summary\":\"Python Multiprocessing Tutorial\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"3 min read\",\"minutes\":2.255,\"time\":135300,\"words\":451},\"slug\":\"2019/02/05/python-multiprocessing-tutorial\",\"path\":\"blog/2019/02/05/python-multiprocessing-tutorial\",\"filePath\":\"blog/2019/02/05/python-multiprocessing-tutorial.mdx\",\"toc\":[{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Python Multiprocessing Tutorial\",\"datePublished\":\"2019-02-05T15:05:49.000Z\",\"dateModified\":\"2019-02-05T15:05:49.000Z\",\"description\":\"Python Multiprocessing Tutorial\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2019/02/05/python-multiprocessing-tutorial\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Convert Float to Decimal Data Types for Boto3 DynamoDB using Python\",\"date\":\"2019-02-05T14:45:40.000Z\",\"tags\":[\"python\",\"programming\",\"dynamodb\",\"databases\"],\"draft\":false,\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"2 min read\",\"minutes\":1.255,\"time\":75300,\"words\":251},\"slug\":\"2019/02/05/convert-float-to-decimal-data-types-for-boto3-dynamodb-using-python\",\"path\":\"blog/2019/02/05/convert-float-to-decimal-data-types-for-boto3-dynamodb-using-python\",\"filePath\":\"blog/2019/02/05/convert-float-to-decimal-data-types-for-boto3-dynamodb-using-python.mdx\",\"toc\":[{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Convert Float to Decimal Data Types for Boto3 DynamoDB using Python\",\"datePublished\":\"2019-02-05T14:45:40.000Z\",\"dateModified\":\"2019-02-05T14:45:40.000Z\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2019/02/05/convert-float-to-decimal-data-types-for-boto3-dynamodb-using-python\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Paginate through IAM Users on AWS using Python and Boto3\",\"date\":\"2019-01-29T15:03:24.000Z\",\"tags\":[\"aws\",\"iam\",\"python\",\"programming\"],\"draft\":false,\"summary\":\"Paginate through IAM Users on AWS using Python and Boto3\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"1 min read\",\"minutes\":0.89,\"time\":53400,\"words\":178},\"slug\":\"2019/01/29/paginate-through-iam-users-on-aws-using-python-and-boto3\",\"path\":\"blog/2019/01/29/paginate-through-iam-users-on-aws-using-python-and-boto3\",\"filePath\":\"blog/2019/01/29/paginate-through-iam-users-on-aws-using-python-and-boto3.mdx\",\"toc\":[{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Paginate through IAM Users on AWS using Python and Boto3\",\"datePublished\":\"2019-01-29T15:03:24.000Z\",\"dateModified\":\"2019-01-29T15:03:24.000Z\",\"description\":\"Paginate through IAM Users on AWS using Python and Boto3\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2019/01/29/paginate-through-iam-users-on-aws-using-python-and-boto3\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Setup a 3 Node Docker Swarm Cluster on Ubuntu 16.04\",\"date\":\"2019-01-10T14:52:07.000Z\",\"tags\":[\"docker\",\"swarm\",\"ubuntu\",\"clustering\"],\"draft\":false,\"summary\":\"Setup a 3 Node Docker Swarm Cluster on Ubuntu 16.04\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"8 min read\",\"minutes\":7.29,\"time\":437400,\"words\":1458},\"slug\":\"2019/01/10/setup-a-3-node-docker-swarm-cluster-on-ubuntu-16-dot-04\",\"path\":\"blog/2019/01/10/setup-a-3-node-docker-swarm-cluster-on-ubuntu-16-dot-04\",\"filePath\":\"blog/2019/01/10/setup-a-3-node-docker-swarm-cluster-on-ubuntu-16-dot-04.mdx\",\"toc\":[{\"value\":\"Overview of What we will be Doing\",\"url\":\"#overview-of-what-we-will-be-doing\",\"depth\":2},{\"value\":\"Prerequisites\",\"url\":\"#prerequisites\",\"depth\":2},{\"value\":\"What is Docker\",\"url\":\"#what-is-docker\",\"depth\":2},{\"value\":\"Installing Docker Community Edition\",\"url\":\"#installing-docker-community-edition\",\"depth\":2},{\"value\":\"DNS Configuration\",\"url\":\"#dns-configuration\",\"depth\":2},{\"value\":\"Initialize the Swarm:\",\"url\":\"#initialize-the-swarm\",\"depth\":2},{\"value\":\"Reobtaining the Join Tokens\",\"url\":\"#reobtaining-the-join-tokens\",\"depth\":2},{\"value\":\"Deploying our First Service\",\"url\":\"#deploying-our-first-service\",\"depth\":2},{\"value\":\"Testing Nginx in our Swarm\",\"url\":\"#testing-nginx-in-our-swarm\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Setup a 3 Node Docker Swarm Cluster on Ubuntu 16.04\",\"datePublished\":\"2019-01-10T14:52:07.000Z\",\"dateModified\":\"2019-01-10T14:52:07.000Z\",\"description\":\"Setup a 3 Node Docker Swarm Cluster on Ubuntu 16.04\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2019/01/10/setup-a-3-node-docker-swarm-cluster-on-ubuntu-16-dot-04\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Fix Mac High Sierra opendlrectoryd Too many corpses being created issue\",\"date\":\"2019-01-07T11:57:56.
1000Z\",\"tags\":[\"mac\",\"sysadmin\"],\"draft\":false,\"summary\":\"Fix Mac High Sierra opendlrectoryd Too many corpses being created issue\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"2 min read\",\"minutes\":1.195,\"time\":71700,\"words\":239},\"slug\":\"2019/01/07/fix-mac-high-sierra-opendlrectoryd-too-many-corpses-being-created-issue\",\"path\":\"blog/2019/01/07/fix-mac-high-sierra-opendlrectoryd-too-many-corpses-being-created-issue\",\"filePath\":\"blog/2019/01/07/fix-mac-high-sierra-opendlrectoryd-too-many-corpses-being-created-issue.mdx\",\"toc\":[{\"value\":\"Steps to Resolution\",\"url\":\"#steps-to-resolution\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Fix Mac High Sierra opendlrectoryd Too many corpses being created issue\",\"datePublished\":\"2019-01-07T11:57:56.000Z\",\"dateModified\":\"2019-01-07T11:57:56.000Z\",\"description\":\"Fix Mac High Sierra opendlrectoryd Too many corpses being created issue\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2019/01/07/fix-mac-high-sierra-opendlrectoryd-too-many-corpses-being-created-issue\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Tutorial on using Gitlab CI/CD Pipelines to Deploy your Python Flask Restful API with Postgres on Heroku\",\"date\":\"2019-01-05T15:27:31.000Z\",\"tags\":[\"devops\",\"cicd\",\"gitlab\",\"python\",\"flask\",\"docker\",\"heroku\"],\"draft\":false,\"summary\":\"Tutorial on using Gitlab CI/CD Pipelines to Deploy your Python Flask Restful API with Postgres on Heroku\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"7 min read\",\"minutes\":6.955,\"time\":417300,\"words\":1391},\"slug\":\"2019/01/05/tutorial-on-using-gitlab-cicd-pipelines-to-deploy-your-python-flask-restful-api-with-postgres-on-heroku\",\"path\":\"blog/2019/01/05/tutorial-on-using-gitlab-cicd-pipelines-to-deploy-your-python-flask-restful-api-with-postgres-on-heroku\",\"filePath\":\"blog/2019/01/05/tutorial-on-using-gitlab-cicd-pipelines-to-deploy-your-python-flask-restful-api-with-postgres-on-heroku.mdx\",\"toc\":[{\"value\":\"Heroku\",\"url\":\"#heroku\",\"depth\":2},{\"value\":\"Heroku API Key\",\"url\":\"#heroku-api-key\",\"depth\":2},{\"value\":\"Heroku Postgres Add-on\",\"url\":\"#heroku-postgres-add-on\",\"depth\":2},{\"value\":\"Our Application Code\",\"url\":\"#our-application-code\",\"depth\":2},{\"value\":\"Send to Gitlab:\",\"url\":\"#send-to-gitlab\",\"depth\":2},{\"value\":\"Gitlab Pipelines\",\"url\":\"#gitlab-pipelines\",\"depth\":2},{\"value\":\"Creating the Tables on Postgres\",\"url\":\"#creating-the-tables-on-postgres\",\"depth\":2},{\"value\":\"Testing the API:\",\"url\":\"#testing-the-api\",\"depth\":2},{\"value\":\"Troubleshooting\",\"url\":\"#troubleshooting\",\"depth\":2},{\"value\":\"Resources:\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Tutorial on using Gitlab CI/CD Pipelines to Deploy your Python Flask Restful API with Postgres on Heroku\",\"datePublished\":\"2019-01-05T15:27:31.000Z\",\"dateModified\":\"2019-01-05T15:27:31.000Z\",\"description\":\"Tutorial on using Gitlab CI/CD Pipelines to Deploy your Python Flask Restful API with Postgres on Heroku\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2019/01/05/tutorial-on-using-gitlab-cicd-pipelines-to-deploy-your-python-flask-restful-api-with-postgres-on-heroku\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Setup a Gitlab Runner on your own Server to run your jobs that gets triggered from Gitlab CI\",\"date\":\"2018-12-20T09:21:16.000Z\",\"tags\":[\"devops\",\"ci\",\"gitlab\",\"docker\"],\"draft\":false,\"summary\":\"Setup a Gitlab Runner on your own Server to run your jobs that gets triggered from Gitlab CI\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"4 min read\",\"minutes\":3.55,\"time\":213000,\"words\":710},\"slug\":\"2018/12/20/setup-a-gitlab-runner-on-your-own-server-to-run-your-jobs-that-gets-triggered-from-gitlab-ci\",\"path\":\"blog/2018/12/20/setup-a-gitlab-runner-on-your-own-server-to-run-your-jobs-that-gets-triggered-from-gitlab-ci\",\"filePath\":\"blog/2018/12/20/setup-a-gitlab-runner-on-your-own-server-to-run-your-jobs-that-gets-triggered-from-gitlab-ci.mdx\",\"toc\":[{\"value\":\"Setup Docker\",\"url\":\"#setup-docker\",\"depth\":2},{\"value\":\"Install and Setup Gitlab Runner\",\"url\":\"#install-and-setup-gitlab-runner\",\"depth\":2},{\"value\":\"Gitlab-CI Config for Shared Runners\",\"url\":\"#gitlab-ci-config-for-shared-runners\",\"depth\":2},{\"value\":\"Gitlab-CI Config for your own Gitlab Runner\",\"url\":\"#gitlab-ci-config-for-your-own-gitlab-runner\",\"depth\":2}
1,{\"value\":\"Trigger and Check Docker\",\"url\":\"#trigger-and-check-docker\",\"depth\":2},{\"value\":\"Resources:\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Setup a Gitlab Runner on your own Server to run your jobs that gets triggered from Gitlab CI\",\"datePublished\":\"2018-12-20T09:21:16.000Z\",\"dateModified\":\"2018-12-20T09:21:16.000Z\",\"description\":\"Setup a Gitlab Runner on your own Server to run your jobs that gets triggered from Gitlab CI\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2018/12/20/setup-a-gitlab-runner-on-your-own-server-to-run-your-jobs-that-gets-triggered-from-gitlab-ci\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Local Dev Environment for Wordpress using Docker Compose\",\"date\":\"2018-12-19T13:33:44.000Z\",\"tags\":[\"docker\",\"wordpress\",\"dev-environment\",\"mysql\"],\"draft\":false,\"summary\":\"Local Dev Environment for Wordpress using Docker Compose\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"1 min read\",\"minutes\":1,\"time\":60000,\"words\":200},\"slug\":\"2018/12/19/local-dev-environment-for-wordpress-using-docker-compose\",\"path\":\"blog/2018/12/19/local-dev-environment-for-wordpress-using-docker-compose\",\"filePath\":\"blog/2018/12/19/local-dev-environment-for-wordpress-using-docker-compose.mdx\",\"toc\":[{\"value\":\"Docker Compose File\",\"url\":\"#docker-compose-file\",\"depth\":2},{\"value\":\"Launching our Wordpress Application:\",\"url\":\"#launching-our-wordpress-application\",\"depth\":2},{\"value\":\"Accessing Wordpress\",\"url\":\"#accessing-wordpress\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Local Dev Environment for Wordpress using Docker Compose\",\"datePublished\":\"2018-12-19T13:33:44.000Z\",\"dateModified\":\"2018-12-19T13:33:44.000Z\",\"description\":\"Local Dev Environment for Wordpress using Docker Compose\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2018/12/19/local-dev-environment-for-wordpress-using-docker-compose\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Local Dev Environment for Mediawiki using Docker Compose\",\"date\":\"2018-12-19T13:22:36.000Z\",\"tags\":[\"docker\",\"mediawiki\",\"dev-environment\",\"mysql\"],\"draft\":false,\"summary\":\"Local Dev Environment for Mediawiki using Docker Compose\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"2 min read\",\"minutes\":1.285,\"time\":77100,\"words\":257},\"slug\":\"2018/12/19/local-dev-environment-for-mediawiki-using-docker-compose\",\"path\":\"blog/2018/12/19/local-dev-environment-for-mediawiki-using-docker-compose\",\"filePath\":\"blog/2018/12/19/local-dev-environment-for-mediawiki-using-docker-compose.mdx\",\"toc\":[{\"value\":\"Docker Compose File\",\"url\":\"#docker-compose-file\",\"depth\":2},{\"value\":\"Launching our Mediawiki Application:\",\"url\":\"#launching-our-mediawiki-application\",\"depth\":2},{\"value\":\"Accessing Mediawiki\",\"url\":\"#accessing-mediawiki\",\"depth\":2},{\"value\":\"Resources:\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Local Dev Environment for Mediawiki using Docker Compose\",\"datePublished\":\"2018-12-19T13:22:36.000Z\",\"dateModified\":\"2018-12-19T13:22:36.000Z\",\"description\":\"Local Dev Environment for Mediawiki using Docker Compose\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2018/12/19/local-dev-environment-for-mediawiki-using-docker-compose\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Setup a Basic CI Pipeline on Gitlab\",\"date\":\"2018-12-19T10:43:00.000Z\",\"tags\":[\"devops\",\"cicd\",\"pipelines\",\"gitlab\"],\"draft\":false,\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"4 min read\",\"minutes\":3.96,\"time\":237600,\"words\":792},\"slug\":\"2018/12/19/setup-a-basic-ci-pipeline-on-gitlab\",\"path\":\"blog/2018/12/19/setup-a-basic-ci-pipeline-on-gitlab\",\"filePath\":\"blog/2018/12/19/setup-a-basic-ci-pipeline-on-gitlab.mdx\",\"toc\":[{\"value\":\"What will we be doing?\",\"url\":\"#what-will-we-be-doing\",\"depth\":2},{\"value\":\"Our Basic Pipeline\",\"url\":\"#our-basic-pipeline\",\"depth\":2},{\"value\":\"Setup the Pipeline:\",\"url\":\"#setup-the-pipeline\",\"depth\":2},{\"value\":\"Config Explained\",\"url\":\"#config-explained\",\"depth\":2},{\"value\":\"Push to Github\",\"url\":\"#push-to-github\",\"depth\":2},{\"value\":\"Gitlab Pipelines\",\"url\":\"#gitlab-pipelines\",\"depth\":2}
1,{\"value\":\"Fix the Pipeline Config\",\"url\":\"#fix-the-pipeline-config\",\"depth\":2},{\"value\":\"Great Success\",\"url\":\"#great-success\",\"depth\":2},{\"value\":\"Resources\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Setup a Basic CI Pipeline on Gitlab\",\"datePublished\":\"2018-12-19T10:43:00.000Z\",\"dateModified\":\"2018-12-19T10:43:00.000Z\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2018/12/19/setup-a-basic-ci-pipeline-on-gitlab\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Resizing Hetzner Cloud Block Storage Volumes on the Fly\",\"date\":\"2018-12-19T05:59:11.000Z\",\"tags\":[\"hetzner\",\"storage\",\"cloud\"],\"draft\":false,\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"5 min read\",\"minutes\":4.81,\"time\":288600,\"words\":962},\"slug\":\"2018/12/19/resizing-hetzner-cloud-block-storage-volumes-on-the-fly\",\"path\":\"blog/2018/12/19/resizing-hetzner-cloud-block-storage-volumes-on-the-fly\",\"filePath\":\"blog/2018/12/19/resizing-hetzner-cloud-block-storage-volumes-on-the-fly.mdx\",\"toc\":[{\"value\":\"What is Hetzner's Cloud Storage Volumes\",\"url\":\"#what-is-hetzners-cloud-storage-volumes\",\"depth\":2},{\"value\":\"Resizing of Volumes\",\"url\":\"#resizing-of-volumes\",\"depth\":2},{\"value\":\"Demo through Cloud Volumes\",\"url\":\"#demo-through-cloud-volumes\",\"depth\":2},{\"value\":\"Resources:\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Resizing Hetzner Cloud Block Storage Volumes on the Fly\",\"datePublished\":\"2018-12-19T05:59:11.000Z\",\"dateModified\":\"2018-12-19T05:59:11.000Z\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2018/12/19/resizing-hetzner-cloud-block-storage-volumes-on-the-fly\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Creating a UI in Python Flask and Bootstrap for our Serverless URL Shortener\",\"date\":\"2018-12-18T14:35:53.000Z\",\"tags\":[\"python\",\"flask\",\"bootstrap\",\"web-development\"],\"draft\":false,\"summary\":\"Creating a UI in Python Flask and Bootstrap for our Serverless URL Shortener\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"3 min read\",\"minutes\":2.305,\"time\":138300,\"words\":461},\"slug\":\"2018/12/18/creating-a-ui-in-python-flask-and-bootstrap-for-our-serverless-url-shortener\",\"path\":\"blog/2018/12/18/creating-a-ui-in-python-flask-and-bootstrap-for-our-serverless-url-shortener\",\"filePath\":\"blog/2018/12/18/creating-a-ui-in-python-flask-and-bootstrap-for-our-serverless-url-shortener.mdx\",\"toc\":[{\"value\":\"Dependencies:\",\"url\":\"#dependencies\",\"depth\":2},{\"value\":\"Application Code:\",\"url\":\"#application-code\",\"depth\":2},{\"value\":\"JavaScript\",\"url\":\"#javascript\",\"depth\":2},{\"value\":\"HTML\",\"url\":\"#html\",\"depth\":2},{\"value\":\"Run the Server\",\"url\":\"#run-the-server\",\"depth\":2},{\"value\":\"Dockerizing this Application\",\"url\":\"#dockerizing-this-application\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Creating a UI in Python Flask and Bootstrap for our Serverless URL Shortener\",\"datePublished\":\"2018-12-18T14:35:53.000Z\",\"dateModified\":\"2018-12-18T14:35:53.000Z\",\"description\":\"Creating a UI in Python Flask and Bootstrap for our Serverless URL Shortener\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2018/12/18/creating-a-ui-in-python-flask-and-bootstrap-for-our-serverless-url-shortener\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"VULTR Cloud Servers Limited Signup Promotion\",\"date\":\"2018-12-12T06:00:32.000Z\",\"tags\":[\"vultr\",\"cloud\",\"ssd\",\"linux\",\"servers\"],\"draft\":false,\"summary\":\"VULTR Cloud Servers Limited Signup Promotion\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"3 min read\",\"minutes\":2.385,\"time\":143100,\"words\":477},\"slug\":\"2018/12/12/vultr-cloud-servers-limited-singup-promotion\",\"path\":\"blog/2018/12/12/vultr-cloud-servers-limited-singup-promotion\",\"filePath\":\"blog/2018/12/12/vultr-cloud-servers-limited-singup-promotion.mdx\",\"toc\":[{\"value\":\"Promotion\",\"url\":\"#promotion\",\"depth\":2},{\"value\":\"About VULTR\",\"url\":\"#about-vultr\",\"depth\":2},{\"value\":\"VULTR Mission\",\"url\":\"#vultr-mission\",\"depth\":2},{\"value\":\"Launching a Server\",\"url\":\"#launching-a-server\",\"depth\":2},{\"value\":\"Overall\",\"url\":\"#overall\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"VULTR Cloud Servers Limited Signup Promotion\",\"datePublished\":\"2018-12-12T06:00:32.000Z\",\"dateModified\":\"2018-12-12T06:00:32.000Z\",\"description\":\"VULTR Cloud Servers Limited Signup Promotion\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2018/12/12/vultr-cloud-servers-limited-singup-promotion\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Python Flask Tutorial Series: Routing in Flask\",\"date\":\"2018-12-11T10:29:14.000Z\",\"tags\":[\"python\",\"flask\",\"flask-tutorial\",\"web-development\"],\"draft\":false,\"summary\":\"Python Flask Tutorial Series: Routing in Flask\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"5 min read\",\"minutes\":4.27,\"time\":256200,\"words\":854},\"slug\":\"2018/12/11/python-flask-tutorial-series-routing-in-flask-p3\",\"path\":\"blog/2018/12/11/python-flask-tutorial-series-routing-in-flask-p3\",\"filePath\":\"blog/2018/12/11/python-flask-tutorial-series-routing-in-flask-p3.mdx\",\"toc\":[{\"value\":\"Flask Views and Routing:\",\"url\":\"#flask-views-and-routing\",\"depth\":2},{\"value\":\"Some basic examples:\",\"url\":\"#some-basic-examples\",\"depth\":2}
1,{\"value\":\"URL Variables:\",\"url\":\"#url-variables\",\"depth\":2},{\"value\":\"Data Types in URL Routing:\",\"url\":\"#data-types-in-url-routing\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Python Flask Tutorial Series: Routing in Flask\",\"datePublished\":\"2018-12-11T10:29:14.000Z\",\"dateModified\":\"2018-12-11T10:29:14.000Z\",\"description\":\"Python Flask Tutorial Series: Routing in Flask\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2018/12/11/python-flask-tutorial-series-routing-in-flask-p3\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Python Flask Tutorial Series: Setup a Python Virtual Environment\",\"date\":\"2018-12-09T22:19:24.000Z\",\"tags\":[\"python\",\"flask\",\"flask-tutorial\",\"web-development\"],\"draft\":false,\"summary\":\"Python Flask Tutorial Series: Setup a Python Virtual Environment\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"3 min read\",\"minutes\":2.5,\"time\":150000,\"words\":500},\"slug\":\"2018/12/09/python-flask-tutorial-series-setup-a-python-virtual-environment-p2\",\"path\":\"blog/2018/12/09/python-flask-tutorial-series-setup-a-python-virtual-environment-p2\",\"filePath\":\"blog/2018/12/09/python-flask-tutorial-series-setup-a-python-virtual-environment-p2.mdx\",\"toc\":[{\"value\":\"What is VirtualEnv?\",\"url\":\"#what-is-virtualenv\",\"depth\":2},{\"value\":\"Setup a Virtual Environment:\",\"url\":\"#setup-a-virtual-environment\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Python Flask Tutorial Series: Setup a Python Virtual Environment\",\"datePublished\":\"2018-12-09T22:19:24.000Z\",\"dateModified\":\"2018-12-09T22:19:24.000Z\",\"description\":\"Python Flask Tutorial Series: Setup a Python Virtual Environment\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2018/12/09/python-flask-tutorial-series-setup-a-python-virtual-environment-p2\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"How to Setup a Serverless URL Shortener with API Gateway Lambda and DynamoDB on AWS\",\"date\":\"2018-11-30T07:51:24.000Z\",\"tags\":[\"aws\",\"serverless\",\"api-gateway\",\"lambda\",\"dynamodb\",\"python\"],\"draft\":false,\"summary\":\"How to Setup a Serverless URL Shortener with API Gateway Lambda and DynamoDB on AWS\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"9 min read\",\"minutes\":8.845,\"time\":530700,\"words\":1769},\"slug\":\"2018/11/30/how-to-setup-a-serverless-url-shortener-with-api-gateway-lambda-and-dynamodb-on-aws\",\"path\":\"blog/2018/11/30/how-to-setup-a-serverless-url-shortener-with-api-gateway-lambda-and-dynamodb-on-aws\",\"filePath\":\"blog/2018/11/30/how-to-setup-a-serverless-url-shortener-with-api-gateway-lambda-and-dynamodb-on-aws.mdx\",\"toc\":[{\"value\":\"Overview\",\"url\":\"#overview\",\"depth\":2},{\"value\":\"The Setup\",\"url\":\"#the-setup\",\"depth\":2},{\"value\":\"Creating the URL Shortener\",\"url\":\"#creating-the-url-shortener\",\"depth\":2},{\"value\":\"IAM Permissions\",\"url\":\"#iam-permissions\",\"depth\":2},{\"value\":\"DynamoDB Table\",\"url\":\"#dynamodb-table\",\"depth\":2},{\"value\":\"Lambda Functions\",\"url\":\"#lambda-functions\",\"depth\":2},{\"value\":\"API Gateway\",\"url\":\"#api-gateway\",\"depth\":2},{\"value\":\"ACM Certificates\",\"url\":\"#acm-certificates\",\"depth\":2},{\"value\":\"Route 53\",\"url\":\"#route-53\",\"depth\":2},{\"value\":\"Demo the URL Shortener Service:\",\"url\":\"#demo-the-url-shortener-service\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"How to Setup a Serverless URL Shortener with API Gateway Lambda and DynamoDB on AWS\",\"datePublished\":\"2018-11-30T07:51:24.000Z\",\"dateModified\":\"2018-11-30T07:51:24.000Z\",\"description\":\"How to Setup a Serverless URL Shortener with API Gateway Lambda and DynamoDB on AWS\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2018/11/30/how-to-setup-a-serverless-url-shortener-with-api-gateway-lambda-and-dynamodb-on-aws\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Python Flask Tutorial Series: Create a Hello World App\",\"date\":\"2018-11-27T13:36:20.000Z\",\"tags\":[\"python\",\"flask\",\"flask-tutorial\",\"web-development\"],\"draft\":false,\"summary\":\"Python Flask Tutorial Series: Create a Hello World App\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"4 min read\",\"minutes\":3.4,\"time\":204000,\"words\":680},\"slug\":\"2018/11/27/python-flask-tutorial-series-create-a-hello-world-app-p1\",\"path\":\"blog/2018/11/27/python-flask-tutorial-series-create-a-hello-world-app-p1\",\"filePath\":\"blog/2018/11/27/python-flask-tutorial-series-create-a-hello-world-app-p1.mdx\",\"toc\":[{\"value\":\"What is Python Flask\",\"url\":\"#what-is-python-flask\",\"depth\":2},{\"value\":\"Hello World in Python Flask\",\"url\":\"#hello-world-in-python-flask\",\"depth\":2},{\"value\":\"Creating your Traditional Hello World App\",\"url\":\"#creating-your-traditional-hello-world-app\",\"depth\":2},{\"value\":\"It's Running What Now?\",\"url\":\"#its-running-what-now\",\"depth\":2},{\"value\":\"Explaining the Application Code\",\"url\":\"#explaining-the-application-code\",\"depth\":2},{\"value\":\"Let's Extend our Hello World App\",\"url\":\"#lets-extend-our-hello-world-app\",\"depth\":2},{\"value\":\"Related Content\",\"url\":\"#related-content\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Python Flask Tutorial Series: Create a Hello World App\",\"datePublished\":\"2018-11-27T13:36:20.000Z\",\"dateModified\":\"2018-11-27T13:36:20.000Z\",\"description\":\"Python Flask Tutorial Series: Create a Hello World App\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2018/11/27/python-flask-tutorial-series-create-a-hello-world-app-p1\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Introduction to Python Flask: Tutorial Series\",\"date\":\"2018-11-27T13:28:33.000Z\",\"tags\":[\"python\",\"flask\",\"flask-tutorial\",\"web-development\"],\"draft\":false,\"summary\":\"Introduction to Python Flask: Tutorial Series\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"1 min read\",\"minutes\":0.655,\"time\":39300,\"words\":131},\"slug\":\"2018/11/27/introduction-to-python-flask-tutorial-series\",\"path\":\"blog/2018/11/27/introduction-to-python-flask-tutorial-series\",\"filePath\":\"blog/2018/11/27/introduction-to-python-flask-tutorial-series.mdx\",\"toc\":[{\"value\":\"What will be covered\",\"url\":\"#what-will-be-covered\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Introduction to Python Flask: Tutorial Series\",\"datePublished\":\"2018-11-27T13:28:33.000Z\",\"dateModified\":\"2018-11-27T13:28:33.000Z\",\"description\":\"Introduction to Python Flask: Tutorial Series\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2018/11/27/introduction-to-python-flask-tutorial-series\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Setup a Relayhost with Postfix to Send Mail via Sendgrid\",\"date\":\"2018-11-23T12:40:49.000Z\",\"tags\":[\"sendgrid\",\"email\",\"postfix\"],\"draft\":false,\"summary\":\"Setup a Relayhost with Postfix to Send Mail via Sendgrid\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"3 min read\",\"minutes\":2.425,\"time\":145500,\"words\":485},\"slug\":\"2018/11/23/setup-a-relayhost-with-postfix-to-send-mail-via-sendgrid\",\"path\":\"blog/2018/11/23/setup-a-relayhost-with-postfix-to-send-mail-via-sendgrid\",\"filePath\":\"blog/2018/11/23/setup-a-relayhost-with-postfix-to-send-mail-via-sendgrid.mdx\",\"toc\":[{\"value\":\"Access Control on Postfix\",\"url\":\"#access-control-on-postfix\",\"depth\":2},{\"value\":\"Sendgrid\",\"url\":\"#sendgrid\",\"depth\":2},{\"value\":\"Setup Postifx\",\"url\":\"#setup-postifx\",\"depth\":2},{\"value\":\"Send a Test Mail\",\"url\":\"#send-a-test-mail\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Setup a Relayhost with Postfix to Send Mail via Sendgrid\",\"datePublished\":\"2018-11-23T12:40:49.000Z\",\"dateModified\":\"2018-11-23T12:40:49.000Z\",\"description\":\"Setup a Relayhost with Postfix to Send Mail via Sendgrid\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2018/11/23/setup-a-relayhost-with-postfix-to-send-mail-via-sendgrid\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Setup a Golang Environment on Ubuntu\",\"date\":\"2018-11-22T22:09:29.000Z\",\"tags\":[\"golang\",\"golang-tutorial\",\"programming\"],\"draft\":false,\"summary\":\"Setup a Golang Environment on Ubuntu\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"2 min read\",\"minutes\":1.29,\"time\":77400,\"words\":258},\"slug\":\"2018/11/22/setup-a-golang-environment-on-ubuntu\",\"path\":\"blog/2018/11/22/setup-a-golang-environment-on-ubuntu\",\"filePath\":\"blog/2018/11/22/setup-a-golang-environment-on-ubuntu.mdx\",\"toc\":[{\"value\":\"Get the sources:\",\"url\":\"#get-the-sources\",\"depth\":2},{\"value\":\"Path Variables:\",\"url\":\"#path-variables\",\"depth\":2},{\"value\":\"Create a Golang Application\",\"url\":\"#create-a-golang-application\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Setup a Golang Environment on Ubuntu\",\"datePublished\":\"2018-11-22T22:09:29.000Z\",\"dateModified\":\"2018-11-22T22:09:29.000Z\",\"description\":\"Setup a Golang Environment on Ubuntu\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2018/11/22/setup-a-golang-environment-on-ubuntu\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Golang: Building a Basic Web Server in Go\",\"date\":\"2018-11-21T05:57:54.000Z\",\"tags\":[\"golang\",\"golang-tutorial\",\"programming\"],\"draft\":false,\"summary\":\"This is a golang tutorial on how to build a basic web server.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"3 min read\",\"minutes\":2.41,\"time\":144600,\"words\":482},\"slug\":\"2018/11/21/golang-building-a-basic-web-server-in-go\",\"path\":\"blog/2018/11/21/golang-building-a-basic-web-server-in-go\",\"filePath\":\"blog/2018/11/21/golang-building-a-basic-web-server-in-go.mdx\",\"toc\":[{\"value\":\"Our Web Server:\",\"url\":\"#our-web-server\",\"depth\":2},{\"value\":\"Application Code:\",\"url\":\"#application-code\",\"depth\":2},{\"value\":\"Running our Server:\",\"url\":\"#running-our-server\",\"depth\":2},{\"value\":\"Client Side Requests:\",\"url\":\"#client-side-requests\",\"depth\":2},{\"value\":\"Server Side Output:\",\"url\":\"#server-side-output\",\"depth\":2},{\"value\":\"Resources:\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Golang: Building a Basic Web Server in Go\",\"datePublished\":\"2018-11-21T05:57:54.000Z\",\"dateModified\":\"2018-11-21T05:57:54.000Z\",\"description\":\"This is a golang tutorial on how to build a basic web server.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2018/11/21/golang-building-a-basic-web-server-in-go\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Create Read Only Users in MongoDB\",\"date\":\"2018-11-12T22:02:53.000Z\",\"tags\":[\"mongodb\",\"authentication\",\"databases\",\"security\"],\"draft\":false,\"summary\":\"This tutorial will show you how to create read only users in MongoDB.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"4 min read\",\"minutes\":3.88,\"time\":232800,\"words\":776},\"slug\":\"2018/11/12/create-read-only-users-in-mongodb\",\"path\":\"blog/2018/11/12/create-read-only-users-in-mongodb\",\"filePath\":\"blog/2018/11/12/create-read-only-users-in-mongodb.mdx\",\"toc\":[{\"value\":\"First Method: Creating and Assigning the User\",\"url\":\"#f
1irst-method-creating-and-assigning-the-user\",\"depth\":2},{\"value\":\"Second Method: Create Roles and Assign Users to the Roles\",\"url\":\"#second-method-create-roles-and-assign-users-to-the-roles\",\"depth\":2},{\"value\":\"Assigning Permissions to Roles\",\"url\":\"#assigning-permissions-to-roles\",\"depth\":2},{\"value\":\"Resources:\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Create Read Only Users in MongoDB\",\"datePublished\":\"2018-11-12T22:02:53.000Z\",\"dateModified\":\"2018-11-12T22:02:53.000Z\",\"description\":\"This tutorial will show you how to create read only users in MongoDB.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2018/11/12/create-read-only-users-in-mongodb\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"IAM Policy to Allow Team Wide and User Level Permissions on AWS Secrets Manager\",\"date\":\"2018-11-12T21:32:24.000Z\",\"tags\":[\"aws\",\"security\",\"python\"],\"draft\":false,\"summary\":\"IAM Policy to Allow Team Wide and User Level Permissions on AWS Secrets Manager\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"2 min read\",\"minutes\":1.95,\"time\":117000,\"words\":390},\"slug\":\"2018/11/12/iam-policy-to-allow-team-wide-and-user-level-permissions-on-aws-secrets-manager\",\"path\":\"blog/2018/11/12/iam-policy-to-allow-team-wide-and-user-level-permissions-on-aws-secrets-manager\",\"filePath\":\"blog/2018/11/12/iam-policy-to-allow-team-wide-and-user-level-permissions-on-aws-secrets-manager.mdx\",\"toc\":[{\"value\":\"Our Scenario:\",\"url\":\"#our-scenario\",\"depth\":2},{\"value\":\"Create Secrets with Secrets Manager in AWS using Python Boto3\",\"url\":\"#create-secrets-with-secrets-manager-in-aws-using-python-boto3\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"IAM Policy to Allow Team Wide and User Level Permissions on AWS Secrets Manager\",\"datePublished\":\"2018-11-12T21:32:24.000Z\",\"dateModified\":\"2018-11-12T21:32:24.000Z\",\"description\":\"IAM Policy to Allow Team Wide and User Level Permissions on AWS Secrets Manager\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2018/11/12/iam-policy-to-allow-team-wide-and-user-level-permissions-on-aws-secrets-manager\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Get Application Performance Metrics on Python Flask with Elastic APM on Kibana and Elasticsearch\",\"date\":\"2018-11-11T18:09:18.000Z\",\"tags\":[\"kibana\",\"elasticsearch\",\"monitoring\",\"python\",\"flask\"],\"draft\":false,\"summary\":\"Get Application Performance Metrics on Python Flask with Elastic APM on Kibana and Elasticsearch\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"8 min read\",\"minutes\":7.385,\"time\":443100,\"words\":1477},\"slug\":\"2018/11/11/get-application-performance-metrics-on-python-flask-with-elastic-apm-on-kibana-and-elasticsearch\",\"path\":\"blog/2018/11/11/get-application-performance-metrics-on-python-flask-with-elastic-apm-on-kibana-and-elasticsearch\",\"filePath\":\"blog/2018/11/11/get-application-performance-metrics-on-python-flask-with-elastic-apm-on-kibana-and-elasticsearch.mdx\",\"toc\":[{\"value\":\"Application Metrics\",\"url\":\"#application-metrics\",\"depth\":2},{\"value\":\"Install Flask and APM Agent\",\"url\":\"#install-flask-and-apm-agent\",\"depth\":2},{\"value\":\"Instrument a Bare Bones Python Flask app with APM:\",\"url\":\"#instrument-a-bare-bones-python-flask-app-with-apm\",\"depth\":2},{\"value\":\"Create the Python Flask App\",\"url\":\"#create-the-python-flask-app\",\"depth\":2},{\"value\":\"Visualize the Root Request Path\",\"url\":\"#visualize-the-root-request-path\",\"depth\":2},{\"value\":\"Viewing Application Errors in APM\",\"url\":\"#viewing-application-errors-in-apm\",\"depth\":2},{\"value\":\"Simulate Response Latencies:\",\"url\":\"#simulate-response-latencies\",\"depth\":2},{\"value\":\"Requests where Database Calls are Executed\",\"url\":\"#requests-where-database-calls-are-executed\",\"depth\":2},{\"value\":\"Viewing 4xx and 5xx Response Codes\",\"url\":\"#viewing-4xx-and-5xx-response-codes\",\"depth\":2},{\"value\":\"Configuring more Applications\",\"url\":\"#configuring-more-applications\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Get Ap
1plication Performance Metrics on Python Flask with Elastic APM on Kibana and Elasticsearch\",\"datePublished\":\"2018-11-11T18:09:18.000Z\",\"dateModified\":\"2018-11-11T18:09:18.000Z\",\"description\":\"Get Application Performance Metrics on Python Flask with Elastic APM on Kibana and Elasticsearch\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2018/11/11/get-application-performance-metrics-on-python-flask-with-elastic-apm-on-kibana-and-elasticsearch\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Setup APM Server on Ubuntu for your Elastic Stack to get insights in your Application Performance Metrics\",\"date\":\"2018-11-11T17:31:43.000Z\",\"tags\":[\"kibana\",\"elasticsearch\",\"monitoring\"],\"draft\":false,\"summary\":\"Setup APM Server on Ubuntu for your Elastic Stack to get insights in your Application Performance Metrics\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"4 min read\",\"minutes\":3.845,\"time\":230700,\"words\":769},\"slug\":\"2018/11/11/setup-apm-server-on-ubuntu-for-your-elastic-stack-to-get-insights-in-your-application-performance-metrics\",\"path\":\"blog/2018/11/11/setup-apm-server-on-ubuntu-for-your-elastic-stack-to-get-insights-in-your-application-performance-metrics\",\"filePath\":\"blog/2018/11/11/setup-apm-server-on-ubuntu-for-your-elastic-stack-to-get-insights-in-your-application-performance-metrics.mdx\",\"toc\":[{\"value\":\"What is APM\",\"url\":\"#what-is-apm\",\"depth\":2},{\"value\":\"APM Agents:\",\"url\":\"#apm-agents\",\"depth\":2},{\"value\":\"Setup the Elastic Stack\",\"url\":\"#setup-the-elastic-stack\",\"depth\":2},{\"value\":\"Setup the Pre-Requirements:\",\"url\":\"#setup-the-pre-requirements\",\"depth\":2},{\"value\":\"Setup Elasticsearch:\",\"url\":\"#setup-elasticsearch\",\"depth\":2},{\"value\":\"Install Kibana:\",\"url\":\"#install-kibana\",\"depth\":2},{\"value\":\"Install the APM Server\",\"url\":\"#install-the-apm-server\",\"depth\":2},{\"value\":\"Access Your Elastic Stack\",\"url\":\"#access-your-elastic-stack\",\"depth\":2},{\"value\":\"Configuring a Application to push metrics to APM\",\"url\":\"#configuring-a-application-to-push-metrics-to-apm\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Setup APM Server on Ubuntu for your Elastic Stack to get insights in your Application Performance Metrics\",\"datePublished\":\"2018-11-11T17:31:43.000Z\",\"dateModified\":\"2018-11-11T17:31:43.000Z\",\"description\":\"Setup APM Server on Ubuntu for your Elastic Stack to get insights in your Application Performance Metrics\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2018/11/11/setup-apm-server-on-ubuntu-for-your-elastic-stack-to-get-insights-in-your-application-performance-metrics\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Benchmark Website Response Times with CURL\",\"date\":\"2018-10-31T06:17:12.000Z\",\"tags\":[\"linux\",\"sysadmin\",\"benchmark\",\"curl\"],\"draft\":false,\"summary\":\"Benchmark Website Response Times with CURL\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"1 min read\",\"minutes\":0.97,\"time\":58200,\"words\":194},\"slug\":\"2018/10/31/benchmark-website-response-times-with-curl\",\"path\":\"blog/2018/10/31/benchmark-website-response-times-with-curl\",\"filePath\":\"blog/2018/10/31/benchmark-website-response-times-with-curl.mdx\",\"toc\":[{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Benchmark Website Response Times with CURL\",\"datePublished\":\"2018-10-31T06:17:12.000Z\",\"dateModified\":\"2018-10-31T06:17:12.000Z\",\"description\":\"Benchmark Website Response Times with CURL\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2018/10/31/benchmark-website-response-times-with-curl\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"How to Bootstrap Nodes with Python using Ansible\",\"date\":\"2018-10-31T05:48:15.000Z\",\"tags\":[\"ansible\",\"ansible-tutorial\",\"devops\",\"linux\"],\"draft\":false,\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"1 min read\",\"minutes\":0.95,\"time\":57000,\"words\":190},\"slug\":\"2018/10/31/how-to-bootstrap-nodes-with-python-using-ansible\",\"path\":\"blog/2018/10/31/how-to-bootstrap-nodes-with-python-using-ansible\",\"filePath\":\"blog/2018/10/31/how-to-bootstrap-nodes-with-python-using-ansible.mdx\",\"toc\":[{\"value\":\"Inventory\",\"url\":\"#inventory\",\"depth\":2},{\"value\":\"Playbook\",\"url\":\"#playbook\",\"depth\":2},{\"value\":\"Deploy\",\"url\":\"#deploy\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"How to Bootstrap Nodes with Python using Ansible\",\"datePublished\":\"2018-10-31T05:48:15.000Z\",\"dateModified\":\"2018-10-31T05:48:15.000Z\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2018/10/31/how-to-bootstrap-nodes-with-python-using-ansible\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"How to Install Packages on Remote Systems with Ansible\",\"date\":\"2018-10-31T05:28:18.000Z\",\"tags\":[\"ansible\",\"ansible-tutorial\",\"devops\",\"linux\"],\"draft\":false,\"summary\":\"How to Install Packages on Remote Systems with Ansible\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"2 min read\",\"minutes\":1.995,\"time\":119700,\"words\":399},\"slug\":\"2018/10/31/how-to-install-packages-on-remote-systems-with-ansible\",\"path\":\"blog/2018/10/31/how-to-install-packages-on-remote-systems-with-ansible\",\"filePath\":\"blog/2018/10/31/how-to-install-packages-on-remote-systems-with-ansible.mdx\",\"toc\":[{\"value\":\"Pre-Requisites:\",\"url\":\"#pre-requisites\",\"depth\":2},{\"value\":\"Our Inventory\",\"url\":\"#our-inventory\",\"depth\":2},{\"value\":\"Playbook\",\"url\":\"#playbook\",\"depth\":2},{\"value\":\"Deploy\",\"url\":\"#deploy\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"How to Install Packages on Remote Systems with Ansible\",\"datePublished\":\"2018-10-31T05:28:18.000Z\",\"dateModified\":\"2018-10-31T05:28:18.000Z\",\"description\":\"How to Install Packages on Remote Systems with Ansible\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2018/10/31/how-to-install-packages-on-remote-systems-with-ansible\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Query 24 Hours worth of Data using BatchGet on Amazon DynamoDB using Scan and Filter without a GSI\",\"date\":\"2018-10-30T18:53:43.000Z\",\"tags\":[\"aws\",\"dynamodb\",\"python\",\"databases\"],\"draft\":false,\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"5 min read\",\"minutes\":4.135,\"time\":248100,\"words\":827},\"slug\":\"2018/10/30/query-24-hours-worth-of-data-using-batchget-on-amazon-dynamodb-using-scan-and-filter-without-a-gsi\",\"path\":\"blog/2018/10/30/query-24-hours-worth-of-data-using-batchget-on-amazon-dynamodb-using-scan-and-filter-without-a-gsi\",\"filePath\":\"blog/2018/10/30/query-24-hours-worth-of-data-using-batchget-on-amazon-dynamodb-using-scan-and-filter-without-a-gsi.mdx\",\"toc\":[{\"value\":\"Use-Case:\",\"url\":\"#use-case\",\"depth\":2},{\"value\":\"DynamoDB Table Design\",\"url\":\"#dynamodb-table-design\",\"depth\":2},{\"value\":\"Demonstration using Python\",\"url\":\"#demonstration-using-python\",\"depth\":2},{\"value\":\"Other Thoughts:\",\"url\":\"#other-thoughts\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Query 24 Hours worth of Data using BatchGet on Amazon DynamoDB using Scan and Filter without a GSI\",\"datePublished\":\"2018-10-30T18:53:43.000Z\",\"dateModified\":\"2018-10-30T18:53:43.000Z\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2018/10/30/query-24-hours-worth-of-data-using-batchget-on-amazon-dynamodb-using-scan-and-filter-without-a-gsi\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Using Python Flask and JavaScript for Client Side Filtering through Returned Data\",\"date\":\"2018-10-24T09:39:33.000Z\",\"tags\":[\"python\",\"flask\",\"javascript\",\"docker\",\"web-development\"],\"draft\":false,\"summary\":\"Using Python Flask and JavaScript for Client Side Filtering through Returned Data\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"4 min read\",\"minutes\":3.095,\"time\":185700,\"words\":619},\"slug\":\"2018/10/24/using-python-flask-and-javascript-for-client-side-filtering-through-returned-data\",\"path\":\"blog/2018/10/24/using-python-flask-and-javascript-for-client-side-filtering-through-returned-data\",\"filePath\":\"blog/2018/10/24/using-python-flask-and-javascript-for-client-side-filtering-through-returned-data.mdx\",\"toc\":[{\"value\":\"The Problem I have with CloudWatch Logs\",\"url\":\"#the-problem-i-have-with-cloudwatch-logs\",\"depth\":2},{\"value\":\"Python Flask to the Resque\",\"url\":\"#python-flask-to-the-resque\",\"depth\":2}
1,{\"value\":\"Filtering the Data\",\"url\":\"#filtering-the-data\",\"depth\":2},{\"value\":\"Screenshot\",\"url\":\"#screenshot\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Using Python Flask and JavaScript for Client Side Filtering through Returned Data\",\"datePublished\":\"2018-10-24T09:39:33.000Z\",\"dateModified\":\"2018-10-24T09:39:33.000Z\",\"description\":\"Using Python Flask and JavaScript for Client Side Filtering through Returned Data\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2018/10/24/using-python-flask-and-javascript-for-client-side-filtering-through-returned-data\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Building Ghost Version 2 Blog for the RaspberryPi\",\"date\":\"2018-10-23T21:37:49.000Z\",\"tags\":[\"raspberrypi\",\"docker\",\"swarm\",\"traefik\"],\"draft\":false,\"summary\":\"Building Ghost Version 2 Blog for the RaspberryPi\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"4 min read\",\"minutes\":3.785,\"time\":227100,\"words\":757},\"slug\":\"2018/10/23/building-ghost-version-2-blog-for-the-raspberrypi\",\"path\":\"blog/2018/10/23/building-ghost-version-2-blog-for-the-raspberrypi\",\"filePath\":\"blog/2018/10/23/building-ghost-version-2-blog-for-the-raspberrypi.mdx\",\"toc\":[{\"value\":\"Dockerfile\",\"url\":\"#dockerfile\",\"depth\":2},{\"value\":\"Our Boot Script\",\"url\":\"#our-boot-script\",\"depth\":2},{\"value\":\"Building our Ghost Image\",\"url\":\"#building-our-ghost-image\",\"depth\":2},{\"value\":\"Deploy Ghost with Traefik\",\"url\":\"#deploy-ghost-with-traefik\",\"depth\":2},{\"value\":\"Resources:\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Building Ghost Version 2 Blog for the RaspberryPi\",\"datePublished\":\"2018-10-23T21:37:49.000Z\",\"dateModified\":\"2018-10-23T21:37:49.000Z\",\"description\":\"Building Ghost Version 2 Blog for the RaspberryPi\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2018/10/23/building-ghost-version-2-blog-for-the-raspberrypi\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Build a Traefik Proxy Image for your Raspberry Pi on Docker Swarm\",\"date\":\"2018-10-23T21:31:02.000Z\",\"tags\":[\"raspberrypi\",\"traefik\",\"docker\",\"swarm\"],\"draft\":false,\"summary\":\"This tutorial shows how to build a traefik proxy container image for your raspberry pi on docker swarm.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"5 min read\",\"minutes\":4.235,\"time\":254100,\"words\":847},\"slug\":\"2018/10/23/build-a-traefik-proxy-image-for-your-raspberry-pi-on-docker-swarm\",\"path\":\"blog/2018/10/23/build-a-traefik-proxy-image-for-your-raspberry-pi-on-docker-swarm\",\"filePath\":\"blog/2018/10/23/build-a-traefik-proxy-image-for-your-raspberry-pi-on-docker-swarm.mdx\",\"toc\":[{\"value\":\"What is Traefik\",\"url\":\"#what-is-traefik\",\"depth\":2},{\"value\":\"Dockerfile\",\"url\":\"#dockerfile\",\"depth\":2},{\"value\":\"Build and Push\",\"url\":\"#build-and-push\",\"depth\":2},{\"value\":\"Deploy Traefik to the Swarm\",\"url\":\"#deploy-traefik-to-the-swarm\",\"depth\":2},{\"value\":\"Deploy a Web Service hooked up to Traefik\",\"url\":\"#deploy-a-web-service-hooked-up-to-traefik\",\"depth\":2},{\"value\":\"Testing our Application:\",\"url\":\"#testing-our-application\",\"depth\":2},{\"value\":\"Resources:\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Build a Traefik Proxy Image for your Raspberry Pi on Docker Swarm\",\"datePublished\":\"2018-10-23T21:31:02.000Z\",\"dateModified\":\"2018-10-23T21:31:02.000Z\",\"description\":\"This tutorial shows how to build a traefik proxy container image for your raspberry pi on docker swarm.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2018/10/23/build-a-traefik-proxy-image-for-your-raspberry-pi-on-docker-swarm\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Building a Raspberry Pi Nginx Image with Caching on Alpine for Docker Swarm\",\"date\":\"2018-10-23T21:00:02.000Z\",\"tags\":[\"raspberrypi\",\"nginx\",\"caching\",\"docker\",\"swarm\"],\"draft\":false,\"summary\":\"Building a Raspberry Pi Nginx Image with Caching on Alpine for Docker Swarm\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"3 min read\",\"minutes\":2.62,\"time\":157200,\"words\":524},\"slug\":\"2018/10/23/building-a-raspberry-pi-nginx-image-with-caching-on-alpine-for-docker-swarm\",\"path\":\"blog/2018/10/23/building-a-raspberry-pi-nginx-image-with-caching-on-alpine-for-docker-swarm\",\"filePath\":\"blog/2018/10/23/building-a-raspberry-pi-nginx-image-with-caching-on-alpine-for-docker-swarm.mdx\",\"toc\":[{\"value\":\"Create the backend service:\",\"url\":\"#create-the-backend-service\",\"depth\":2},{\"value\":\"Current File Structure:\",\"url\":\"#current-file-structure\",\"depth\":2},{\"value\":\"Building the Image and Pushing to Gitlab\",\"url\":\"#building-the-image-and-pushing-to-gitlab\",\"depth\":2},{\"value\":\"Deploy\",\"url\":\"#deploy\",\"depth\":2},{\"value\":\"Resources:\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Building a Raspberry Pi Nginx Image with Caching on Alpine for Docker Swarm\",\"datePublished\":\"2018-10-23T21:00:02.000Z\",\"dateModified\":\"2018-10-23T21:00:02.000Z\",\"description\":\"Building a Raspberry Pi Nginx Image with Caching on Alpine for Docker Swarm\",\"
1image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2018/10/23/building-a-raspberry-pi-nginx-image-with-caching-on-alpine-for-docker-swarm\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Nginx Caching Performance for Static Content on Docker Swarm with RaspberryPi\",\"date\":\"2018-10-23T20:41:41.000Z\",\"tags\":[\"raspberrypi\",\"docker\",\"nginx\",\"caching\"],\"draft\":false,\"summary\":\"Nginx Caching Performance for Static Content on Docker Swarm with RaspberryPi\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"4 min read\",\"minutes\":3.085,\"time\":185100,\"words\":617},\"slug\":\"2018/10/23/nginx-caching-performance-for-static-content-on-docker-swarm-with-raspberrypi\",\"path\":\"blog/2018/10/23/nginx-caching-performance-for-static-content-on-docker-swarm-with-raspberrypi\",\"filePath\":\"blog/2018/10/23/nginx-caching-performance-for-static-content-on-docker-swarm-with-raspberrypi.mdx\",\"toc\":[{\"value\":\"The Environment:\",\"url\":\"#the-environment\",\"depth\":2},{\"value\":\"How Nginx was Configured:\",\"url\":\"#how-nginx-was-configured\",\"depth\":2},{\"value\":\"Benchmarking: Before Nginx with Caching was Implemented:\",\"url\":\"#benchmarking-before-nginx-with-caching-was-implemented\",\"depth\":2},{\"value\":\"Benchmarking: After Nginx Caching was Implemented:\",\"url\":\"#benchmarking-after-nginx-caching-was-implemented\",\"depth\":2},{\"value\":\"Resources:\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Nginx Caching Performance for Static Content on Docker Swarm with RaspberryPi\",\"datePublished\":\"2018-10-23T20:41:41.000Z\",\"dateModified\":\"2018-10-23T20:41:41.000Z\",\"description\":\"Nginx Caching Performance for Static Content on Docker Swarm with RaspberryPi\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2018/10/23/nginx-caching-performance-for-static-content-on-docker-swarm-with-raspberrypi\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Setting up a Docker Swarm Cluster on 3 RaspberryPi Nodes\",\"date\":\"2018-10-23T20:24:00.000Z\",\"tags\":[\"raspberrypi\",\"docker\",\"swarm\",\"glusterfs\",\"storage\"],\"draft\":false,\"summary\":\"Setting up a Docker Swarm Cluster on 3 RaspberryPi Nodes\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"8 min read\",\"minutes\":7.365,\"time\":441900,\"words\":1473},\"slug\":\"2018/10/23/setting-up-a-docker-swarm-cluster-on-3-raspberrypi-nodes\",\"path\":\"blog/2018/10/23/setting-up-a-docker-swarm-cluster-on-3-raspberrypi-nodes\",\"filePath\":\"blog/2018/10/23/setting-up-a-docker-swarm-cluster-on-3-raspberrypi-nodes.mdx\",\"toc\":[{\"value\":\"Provision Raspbian on each RaspberryPi\",\"url\":\"#provision-raspbian-on-each-raspberrypi\",\"depth\":2},{\"value\":\"Installing Docker on Raspberry PI\",\"url\":\"#installing-docker-on-raspberry-pi\",\"depth\":2},{\"value\":\"Initialize the Swarm\",\"url\":\"#initialize-the-swarm\",\"depth\":2},{\"value\":\"Setting Up a Replicated GlusterFS Volume\",\"url\":\"#setting-up-a-replicated-glusterfs-volume\",\"depth\":2},{\"value\":\"Create a Web Service on Docker Swarm:\",\"url\":\"#create-a-web-service-on-docker-swarm\",\"depth\":2},{\"value\":\"Massive Thanks:\",\"url\":\"#massive-thanks\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Setting up a Docker Swarm Cluster on 3 RaspberryPi Nodes\",\"datePublished\":\"2018-10-23T20:24:00.000Z\",\"dateModified\":\"2018-10-23T20:24:00.000Z\",\"description\":\"Setting up a Docker Swarm Cluster on 3 RaspberryPi Nodes\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2018/10/23/setting-up-a-docker-swarm-cluster-on-3-raspberrypi-nodes\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"My PiStack Blog Proudly hosted on my RaspberryPi Swarm Cluster\",\"date\":\"2018-10-23T20:11:19.000Z\",\"tags\":[\"raspberrypi\",\"docker\",\"swarm\"],\"draft\":false,\"summary\":\"This is a tutorial to show how I proudly host my blog on my raspberry pi docker swarm cluster.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"2 min read\",\"minutes\":1.275,\"time\":76500,\"words\":255},\"slug\":\"2018/10/23/my-pistack-blog-proudly-hosted-on-my-raspberrypi-swarm-cluster\",\"path\":\"blog/2018/10/23/my-pistack-blog-proudly-hosted-on-my-raspberrypi-swarm-cluster\",\"filePath\":\"blog/2018/10/23/my-pistack-blog-proudly-hosted-on-my-raspberrypi-swarm-cluster.mdx\",\"toc\":[{\"value\":\"Just Look at It!\",\"url\":\"#just-look-at-it\",\"depth\":2},{\"value\":\"My Setup:\",\"url\":\"#my-setup\",\"depth\":2},{\"value\":\"Thanks!\",\"url\":\"#thanks\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"My PiStack Blog Proudly hosted on my RaspberryPi Swarm Cluster\",\"datePublished\":\"2018-10-23T20:11:19.000Z\",\"dateModified\":\"2018-10-23T20:11:19.000Z\",\"description\":\"This is a tutorial to show how I proudly host my blog on my raspberry pi docker swarm cluster.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2018/10/23/my-pistack-blog-proudly-hosted-on-my-raspberrypi-swarm-cluster\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Capturing 54 Million Passwords with a Docker SSH Honeypot\",\"date\":\"2018-10-11T20:38:52.000Z\",\"tags\":[\"docker\",\"security\",\"honeypot\"],\"draft\":false,\"summary\":\"Capturing 54 Million Passwords with a Docker SSH Honeypot\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"3 min read\",\"minutes\":2.535,\"time\":152100,\"words\":507},\"slug\":\"2018/10/11/capturing-54-million-passwords-with-a-docker-ssh-h
1oneypot\",\"path\":\"blog/2018/10/11/capturing-54-million-passwords-with-a-docker-ssh-honeypot\",\"filePath\":\"blog/2018/10/11/capturing-54-million-passwords-with-a-docker-ssh-honeypot.mdx\",\"toc\":[{\"value\":\"SSH Configuration:\",\"url\":\"#ssh-configuration\",\"depth\":2},{\"value\":\"Docker SSH Honeypot:\",\"url\":\"#docker-ssh-honeypot\",\"depth\":2},{\"value\":\"Saving results to disk:\",\"url\":\"#saving-results-to-disk\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Capturing 54 Million Passwords with a Docker SSH Honeypot\",\"datePublished\":\"2018-10-11T20:38:52.000Z\",\"dateModified\":\"2018-10-11T20:38:52.000Z\",\"description\":\"Capturing 54 Million Passwords with a Docker SSH Honeypot\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2018/10/11/capturing-54-million-passwords-with-a-docker-ssh-honeypot\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Splitting Query String Parameters from a URL in Python\",\"date\":\"2018-10-04T13:58:46.000Z\",\"tags\":[\"python\",\"programming\"],\"draft\":false,\"summary\":\"Splitting Query String Parameters from a URL in Python\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"2 min read\",\"minutes\":1.275,\"time\":76500,\"words\":255},\"slug\":\"2018/10/04/splitting-query-string-parameters-from-a-url-in-python\",\"path\":\"blog/2018/10/04/splitting-query-string-parameters-from-a-url-in-python\",\"filePath\":\"blog/2018/10/04/splitting-query-string-parameters-from-a-url-in-python.mdx\",\"toc\":[{\"value\":\"Our URL:\",\"url\":\"#our-url\",\"depth\":2},{\"value\":\"Python to Capture the Parameters:\",\"url\":\"#python-to-capture-the-parameters\",\"depth\":2},{\"value\":\"Resources:\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Splitting Query String Parameters from a URL in Python\",\"datePublished\":\"2018-10-04T13:58:46.000Z\",\"dateModified\":\"2018-10-04T13:58:46.000Z\",\"description\":\"Splitting Query String Parameters from a URL in Python\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2018/10/04/splitting-query-string-parameters-from-a-url-in-python\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Using the GeoIP Processor Plugin with Elasticsearch to enrich your location based data\",\"date\":\"2018-09-12T14:14:30.000Z\",\"tags\":[\"elasticsearch\",\"geoip\",\"location\",\"kibana\"],\"draft\":false,\"summary\":\"Ruan Bekker will demonstrate how to use the GeoIP Processor Plugin with Elasticsearch to enrich your location based data\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"3 min read\",\"minutes\":2.695,\"time\":161700,\"words\":539},\"slug\":\"2018/09/12/using-the-geoip-processor-plugin-with-elasticsearch-to-enrich-your-location-based-data\",\"path\":\"blog/2018/09/12/using-the-geoip-processor-plugin-with-elasticsearch-to-enrich-your-location-based-data\",\"filePath\":\"blog/2018/09/12/using-the-geoip-processor-plugin-with-elasticsearch-to-enrich-your-location-based-data.mdx\",\"toc\":[{\"value\":\"Installation\",\"url\":\"#installation\",\"depth\":2},{\"value\":\"Setting up the Pipeline\",\"url\":\"#setting-up-the-pipeline\",\"depth\":2},{\"value\":\"Ingest and Test\",\"url\":\"#ingest-and-test\",\"depth\":2},{\"value\":\"Kibana\",\"url\":\"#kibana\",\"depth\":2},{\"value\":\"Resources:\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Using the GeoIP Processor Plugin with Elasticsearch to enrich your location based data\",\"datePublished\":\"2018-09-12T14:14:30.000Z\",\"dateModified\":\"2018-09-12T14:14:30.000Z\",\"description\":\"Ruan Bekker will demonstrate how to use the GeoIP Processor Plugin with Elasticsearch to enrich your location based data\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2018/09/12/using-the-geoip-processor-plugin-with-elasticsearch-to-enrich-your-location-based-data\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Investigating High Request Latencies on Amazon DynamoDB\",\"date\":\"2018-09-05T22:03:09.000Z\",\"tags\":[\"aws\",\"dynamodb\",\"sysadmin\",\"databases\"],\"draft\":false,\"summary\":\"Investigating High Request Latencies on Amazon DynamoDB\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"3 min read\",\"minutes\":2.63,\"time\":157800,\"words\":526},\"slug\":\"2018/09/05/investigating-high-request-latencies-on-amazon-dynamodb\",\"path\":\"blog/2018/09/05/investigating-high-request-latencies-on-amazon-dynamodb\",\"filePath\":\"blog/2018/09/05/investigating-high-request-latencies-on-amazon-dynamodb.mdx\",\"toc\":[{\"value\":\"DynamoDB Performance Testing Overview\",\"url\":\"#dynamodb-performance-testing-overview\",\"depth\":2},{\"value\":\"Seed the Table(s):\",\"url\":\"#seed-the-tables\",\"depth\":2},{\"value\":\"Read from the Table(s):\",\"url\":\"#read-from-the-tables\",\"depth\":2},{\"value\":\"Results\",\"url\":\"#results\",\"depth\":2},{\"value\":\"Notes from AWS Support:\",\"url\":\"#notes-from-aws-support\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Investigating High Request Latencies on Amazon DynamoDB\",\"datePublished\":\"2018-09-05T22:03:09.000Z\",\"dateModified\":\"2018-09-05T22:03:09.000Z\",\"description\":\"Investigating High Request Latencies on Amazon DynamoDB\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2018/09/05/investigating-high-request-latencies-on-amazon-dynamodb\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Give your Database a break and use Memcached to return frequently accessed data\",\"date\":\"2018-09-01T21:05:10.000Z\",\"tags\":[\"caching\",\"memcached\",\"sqlite\",\"databases\",\"python\"],\"draft\":false,\"summary\":\"Give your Database a break and use Memcached to return frequently accessed data\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"5 min read\",\"minutes\":4.01,\"time\":240600,\"words\":802},\"slug\":\"2018/09/01/give-your-database-a-break-and-use-memcached-to-return-frequently-accessed-data\",\"path\":\"blog/2018/09/01/give-your-database-a-break-and-use-memcached-to-return-frequently-accessed-data\",\"filePath\":\"blog/2018/09/01/give-your-database-a-break-and-use-memcached-to-return-frequently-accessed-data.mdx\",\"toc\":[{\"value\":\"The Scenario:\",\"url\":\"#the-scenario\",\"depth\":2},{\"value\":\"SQL Database:\",\"url\":\"#sql-database\",\"depth\":2},{\"value\":\"Run a Memcached Container:\",\"url\":\"#run-a-memcached-container\",\"depth\":2},{\"value\":\"Our Application Code:\",\"url\":\"#our-application-code\",\"depth\":2},{\"value\":\"The Demo:\",\"url\":\"#the-demo\",\"depth\":2},{\"value\":\"Resources:\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Give your Database a break and use Memcached to return frequently accessed data\",\"datePublished\":\"2018-09-01T21:05:10.000Z\",\"dateModified\":\"2018-09-01T21:05:10.000Z\",\"description\":\"Give your Database a break and use Memcached to return frequently accessed data\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2018/09/01/give-your-database-a-break-and-use-memcached-to-return-frequently-accessed-data\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Dockerizing a Memcached Server for Docker on Alpine\",\"date\":\"2018-09-01T20:01:09.000Z\",\"tags\":[\"caching\",\"memcached\",\"docker\"],\"draft\":false,\"summary\":\"Dockerizing a Memcached Server for Docker on Alpine\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"4 min read\",\"minutes\":3.785,\"time\":227100,\"words\":757},\"slug\":\"2018/09/01/dockerizing-a-memcached-server-for-docker-on-alpine\",\"path\":\"blog/2018/09/01/dockerizing-a-memcached-server-for-docker-on-alpine\",\"filePath\":\"blog/2018/09/01/dockerizing-a-memcached-server-for-docker-on-alpine.mdx\",\"toc\":[{\"value\":\"What is Memcached\",\"url\":\"#what-is-memcached\",\"depth\":2},{\"value\":\"The Dockerfile:\",\"url\":\"#the-dockerfile\",\"depth\":2},{\"value\":\"The Boot Script:\",\"url\":\"#the-boot-script\",\"depth\":2},{\"value\":\"Build and Deploy:\",\"url\":\"#build-and-deploy\",\"depth\":2},{\"value\":\"Check out the Stats:\",\"url\":\"#check-out-the-stats\",\"depth\":2},{\"value\":\"Resources:\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Dockerizing a Memcached Server for Docker on Alpine\",\"datePublished\":\"2018-09-01T20:01:09.000Z\",\"dateModified\":\"2018-09-01T20:01:09.000Z\",\"description\":\"Dockerizing a Memcached Server for Docker on Alpine\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2018/09/01/dockerizing-a-memcached-server-for-docker-on-alpine\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Review and Secure your Facebook Account\",\"date\":\"2018-08-29T19:03:10.000Z\",\"tags\":[\"facebook\",\"security\"],\"draft\":false,\"summary\":\"This guide shows you how to review and secure your facebook account.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"4 min read\",\"minutes\":3.705,\"time\":222300,\"words\":741},\"slug\":\"2018/08/29/review-and-secure-your-facebook-account\",\"path\":\"blog/2018/08/29/review-and-secure-your-facebook-account\",\"filePath\":\"blog/2018/08/29/review-and-secure-your-facebook-account.mdx\",\"toc\":[{\"value\":\"Scenario: Something suspicious is up / weird behavior / getting unusual messages from groups etc\",\"url\":\"#scenario-something-suspicious-is-up--weird-behavior--getting-unusual-messages-from-groups-etc\",\"depth\":2},{\"value\":\"Head over to your Facebook Accounts Settings Page:\",\"url\":\"#head-over-to-your-facebook-accounts-settings-page\",\"depth\":2},{\"value\":\"Security and Login Info:\",\"url\":\"#security-and-login-info\",\"depth\":2},{\"value\":\"Password and Two Factor Authentication:\",\"url\":\"#password-and-two-factor-authentication\",\"depth\":2}
1,{\"value\":\"Review your Activity Log\",\"url\":\"#review-your-activity-log\",\"depth\":2},{\"value\":\"Final Note:\",\"url\":\"#final-note\",\"depth\":2},{\"value\":\"Resources:\",\"url\":\"#resources\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Review and Secure your Facebook Account\",\"datePublished\":\"2018-08-29T19:03:10.000Z\",\"dateModified\":\"2018-08-29T19:03:10.000Z\",\"description\":\"This guide shows you how to review and secure your facebook account.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2018/08/29/review-and-secure-your-facebook-account\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Distributing a Shared Secret amongst a Group of Participants using Shamirs Secret Sharing Scheme aka ssss\",\"date\":\"2018-08-27T22:29:48.000Z\",\"tags\":[\"security\",\"cryptography\",\"encryption\"],\"draft\":false,\"summary\":\"This tutorial we will distributing a shared secret amongst a group of participants using ssss.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"4 min read\",\"minutes\":3.59,\"time\":215400,\"words\":718},\"slug\":\"2018/08/27/distributing-a-shared-secret-amongst-a-group-of-participants-using-shamirs-secret-sharing-scheme-aka-ssss\",\"path\":\"blog/2018/08/27/distributing-a-shared-secret-amongst-a-group-of-participants-using-shamirs-secret-sharing-scheme-aka-ssss\",\"filePath\":\"blog/2018/08/27/distributing-a-shared-secret-amongst-a-group-of-participants-using-shamirs-secret-sharing-scheme-aka-ssss.mdx\",\"toc\":[{\"value\":\"More info on Secret Sharing\",\"url\":\"#more-info-on-secret-sharing\",\"depth\":2},{\"value\":\"Installing ssss\",\"url\":\"#installing-ssss\",\"depth\":2},{\"value\":\"Creating a Secret:\",\"url\":\"#creating-a-secret\",\"depth\":2},{\"value\":\"Reconstructing the Secret:\",\"url\":\"#reconstructing-the-secret\",\"depth\":2},{\"value\":\"Using ssss and qrencode for MFA Codes\",\"url\":\"#using-ssss-and-qrencode-for-mfa-codes\",\"depth\":2},{\"value\":\"Resources:\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Distributing a Shared Secret amongst a Group of Participants using Shamirs Secret Sharing Scheme aka ssss\",\"datePublished\":\"2018-08-27T22:29:48.000Z\",\"dateModified\":\"2018-08-27T22:29:48.000Z\",\"description\":\"This tutorial we will distributing a shared secret amongst a group of participants using ssss.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2018/08/27/distributing-a-shared-secret-amongst-a-group-of-participants-using-shamirs-secret-sharing-scheme-aka-ssss\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Improving Performance from your Lambda Function from the use of Global Variables\",\"date\":\"2018-08-27T12:30:30.000Z\",\"tags\":[\"aws\",\"dynamodb\",\"lambda\",\"python\"],\"draft\":false,\"summary\":\"In this tutorial we will be improving performance from your lambda function from the use of global variables.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"3 min read\",\"minutes\":2.41,\"time\":144600,\"words\":482},\"slug\":\"2018/08/27/improving-performance-from-your-lambda-function-from-the-use-of-global-variables\",\"path\":\"blog/2018/08/27/improving-performance-from-your-lambda-function-from-the-use-of-global-variables\",\"filePath\":\"blog/2018/08/27/improving-performance-from-your-lambda-function-from-the-use-of-global-variables.mdx\",\"toc\":[{\"value\":\"Example Function:\",\"url\":\"#example-function\",\"depth\":2},{\"value\":\"Results of my Invocations:\",\"url\":\"#results-of-my-invocations\",\"depth\":2},{\"value\":\"Resources:\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Improving Performance from your Lambda Function from the use of Global Variables\",\"datePublished\":\"2018-08-27T12:30:30.000Z\",\"dateModified\":\"2018-08-27T12:30:30.000Z\",\"description\":\"In this tutorial we will be improving performance from your lambda function from the use of global variables.\",\"
1image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2018/08/27/improving-performance-from-your-lambda-function-from-the-use-of-global-variables\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Send Emails using Python and Sendgrid using SMTPlib\",\"date\":\"2018-08-21T15:30:08.000Z\",\"tags\":[\"email\",\"python\",\"programming\"],\"draft\":false,\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"2 min read\",\"minutes\":1.19,\"time\":71400,\"words\":238},\"slug\":\"2018/08/21/send-emails-using-python-and-sendgrid-using-smtplib\",\"path\":\"blog/2018/08/21/send-emails-using-python-and-sendgrid-using-smtplib\",\"filePath\":\"blog/2018/08/21/send-emails-using-python-and-sendgrid-using-smtplib.mdx\",\"toc\":[{\"value\":\"Sendgrid\",\"url\":\"#sendgrid\",\"depth\":2},{\"value\":\"Python Code\",\"url\":\"#python-code\",\"depth\":2},{\"value\":\"Resources:\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Send Emails using Python and Sendgrid using SMTPlib\",\"datePublished\":\"2018-08-21T15:30:08.000Z\",\"dateModified\":\"2018-08-21T15:30:08.000Z\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2018/08/21/send-emails-using-python-and-sendgrid-using-smtplib\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Using IAM Authentication with Amazon Elasticsearch Service\",\"date\":\"2018-08-20T08:12:21.000Z\",\"tags\":[\"elasticsearch\",\"aws\",\"security\",\"python\"],\"draft\":false,\"summary\":\"In this tutorial we will use aws iam authentication with amazon elasticsearch service.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"4 min read\",\"minutes\":3.485,\"time\":209100,\"words\":697},\"slug\":\"2018/08/20/using-iam-authentication-with-amazon-elasticsearch-service\",\"path\":\"blog/2018/08/20/using-iam-authentication-with-amazon-elasticsearch-service\",\"filePath\":\"blog/2018/08/20/using-iam-authentication-with-amazon-elasticsearch-service.mdx\",\"toc\":[{\"value\":\"Elasticsearch Service Authentication Support:\",\"url\":\"#elasticsearch-service-authentication-support\",\"depth\":2},{\"value\":\"Securing your Amazon Elasticsearch Search Domain:\",\"url\":\"#securing-your-amazon-elasticsearch-search-domain\",\"depth\":2},{\"value\":\"Testing from EC2 using IAM Instance Profile:\",\"url\":\"#testing-from-ec2-using-iam-instance-profile\",\"depth\":2},{\"value\":\"Testing using IAM Credentials from Credentials Provider:\",\"url\":\"#testing-using-iam-credentials-from-credentials-provider\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Using IAM Authentication with Amazon Elasticsearch Service\",\"datePublished\":\"2018-08-20T08:12:21.000Z\",\"dateModified\":\"2018-08-20T08:12:21.000Z\",\"description\":\"In this tutorial we will use aws iam authentication with amazon elasticsearch service.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2018/08/20/using-iam-authentication-with-amazon-elasticsearch-service\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Get Blogpost Titles Links and Tags from a RSS Link using Python Feedparser\",\"date\":\"2018-08-15T22:14:54.000Z\",\"tags\":[\"python\",\"rss\",\"programming\"],\"draft\":false,\"summary\":\"In this tutorial we will retrieve blog post title links and tags from a rss link using feedparser.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"3 min read\",\"minutes\":2.05,\"time\":123000,\"words\":410},\"slug\":\"2018/08/15/get-blogpost-titles-links-and-tags-from-a-rss-link-using-python-feedparser\",\"path\":\"blog/2018/08/15/get-blogpost-titles-links-and-tags-from-a-rss-link-using-python-feedparser\",\"filePath\":\"blog/2018/08/15/get-blogpost-titles-links-and-tags-from-a-rss-link-using-python-feedparser.mdx\",\"toc\":[{\"value\":\"Installing Dependencies:\",\"url\":\"#installing-dependencies\",\"depth\":2},{\"value\":\"The Python Code:\",\"url\":\"#the-python-code\",\"depth\":2},{\"value\":\"Running the script:\",\"url\":\"#running-the-script\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Get Blogpost Titles Links and Tags from a RSS Link using Python Feedparser\",\"datePublished\":\"2018-08-15T22:14:54.000Z\",\"dateModified\":\"2018-08-15T22:14:54.000Z\",\"description\":\"In this tutorial we will retrieve blog post title links and tags from a rss link using feedparser.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2018/08/15/get-blogpost-titles-links-and-tags-from-a-rss-link-using-python-feedparser\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Tutorial on DynamoDB using Bash and the AWS CLI Tools to Interact with a Music Dataset\",\"date\":\"2018-08-14T20:33:22.000Z\",\"tags\":[\"aws\",\"dynamodb\",\"databases\",\"docker\"],\"draft\":false,\"summary\":\"This is a tutorial on dynamodb using bash and the aws cli tools to interact with a music dataset.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"8 min read\",\"minutes\":7.61,\"time\":456600,\"words\":1522},\"slug\":\"2018/08/14/tutorial-on-dynamodb-using-bash-and-the-aws-cli-tools-to-interact-with-a-music-dataset\",\"path\":\"blog/2018/08/14/tutorial-on-dynamodb-using-bash-and-the-aws-cli-tools-to-interact-with-a-music-dataset\",\"filePath\":\"blog/2018/08/14/tutorial-on-dynamodb-using-bash-and-the-aws-cli-tools-to-interact-with-a-music-dataset.mdx\",\"toc\":[{\"value\":\"The Mu
1sic Dataset:\",\"url\":\"#the-music-dataset\",\"depth\":2},{\"value\":\"Create the DynamoDB Local Server on Docker:\",\"url\":\"#create-the-dynamodb-local-server-on-docker\",\"depth\":2},{\"value\":\"Install the AWS CLI Tools:\",\"url\":\"#install-the-aws-cli-tools\",\"depth\":2},{\"value\":\"Create the DynamoDB Table:\",\"url\":\"#create-the-dynamodb-table\",\"depth\":2},{\"value\":\"Listing the Tables:\",\"url\":\"#listing-the-tables\",\"depth\":2},{\"value\":\"Create a Item in DynamoDB:\",\"url\":\"#create-a-item-in-dynamodb\",\"depth\":2},{\"value\":\"Read a Item from DynamoDB\",\"url\":\"#read-a-item-from-dynamodb\",\"depth\":2},{\"value\":\"Batch Write\",\"url\":\"#batch-write\",\"depth\":2},{\"value\":\"Scan the Table:\",\"url\":\"#scan-the-table\",\"depth\":2},{\"value\":\"Query\",\"url\":\"#query\",\"depth\":2},{\"value\":\"Global Secondary Indexes:\",\"url\":\"#global-secondary-indexes\",\"depth\":2},{\"value\":\"Delete the Table:\",\"url\":\"#delete-the-table\",\"depth\":2},{\"value\":\"Resources:\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Tutorial on DynamoDB using Bash and the AWS CLI Tools to Interact with a Music Dataset\",\"datePublished\":\"2018-08-14T20:33:22.000Z\",\"dateModified\":\"2018-08-14T20:33:22.000Z\",\"description\":\"This is a tutorial on dynamodb using bash and the aws cli tools to interact with a music dataset.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2018/08/14/tutorial-on-dynamodb-using-bash-and-the-aws-cli-tools-to-interact-with-a-music-dataset\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Ruby Tutorial Series Setup and Variables\",\"date\":\"2018-08-10T01:11:52.000Z\",\"tags\":[\"ruby\",\"programming\"],\"draft\":false,\"summary\":\"This is a ruby programming tutorial series, with the setup and starting with variables.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"5 min read\",\"minutes\":4.395,\"time\":263700,\"words\":879},\"slug\":\"2018/08/09/ruby-tutorial-series-setup-and-variables\",\"path\":\"blog/2018/08/09/ruby-tutorial-series-setup-and-variables\",\"filePath\":\"blog/2018/08/09/ruby-tutorial-series-setup-and-variables.mdx\",\"toc\":[{\"value\":\"Ruby Environment:\",\"url\":\"#ruby-environment\",\"depth\":2},{\"value\":\"Drop into a Ruby Shell:\",\"url\":\"#drop-into-a-ruby-shell\",\"depth\":2},{\"value\":\"Strings and Integers\",\"url\":\"#strings-and-integers\",\"depth\":2},{\"value\":\"String Methods\",\"url\":\"#string-methods\",\"depth\":2},{\"value\":\"Variables\",\"url\":\"#variables\",\"depth\":2},{\"value\":\"Variables are Mutable:\",\"url\":\"#variables-are-mutable\",\"depth\":2},{\"value\":\"Strings and Integers:\",\"url\":\"#strings-and-integers\",\"depth\":2},{\"value\":\"Working with rb files:\",\"url\":\"#working-with-rb-files\",\"depth\":2},{\"value\":\"Resources:\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Ruby Tutorial Series Setup and Variables\",\"datePublished\":\"2018-08-10T01:11:52.000Z\",\"dateModified\":\"2018-08-10T01:11:52.000Z\",\"description\":\"This is a ruby programming tutorial series, with the setup and starting with variables.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2018/08/09/ruby-tutorial-series-setup-and-variables\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Ruby Programming Tutorial Series\",\"date\":\"2018-08-10T00:59:34.000Z\",\"tags\":[\"ruby\",\"programming\"],\"draft\":false,\"summary\":\"This is a ruby programming tutorial series.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"1 min read\",\"minutes\":0.59,\"time\":35400,\"words\":118},\"slug\":\"2018/08/09/ruby-programming-tutorial-series\",\"path\":\"blog/2018/08/09/ruby-programming-tutorial-series\",\"filePath\":\"blog/2018/08/09/ruby-programming-tutorial-series.mdx\",\"toc\":[{\"value\":\"Outline of the Series:\",\"url\":\"#outline-of-the-series\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Ruby Programming Tutorial Series\",\"datePublished\":\"2018-08-10T00:59:34.000Z\",\"dateModified\":\"2018-08-10T00:59:34.000Z\",\"description\":\"This is a ruby programming tutorial series.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2018/08/09/ruby-programming-tutorial-series\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Build a REST API war file for Payara with Java Springboot and Maven Part 1\",\"date\":\"2018-08-10T00:43:34.000Z\",\"tags\":[\"java\",\"maven\",\"docker\",\"programming\"],\"draft\":false,\"summary\":\"This tutorial will demonstrate how to build a REST API for Payara with Java Springboot and Maven Part 1.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"5 min read\",\"minutes\":4.98,\"time\":298800,\"words\":996},\"slug\":\"2018/08/09/build-a-rest-api-war-file-for-payara-with-java-springboot-and-maven-part-1\",\"path\":\"blog/2018/08/09/build-a-rest-api-war-file-for-payara-with-java-springboot-and-maven-part-1\",\"filePath\":\"blog/2018/08/09/build-a-rest-api-war-file-for-payara-with-java-springboot-and-maven-part-1.mdx\",\"toc\":[{\"value\":\"Setup Java and Apache Maven:\",\"url\":\"#setup-java-and-apache-maven\",\"depth\":2},{\"value\":\"Prepare the directories:\",\"url\":\"#prepare-the-directories\",\"depth\":2},{\"value\":\"The source code:\",\"url\":\"#the-source-code\",\"depth\":2},{\"value\":\"Build with Maven:\",\"url\":\"#build-with-maven\",\"depth\":2}
1,{\"value\":\"Deploy your Application with Payara Micro:\",\"url\":\"#deploy-your-application-with-payara-micro\",\"depth\":2},{\"value\":\"Testing\",\"url\":\"#testing\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Build a REST API war file for Payara with Java Springboot and Maven Part 1\",\"datePublished\":\"2018-08-10T00:43:34.000Z\",\"dateModified\":\"2018-08-10T00:43:34.000Z\",\"description\":\"This tutorial will demonstrate how to build a REST API for Payara with Java Springboot and Maven Part 1.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2018/08/09/build-a-rest-api-war-file-for-payara-with-java-springboot-and-maven-part-1\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Hello World Web App with Java Springboot and Maven\",\"date\":\"2018-08-03T12:31:58.000Z\",\"tags\":[\"java\",\"maven\",\"springboot\",\"programming\"],\"draft\":false,\"summary\":\"This is a programming tutorial on how to create a hello world java springboot web application using maven.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"3 min read\",\"minutes\":2.33,\"time\":139800,\"words\":466},\"slug\":\"2018/08/03/hello-world-web-app-with-java-springboot-and-maven\",\"path\":\"blog/2018/08/03/hello-world-web-app-with-java-springboot-and-maven\",\"filePath\":\"blog/2018/08/03/hello-world-web-app-with-java-springboot-and-maven.mdx\",\"toc\":[{\"value\":\"Setup Java\",\"url\":\"#setup-java\",\"depth\":2},{\"value\":\"Install Apache Maven:\",\"url\":\"#install-apache-maven\",\"depth\":2},{\"value\":\"Setup the Application:\",\"url\":\"#setup-the-application\",\"depth\":2},{\"value\":\"Build and Compile:\",\"url\":\"#build-and-compile\",\"depth\":2},{\"value\":\"Start and Test the Application:\",\"url\":\"#start-and-test-the-application\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Hello World Web App with Java Springboot and Maven\",\"datePublished\":\"2018-08-03T12:31:58.000Z\",\"dateModified\":\"2018-08-03T12:31:58.000Z\",\"description\":\"This is a programming tutorial on how to create a hello world java springboot web application using maven.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2018/08/03/hello-world-web-app-with-java-springboot-and-maven\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Hello World Ruby on Rails App Tutorial using Mac\",\"date\":\"2018-07-20T07:30:20.000Z\",\"tags\":[\"ruby\",\"rails\",\"web-development\",\"programming\"],\"draft\":false,\"summary\":\"This is a quick tutorial on a hello world ruby on rails web application tutorial.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"2 min read\",\"minutes\":1.62,\"time\":97200,\"words\":324},\"slug\":\"2018/07/20/hello-world-ruby-on-rails-app-tutorial-using-mac\",\"path\":\"blog/2018/07/20
1/hello-world-ruby-on-rails-app-tutorial-using-mac\",\"filePath\":\"blog/2018/07/20/hello-world-ruby-on-rails-app-tutorial-using-mac.mdx\",\"toc\":[{\"value\":\"Setup Ruby on Rails\",\"url\":\"#setup-ruby-on-rails\",\"depth\":2},{\"value\":\"Creating the App\",\"url\":\"#creating-the-app\",\"depth\":2},{\"value\":\"Route Config\",\"url\":\"#route-config\",\"depth\":2},{\"value\":\"Controllers\",\"url\":\"#controllers\",\"depth\":2},{\"value\":\"Testing\",\"url\":\"#testing\",\"depth\":2},{\"value\":\"Resources:\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Hello World Ruby on Rails App Tutorial using Mac\",\"datePublished\":\"2018-07-20T07:30:20.000Z\",\"dateModified\":\"2018-07-20T07:30:20.000Z\",\"description\":\"This is a quick tutorial on a hello world ruby on rails web application tutorial.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2018/07/20
1/hello-world-ruby-on-rails-app-tutorial-using-mac\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Capture Geo Location Data with Python Flask and PyGeoIP\",\"date\":\"2018-07-16T21:46:01.000Z\",\"tags\":[\"python\",\"flask\",\"geoip\",\"programming\",\"web-development\"],\"draft\":false,\"summary\":\"In this tutorial I will demonstrate how to capture geo-location data with python flask and pygeoip.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"3 min read\",\"minutes\":2.07,\"time\":124200,\"words\":414},\"slug\":\"2018/07/16/capture-geo-location-data-with-python-flask-and-pygeoip\",\"path\":\"blog/2018/07/16/capture-geo-location-data-with-python-flask-and-pygeoip\",\"filePath\":\"blog/2018/07/16/capture-geo-location-data-with-python-flask-and-pygeoip.mdx\",\"toc\":[{\"value\":\"Dependencies:\",\"url\":\"#dependencies\",\"depth\":2},{\"value\":\"Getting Started with PyGeoIP:\",\"url\":\"#getting-started-with-pygeoip\",\"depth\":2},{\"value\":\"Python Flask Web App to Capture Data\",\"url\":\"#python-flask-web-app-to-capture-data\",\"depth\":2},{\"value\":\"Resources:\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Capture Geo Location Data with Python Flask and PyGeoIP\",\"datePublished\":\"2018-07-16T21:46:01.000Z\",\"dateModified\":\"2018-07-16T21:46:01.000Z\",\"description\":\"In this tutorial I will demonstrate how to capture geo-location data with python flask and pygeoip.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2018/07/16/capture-geo-location-data-with-python-flask-and-pygeoip\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Install Java Development Kit 10 on Ubuntu\",\"date\":\"2018-07-15T10:17:43.000Z\",\"tags\":[\"linux\",\"sysadmin\",\"java\"],\"draft\":false,\"summary\":\"This tutorial shows you how to install the java development kit (jdk) on ubuntu linux.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"2 min read\",\"minutes\":1.08,\"time\":64800,\"words\":216},\"slug\":\"2018/07/15/install-java-development-kit-10-on-ubuntu\",\"path\":\"blog/2018/07/15/install-java-development-kit-10-on-ubuntu\",\"filePath\":\"blog/2018/07/15/install-java-development-kit-10-on-ubuntu.mdx\",\"toc\":[{\"value\":\"Differences in Java 8 and Java 10:\",\"url\":\"#differences-in-java-8-and-java-10\",\"depth\":2},{\"value\":\"Installing JDK 10 on Ubuntu:\",\"url\":\"#installing-jdk-10-on-ubuntu\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Install Java Development Kit 10 on Ubuntu\",\"datePublished\":\"2018-07-15T10:17:43.000Z\",\"dateModified\":\"2018-07-15T10:17:43.000Z\",\"description\":\"This tutorial shows you how to install the java development kit (jdk) on ubuntu linux.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2018/07/15/install-java-development-kit-10-on-ubuntu\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Setup a LAMP Stack with Ansible using Ubuntu\",\"date\":\"2018-07-08T21:15:15.000Z\",\"tags\":[\"ansible\",\"devops\"],\"draft\":false,\"summary\":\"This is a devops tutorial on how to setup a lamp stack using ansible.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"2 min read\",\"minutes\":1.46,\"time\":87600,\"words\":292},\"slug\":\"2018/07/08/setup-a-lamp-stack-with-ansible-using-ubuntu\",\"path\":\"blog/2018/07/08/setup-a-lamp-stack-with-ansible-using-ubuntu\",\"filePath\":\"blog/2018/07/08/setup-a-lamp-stack-with-ansible-using-ubuntu.mdx\",\"toc\":[{\"value\":\"Our Playbook:\",\"url\":\"#our-playbook\",\"depth\":2},{\"value\":\"Deploy your LAMP Stack:\",\"url\":\"#deploy-your-lamp-stack\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Setup a LAMP Stack with Ansible using Ubuntu\",\"datePublished\":\"2018-07-08T21:15:15.000Z\",\"dateModified\":\"2018-07-08T21:15:15.000Z\",\"description\":\"This is a devops tutorial on how to setup a lamp stack using ansible.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2018/07/08/setup-a-lamp-stack-with-ansible-using-ubuntu\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Getting Started with Ansible on Ubuntu\",\"date\":\"2018-07-08T19:56:06.000Z\",\"tags\":[\"devops\",\"ansible\"],\"draft\":false,\"summary\":\"This is a devops getting started tutorial with ansible using the ubuntu linux distribution.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"4 min read\",\"minutes\":3.87,\"time\":232200,\"words\":774},\"slug\":\"2018/07/08/getting-started-with-ansible-on-ubuntu\",\"path\":\"blog/2018/07/08/getting-started-with-ansible-on-ubuntu\",\"filePath\":\"blog/2018/07/08/getting-started-with-ansible-on-ubuntu.mdx\",\"toc\":[{\"value\":\"Install Ansible:\",\"url\":\"#install-ansible\",\"depth\":2},{\"value\":\"Populate the invetory configuration:\",\"url\":\"#populate-the-invetory-configuration\",\"depth\":2},{\"value\":\"Deploy Python:\",\"url\":\"#deploy-python\",\"depth\":2},{\"value\":\"Run a command on your nodes:\",\"url\":\"#run-a-command-on-your-nodes\",\"depth\":2},{\"value\":\"Ansible Playbooks:\",\"url\":\"#ansible-playbooks\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Getting Started with Ansible on Ubuntu\",\"datePublished\":\"2018-07-08T19:56:06.000Z\",\"dateModified\":\"2018-07-08T19:56:06.000Z\",\"description\":\"This is a devops getting started tutorial with ansible using the ubuntu linux distribution.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2018/07/08/getting-started-with-ansible-on-ubuntu\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}}
1,{\"title\":\"Salt and Hash Example using Python with Bcrypt on Alpine\",\"date\":\"2018-07-04T09:05:00.000Z\",\"tags\":[\"programming\",\"encryption\",\"python\",\"security\"],\"draft\":false,\"summary\":\"In this tutorial I will demonstrate a salt and hash example using python with bcrypt on alpine linux.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"3 min read\",\"minutes\":2.165,\"time\":129900,\"words\":433},\"slug\":\"2018/07/04/salt-and-hash-example-using-python-with-bcrypt-on-alpine\",\"path\":\"blog/2018/07/04/salt-and-hash-example-using-python-with-bcrypt-on-alpine\",\"filePath\":\"blog/2018/07/04/salt-and-hash-example-using-python-with-bcrypt-on-alpine.mdx\",\"toc\":[{\"value\":\"Installing Bcrypt\",\"url\":\"#installing-bcrypt\",\"depth\":2},{\"value\":\"Bcrypt Example to Hash a Password\",\"url\":\"#bcrypt-example-to-hash-a-password\",\"depth\":2},{\"value\":\"Bcrypt Salt Hash and Verification Example:\",\"url\":\"#bcrypt-salt-hash-and-verification-example\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Salt and Hash Example using Python with Bcrypt on Alpine\",\"datePublished\":\"2018-07-04T09:05:00.000Z\",\"dateModified\":\"2018-07-04T09:05:00.000Z\",\"description\":\"In this tutorial I will demonstrate a salt and hash example using python with bcrypt on alpine linux.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2018/07/04/salt-and-hash-example-using-python-with-bcrypt-on-alpine\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Setup a PPTP VPN on Ubuntu\",\"date\":\"2018-06-27T08:18:51.000Z\",\"tags\":[\"networking\",\"vpn\"],\"draft\":false,\"summary\":\"This tutorial shows you how to setup and configure a pptp vpn on ubuntu linux.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"1 min read\",\"minutes\":0.9,\"time\":54000,\"words\":180},\"slug\":\"2018/06/27/setup-a-pptp-vpn-on-ubuntu\",\"path\":\"blog/2018/06/27/setup-a-pptp-vpn-on-ubuntu\",\"filePath\":\"blog/2018/06/27/setup-a-pptp-vpn-on-ubuntu.mdx\",\"toc\":[{\"value\":\"Disable IPv6 Networking:\",\"url\":\"#disable-ipv6-networking\",\"depth\":2},{\"value\":\"Updates and Install PPTP:\",\"url\":\"#updates-and-install-pptp\",\"depth\":2},{\"value\":\"Enable IP Forwarding:\",\"url\":\"#enable-ip-forwarding\",\"depth\":2},{\"value\":\"Enable and Start PPTPD:\",\"url\":\"#enable-and-start-pptpd\",\"depth\":2},{\"value\":\"Resources:\",\"url\":\"#resources\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Setup a PPTP VPN on Ubuntu\",\"datePublished\":\"2018-06-27T08:18:51.000Z\",\"dateModified\":\"2018-06-27T08:18:51.000Z\",\"description\":\"This tutorial shows you how to setup and configure a pptp vpn on ubuntu linux.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2018/06/27/setup-a-pptp-vpn-on-ubuntu\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Deploy Docker Swarm using Ansible\",\"date\":\"2018-06-14T10:05:46.000Z\",\"tags\":[\"docker\",\"swarm\",\"ansible\",\"devops\"],\"draft\":false,\"summary\":\"In this devops tutorial, I will show you how to deploy a docker swarm cluster using ansible.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"3 min read\",\"minutes\":2.58,\"time\":154800,\"words\":516},\"slug\":\"2018/06/14/deploy-docker-swarm-using-ansible\",\"path\":\"blog/2018/06/14/deploy-docker-swarm-using-ansible\",\"filePath\":\"blog/2018/06/14/deploy-docker-swarm-using-ansible.mdx\",\"toc\":[{\"value\":\"Pre-Check\",\"url\":\"#pre-check\",\"depth\":2},{\"value\":\"Deploy Docker Swarm\",\"url\":\"#deploy-docker-swarm\",\"depth\":2},{\"value\":\"Test Application on Swarm\",\"url\":\"#test-application-on-swarm\",\"depth\":2},{\"value\":\"Delete the Swarm:\",\"url\":\"#delete-the-swarm\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Deploy Docker Swarm using Ansible\",\"datePublished\":\"2018-06-14T10:05:46.000Z\",\"dateModified\":\"2018-06-14T10:05:46.000Z\",\"description\":\"In this devops tutorial, I will show you how to deploy a docker swarm cluster using ansible.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2018/06/14/deploy-docker-swarm-using-ansible\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Setup a 3 Node Ceph Storage Cluster on Ubuntu 16\",\"date\":\"2018-06-13T22:22:06.000Z\",\"tags\":[\"ceph\",\"storage\",\"networking\"],\"draft\":false,\"summary\":\"In this tutorial we will setup and configure a 3 node ceph storage cluster on ubuntu linux.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"8 min read\",\"minutes\":7.075,\"time\":424500,\"words\":1415},\"slug\":\"2018/06/13/setup-a-3-node-ceph-storage-cluster-on-ubuntu-16\",\"path\":\"blog/2018/06/13/setup-a-3-node-ceph-storage-cluster-on-ubuntu-16\",\"filePath\":\"blog/2018/06/13/setup-a-3-node-ceph-storage-cluster-on-ubuntu-16.mdx\",\"toc\":[{\"value\":\"What is Ceph\",\"url\":\"#what-is-ceph\",\"depth\":2},{\"value\":\"Our Setup\",\"url\":\"#our-setup\",\"depth\":2},{\"value\":\"Host Entries\",\"url\":\"#host-entries\",\"depth\":2},{\"value\":\"User Accounts and Passwordless SSH\",\"url\":\"#user-accounts-and-passwordless-ssh\",\"depth\":2}
1,{\"value\":\"Pre-Requisite Software:\",\"url\":\"#pre-requisite-software\",\"depth\":2},{\"value\":\"Install Ceph\",\"url\":\"#install-ceph\",\"depth\":2},{\"value\":\"Initialize Ceph\",\"url\":\"#initialize-ceph\",\"depth\":2},{\"value\":\"Prepare the Disks:\",\"url\":\"#prepare-the-disks\",\"depth\":2},{\"value\":\"Redistribute Keys:\",\"url\":\"#redistribute-keys\",\"depth\":2},{\"value\":\"Ceph Status:\",\"url\":\"#ceph-status\",\"depth\":2},{\"value\":\"Storage Pools:\",\"url\":\"#storage-pools\",\"depth\":2},{\"value\":\"Object Storage RadosGW\",\"url\":\"#object-storage-radosgw\",\"depth\":2},{\"value\":\"Resources:\",\"url\":\"#resources\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Setup a 3 Node Ceph Storage Cluster on Ubuntu 16\",\"datePublished\":\"2018-06-13T22:22:06.000Z\",\"dateModified\":\"2018-06-13T22:22:06.000Z\",\"description\":\"In this tutorial we will setup and configure a 3 node ceph storage cluster on ubuntu linux.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2018/06/13/setup-a-3-node-ceph-storage-cluster-on-ubuntu-16\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Hello World Programs in Different Languages\",\"date\":\"2018-06-10T01:11:00.000Z\",\"tags\":[\"python\",\"golang\",\"java\",\"ruby\",\"programming\"],\"draft\":false,\"summary\":\"In this short tutorial I will show you hell-world examples in different programming languages.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"2 min read\",\"minutes\":1.025,\"time\":61500,\"words\":205},\"slug\":\"2018/06/09/hello-world-programs-in-different-languages\",\"path\":\"blog/2018/06/09/hello-world-programs-in-different-languages\",\"filePath\":\"blog/2018/06/09/hello-world-programs-in-different-languages.mdx\",\"toc\":[{\"value\":\"C++\",\"url\":\"#c\",\"depth\":2},{\"value\":\"Golang:\",\"url\":\"#golang\",\"depth\":2},{\"value\":\"Python\",\"url\":\"#python\",\"depth\":2},{\"value\":\"Ruby\",\"url\":\"#ruby\",\"depth\":2},{\"value\":\"Java\",\"url\":\"#java\",\"depth\":2},{\"value\":\"Resource:\",\"url\":\"#resource\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Hello World Programs in Different Languages\",\"datePublished\":\"2018-06-10T01:11:00.000Z\",\"dateModified\":\"2018-06-10T01:11:00.000Z\",\"description\":\"In this short tutorial I will show you hell-world examples in different programming languages.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2018/06/09/hello-world-programs-in-different-languages\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Setup a Peer to Peer VPN with VPNCloud on Ubuntu\",\"date\":\"2018-06-02T18:15:33.000Z\",\"tags\":[\"vpn\",\"networking\"],\"draft\":false,\"summary\":\"This tutorial shows you how to setup a peer to peer vpn with vpncloud on ubuntu linux.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"3 min read\",\"minutes\":2.81,\"time\":168600,\"words\":562},\"slug\":\"2018/06/02/setup-a-peer-to-peer-vpn-with-vpncloud-on-ubuntu\",\"path\":\"blog/2018/06/02/setup-a-peer-to-peer-vpn-with-vpncloud-on-ubuntu\",\"filePath\":\"blog/2018/06/02/setup-a-peer-to-peer-vpn-with-vpncloud-on-ubuntu.mdx\",\"toc\":[{\"value\":\"The Scenario:\",\"url\":\"#the-scenario\",\"depth\":2},{\"value\":\"VPNCloud\",\"url\":\"#vpncloud\",\"depth\":2},{\"value\":\"Setting up a 3 node Private Network:\",\"url\":\"#setting-up-a-3-node-private-network\",\"depth\":2},{\"value\":\"Start the VPN Service:\",\"url\":\"#start-the-vpn-service\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Setup a Peer to Peer VPN with VPNCloud on Ubuntu\",\"datePublished\":\"2018-06-02T18:15:33.000Z\",\"dateModified\":\"2018-06-02T18:15:33.000Z\",\"description\":\"This tutorial shows you how to setup a peer to peer vpn with vpncloud on ubuntu linux.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2018/06/02/setup-a-peer-to-peer-vpn-with-vpncloud-on-ubuntu\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Add a Authentication Header to your Python Flask App\",\"date\":\"2018-06-01T07:28:05.000Z\",\"tags\":[\"python\",\"flask\",\"web-development\",\"security\"],\"draft\":false,\"summary\":\"In this tutorial I 
1will show you how to add a authentication header in your python flask web application which you can use to control authorization.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"2 min read\",\"minutes\":1.57,\"time\":94200,\"words\":314},\"slug\":\"2018/06/01/add-a-authentication-header-to-your-python-flask-app\",\"path\":\"blog/2018/06/01/add-a-authentication-header-to-your-python-flask-app\",\"filePath\":\"blog/2018/06/01/add-a-authentication-header-to-your-python-flask-app.mdx\",\"toc\":[{\"value\":\"Python Flask Application:\",\"url\":\"#python-flask-application\",\"depth\":2},{\"value\":\"Requests to our App:\",\"url\":\"#requests-to-our-app\",\"depth\":2},{\"value\":\"Note:\",\"url\":\"#note\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Add a Authentication Header to your Python Flask App\",\"datePublished\":\"2018-06-01T07:28:05.000Z\",\"dateModified\":\"2018-06-01T07:28:05.000Z\",\"description\":\"In this tutorial I will show you how to add a authentication header in your python flask web application which you can use to control authorization.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2018/06/01/add-a-authentication-header-to-your-python-flask-app\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Clearing Up Disk Space on Docker Swarm by Removing Unused Data with Prune\",\"date\":\"2018-06-01T06:19:21.000Z\",\"tags\":[\"docker\",\"swarm\",\"sysadmin\"],\"draft\":false,\"summary\":\"This tutorial shows you how to clear up disk space on docker swarm by removing unused data with prune.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"1 min read\",\"minutes\":0.99,\"time\":59400,\"words\":198},\"slug\":\"2018/06/01/clearing-up-disk-space-on-docker-swarm-by-removing-unused-data-with-prune\",\"path\":\"blog/2018/06/01/clearing-up-disk-space-on-docker-swarm-by-removing-unused-data-with-prune\",\"filePath\":\"blog/2018/06/01/clearing-up-disk-space-on-docker-swarm-by-removing-unused-data-with-prune.mdx\",\"toc\":[{\"value\":\"Check Docker Disk Space\",\"url\":\"#check-docker-disk-space\",\"depth\":2},{\"value\":\"Removing Unsued Data:\",\"url\":\"#removing-unsued-data\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Clearing Up Disk Space on Docker Swarm by Removing Unused Data with Prune\",\"datePublished\":\"2018-06-01T06:19:21.000Z\",\"dateModified\":\"2018-06-01T06:19:21.000Z\",\"description\":\"This tutorial shows you how to clear up disk space on docker swarm by removing unused data with prune.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2018/06/01/clearing-up-disk-space-on-docker-swarm-by-removing-unused-data-with-prune\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"SSH Tools that comes in handy when dealing with Multiple Servers\",\"date\":\"2018-05-31T09:18:11.000Z\",\"tags\":[\"ssh\",\"linux\"],\"draft\":false,\"summary\":\"This tutorial shows you what ssh tools comes in handy when dealing with multiple servers using ssh config.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"3 min read\",\"minutes\":2.94,\"time\":176400,\"words\":588},\"slug\":\"2018/05/31/ssh-tools-that-comes-in-handy-when-dealing-with-multiple-servers\",\"path\":\"blog/2018/05/31/ssh-tools-that-comes-in-handy-when-dealing-with-multiple-servers\",\"filePath\":\"blog/2018/05/31/ssh-tools-that-comes-in-handy-when-dealing-with-multiple-servers.mdx\",\"toc\":[{\"value\":\"SSH Config\",\"url\":\"#ssh-config\",\"depth\":2},{\"value\":\"SSH Timeout\",\"url\":\"#ssh-timeout\",\"depth\":2},{\"value\":\"SSH Agent\",\"url\":\"#ssh-agent\",\"depth\":2},{\"value\":\"Multiple Github Accounts:\",\"url\":\"#multiple-github-accounts\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"SSH Tools that comes in handy when dealing with Multiple Servers\",\"datePublished\":\"2018-05-31T09:18:11.000Z\",\"dateModified\":\"2018-05-31T09:18:11.000Z\",\"description\":\"This tutorial shows you what ssh tools comes in handy when dealing with multiple servers using ssh config.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2018/05/31/ssh-tools-that-comes-in-handy-when-dealing-with-multiple-servers\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Wildcard SSL Certificate with Letsencrypt on Docker Swarm using Traefik\",\"date\":\"2018-05-28T21:36:17.000Z\",\"tags\":[\"docker\",\"swarm\",\"letsencrypt\",\"traefik\"],\"draft\":false,\"summary\":\"This tutorial will show you how to implement wildcard ssl certificates with letsencrypt on docker swarm using traefik proxy.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"4 min read\",\"minutes\":3.08,\"t
1ime\":184800,\"words\":616},\"slug\":\"2018/05/28/wildcard-ssl-certificate-with-letsencrypt-on-docker-swarm-using-traefik\",\"path\":\"blog/2018/05/28/wildcard-ssl-certificate-with-letsencrypt-on-docker-swarm-using-traefik\",\"filePath\":\"blog/2018/05/28/wildcard-ssl-certificate-with-letsencrypt-on-docker-swarm-using-traefik.mdx\",\"toc\":[{\"value\":\"Architectural Design:\",\"url\":\"#architectural-design\",\"depth\":2},{\"value\":\"Create the Overlay Network:\",\"url\":\"#create-the-overlay-network\",\"depth\":2},{\"value\":\"Create the Compose Files for our Stacks:\",\"url\":\"#create-the-compose-files-for-our-stacks\",\"depth\":2},{\"value\":\"Prepare the Path for Traefik:\",\"url\":\"#prepare-the-path-for-traefik\",\"depth\":2},{\"value\":\"Deploy the Stacks:\",\"url\":\"#deploy-the-stacks\",\"depth\":2},{\"value\":\"Test the Application:\",\"url\":\"#test-the-application\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Wildcard SSL Certificate with Letsencrypt on Docker Swarm using Traefik\",\"datePublished\":\"2018-05-28T21:36:17.000Z\",\"dateModified\":\"2018-05-28T21:36:17.000Z\",\"description\":\"This tutorial will show you how to implement wildcard ssl certificates with letsencrypt on docker swarm using traefik proxy.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2018/05/28/wildcard-ssl-certificate-with-letsencrypt-on-docker-swarm-using-traefik\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Web Forms with Python Flask and the WTForms Module with Bootstrap\",\"date\":\"2018-05-27T21:44:41.000Z\",\"tags\":[\"python\",\"flask\"],\"draft\":false,\"summary\":\"This tutorial shows how to use web forms using python flask and the wtforms module with bootstrap for styling.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"2 min read\",\"minutes\":1.34,\"time\":80400,\"words\":268},\"slug\":\"2018/05/27/web-forms-with-python-flask-and-the-wtforms-module-with-bootstrap\",\"path\":\"blog/2018/05/27/web-forms-with-python-flask-and-the-wtforms-module-with-bootstrap\",\"filePath\":\"blog/2018/05/27/web-forms-with-python-flask-and-the-wtforms-module-with-bootstrap.mdx\",\"toc\":[{\"value\":\"Requirements:\",\"url\":\"#requirements\",\"depth\":2},{\"value\":\"Application:\",\"url\":\"#application\",\"depth\":2},{\"value\":\"HTML Template:\",\"url\":\"#html-template\",\"depth\":2},{\"value\":\"Resources:\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Web Forms with Python Flask and the WTForms Module with Bootstrap\",\"datePublished\":\"2018-05-27T21:44:41.000Z\",\"dateModified\":\"2018-05-27T21:44:41.000Z\",\"description\":\"This tutorial shows how to use web forms using python flask and the wtforms module with bootstrap for styling.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2018/05/27/web-forms-with-python-flask-and-the-wtforms-module-with-bootstrap\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Generate Random Characters with Python using Random and String Modules\",\"date\":\"2018-05-23T10:29:06.000Z\",\"tags\":[\"python\",\"programming\",\"scripting\"],\"draft\":false,\"summary\":\"This tutorial shows you how to use python to generate random characters using the random and string python modules.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"2 min read\",\"minutes\":1.54,\"time\":92400,\"words\":308},\"slug\":\"2018/05/23/generate-random-characters-with-python-using-random-and-string-modules\",\"path\":\"blog/2018/05/23/generate-random-characters-with-python-using-random-and-string-modules\",\"filePath\":\"blog/2018/05/23/generate-random-characters-with-python-using-random-and-string-modules.mdx\",\"toc\":[{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Generate Random Characters with Python using Random and String Modules\",\"datePublished\":\"2018-05-23T10:29:06.000Z\",\"dateModified\":\"2018-05-23T10:29:06.000Z\",\"description\":\"This tutorial shows you how to use python to generate random characters using the random and string python modules.\",\"
1image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2018/05/23/generate-random-characters-with-python-using-random-and-string-modules\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Manage Scaleway Instances via their API like a Boss with their Command Line Tool scw\",\"date\":\"2018-05-09T16:31:11.000Z\",\"tags\":[\"scaleway\",\"cli\",\"api\",\"docker\"],\"draft\":false,\"summary\":\"This tutorial show you how to manage scaleway compute instances via their api with their command line scw.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"6 min read\",\"minutes\":5.25,\"time\":315000,\"words\":1050},\"slug\":\"2018/05/09/manage-scaleway-instances-via-their-api-like-a-boss-with-their-command-line-tool-scw\",\"path\":\"blog/2018/05/09/manage-scaleway-instances-via-their-api-like-a-boss-with-their-command-line-tool-scw\",\"filePath\":\"blog/2018/05/09/manage-scaleway-instances-via-their-api-like-a-boss-with-their-command-line-tool-scw.mdx\",\"toc\":[{\"value\":\"Scaleway Command Line Interface:\",\"url\":\"#scaleway-command-line-interface\",\"depth\":2},{\"value\":\"Install the SCW CLI Tool:\",\"url\":\"#install-the-scw-cli-tool\",\"depth\":2},{\"value\":\"Authentication:\",\"url\":\"#authentication\",\"depth\":2},{\"value\":\"Getting Info from Scaleway\",\"url\":\"#getting-info-from-scaleway\",\"depth\":2},{\"value\":\"Create Instances:\",\"url\":\"#create-instances\",\"depth\":2},{\"value\":\"Terminating Resources:\",\"url\":\"#terminating-resources\",\"depth\":2},{\"value\":\"Resources:\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Manage Scaleway Instances via their API like a Boss with their Command Line Tool scw\",\"datePublished\":\"2018-05-09T16:31:11.000Z\",\"dateModified\":\"2018-05-09T16:31:11.000Z\",\"description\":\"This tutorial show you how to manage scaleway compute instances via their api with their command line scw.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2018/05/09/manage-scaleway-instances-via-their-api-like-a-boss-with-their-command-line-tool-scw\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Temporary IAM Credentials from EC2 Instance Metadata using Python\",\"date\":\"2018-05-09T16:14:11.000Z\",\"tags\":[\"aws\",\"iam\",\"security\",\"python\",\"boto3\"],\"draft\":false,\"summary\":\"This tutorial will show you how to obtain temporary aws iam credentials from aws ec2 instance metadata using python.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"3 min read\",\"minutes\":2.165,\"time\":129900,\"words\":433},\"slug\":\"2018/05/09/temporary-iam-credentials-from-ec2-instance-metadata-using-python\",\"path\":\"blog/2018/05/09/temporary-iam-credentials-from-ec2-instance-metadata-using-python\",\"filePath\":\"blog/2018/05/09/temporary-iam-credentials-from-ec2-instance-metadata-using-python.mdx\",\"toc\":[{\"value\":\"Best Practice: Security\",\"url\":\"#best-practice-security\",\"depth\":2},{\"value\":\"Scenario: Applications on AWS EC2\",\"url\":\"#scenario-applications-on-aws-ec2\",\"depth\":2},{\"value\":\"Use Temporary Credentials to Read from DynamoDB using botocore\",\"url\":\"#use-temporary-credentials-to-read-from-dynamodb-using-botocore\",\"depth\":2},{\"value\":\"Another method is boto3 Session:\",\"url\":\"#another-method-is-boto3-session\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Temporary IAM Credentials from EC2 Instance Metadata using Python\",\"datePublished\":\"2018-05-09T16:14:11.000Z\",\"dateModified\":\"2018-05-09T16:14:11.000Z\",\"description\":\"This tutorial will show you how to obtain temporary aws iam credentials from aws ec2 instance metadata using python.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2018/05/09/temporary-iam-credentials-from-ec2-instance-metadata-using-python\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Use Python Requests to Interact with the iTunes API to search for Music Info\",\"date\":\"2018-05-08T21:01:11.000Z\",\"tags\":[\"python\",\"api\"],\"draft\":false,\"summary\":\"This tutorial shows you how to use python requests module to interact with the itunes api to search for music info.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"5 min read\",\"minutes\":4.92,\"t
1ime\":295200,\"words\":984},\"slug\":\"2018/05/08/use-python-requests-to-interact-with-the-itunes-api-to-search-for-music-info\",\"path\":\"blog/2018/05/08/use-python-requests-to-interact-with-the-itunes-api-to-search-for-music-info\",\"filePath\":\"blog/2018/05/08/use-python-requests-to-interact-with-the-itunes-api-to-search-for-music-info.mdx\",\"toc\":[{\"value\":\"Resources:\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Install the Request Module:\",\"url\":\"#install-the-request-module\",\"depth\":2},{\"value\":\"Basic Usage of Requests:\",\"url\":\"#basic-usage-of-requests\",\"depth\":2},{\"value\":\"Python Requests and the iTunes API:\",\"url\":\"#python-requests-and-the-itunes-api\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Use Python Requests to Interact with the iTunes API to search for Music Info\",\"datePublished\":\"2018-05-08T21:01:11.000Z\",\"dateModified\":\"2018-05-08T21:01:11.000Z\",\"description\":\"This tutorial shows you how to use python requests module to interact with the itunes api to search for music info.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2018/05/08/use-python-requests-to-interact-with-the-itunes-api-to-search-for-music-info\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Setup the Elasticsearch Log Driver on Docker Swarm\",\"date\":\"2018-05-02T19:10:30.000Z\",\"tags\":[\"docker\",\"swarm\",\"elasticsearch\",\"devops\"],\"draft\":false,\"summary\":\"This tutorial shows you how to setup the elasticsearch log driver on docker swarm.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"4 min read\",\"minutes\":3.66,\"time\":219600,\"words\":732},\"slug\":\"2018/05/02/setup-the-elasticsearch-log-driver-on-docker-swarm\",\"path\":\"blog/2018/05/02/setup-the-elasticsearch-log-driver-on-docker-swarm\",\"filePath\":\"blog/2018/05/02/setup-the-elasticsearch-log-driver-on-docker-swarm.mdx\",\"toc\":[{\"value\":\"Why a Log Driver?\",\"url\":\"#why-a-log-driver\",\"depth\":2},{\"value\":\"Installing to Elasticsearch Log Driver:\",\"url\":\"#installing-to-elasticsearch-log-driver\",\"depth\":2},{\"value\":\"Test the Log Driver:\",\"url\":\"#test-the-log-driver\",\"depth\":2},{\"value\":\"Using Swarm and Docker Compose:\",\"url\":\"#using-swarm-and-docker-compose\",\"depth\":2},{\"value\":\"Resources:\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Setup the Elasticsearch Log Driver on Docker Swarm\",\"datePublished\":\"2018-05-02T19:10:30.000Z\",\"dateModified\":\"2018-05-02T19:10:30.000Z\",\"description\":\"This tutorial shows you how to setup the elasticsearch log driver on docker swarm.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2018/05/02/setup-the-elasticsearch-log-driver-on-docker-swarm\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Forwarding The Docker Socket via a SSH Tunnel to Execute Docker Commands Locally\",\"date\":\"2018-04-30T12:30:23.000Z\",\"tags\":[\"docker\",\"ssh\",\"networking\"],\"draft\":false,\"summary\":\"See how we can forward the docker socket via a ssh tunnel to execute docker commands on the remote server, locally.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"3 min read\",\"minutes\":2.45,\"time\":147000,\"words\":490},\"slug\":\"2018/04/30/forwarding-the-docker-socket-via-a-ssh-tunnel-to-execute-docker-commands-locally\",\"path\":\"blog/2018/04/30/forwarding-the-docker-socket-via-a-ssh-tunnel-to-execute-docker-commands-locally\",\"filePath\":\"blog/2018/04/30/forwarding-the-docker-socket-via-a-ssh-tunnel-to-execute-docker-commands-locally.mdx\",\"toc\":[{\"value\":\"Setting up the SSH Tunnel:\",\"url\":\"#setting-up-the-ssh-tunnel\",\"depth\":2},{\"value\":\"Verifying that the tunnel is established:\",\"url\":\"#verifying-that-the-tunnel-is-established\",\"depth\":2},{\"value\":\"Inform the Docker Client to use the Port:\",\"url\":\"#inform-the-docker-client-to-use-the-port\",\"depth\":2},{\"value\":\"Testing it Out:\",\"url\":\"#testing-it-out\",\"depth\":2},{\"value\":\"Terminating our SSH Tunnel:\",\"url\":\"#terminating-our-ssh-tunnel\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Forwarding The Docker Socket via a SSH Tunnel to Execute Docker Commands Locally\",\"datePublished\":\"2018-04-30T12:30:23.000Z\",\"dateModified\":\"2018-04-30T12:30:23.000Z\",\"description\":\"See how we can forward the docker socket via a ssh tunnel to execute docker 
1commands on the remote server, locally.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2018/04/30/forwarding-the-docker-socket-via-a-ssh-tunnel-to-execute-docker-commands-locally\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Encryption and Decryption with the PyCrypto module using the AES Cipher in Python\",\"date\":\"2018-04-30T05:43:26.000Z\",\"tags\":[\"python\",\"cryptography\",\"encryption\",\"security\"],\"draft\":false,\"summary\":\"This tutorial shows how we can encrypt and decrypt using the pycrypto module using the aes cipher in python.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"2 min read\",\"minutes\":1.535,\"time\":92100,\"words\":307},\"slug\":\"2018/04/30/encryption-and-decryption-with-the-pycrypto-module-using-the-aes-cipher-in-python\",\"path\":\"blog/2018/04/30/encryption-and-decryption-with-the-pycrypto-module-using-the-aes-cipher-in-python\",\"filePath\":\"blog/2018/04/30/encryption-and-decryption-with-the-pycrypto-module-using-the-aes-cipher-in-python.mdx\",\"toc\":[{\"value\":\"Installing PyCrypto:\",\"url\":\"#installing-pycrypto\",\"depth\":2},{\"value\":\"PyCrypto Example:\",\"url\":\"#pycrypto-example\",\"depth\":2},{\"value\":\"References:\",\"url\":\"#references\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Encryption and Decryption with the PyCrypto module using the AES Cipher in Python\",\"datePublished\":\"2018-04-30T05:43:26.000Z\",\"dateModified\":\"2018-04-30T05:43:26.000Z\",\"description\":\"This tutorial shows how we can encrypt and decrypt using the pycrypto module using the aes cipher in python.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2018/04/30/encryption-and-decryption-with-the-pycrypto-module-using-the-aes-cipher-in-python\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Running a 3 Node Elasticsearch Cluster with Docker Compose on your Laptop for testing\",\"date\":\"2018-04-29T17:43:35.000Z\",\"tags\":[\"docker\",\"elasticsearch\",\"kibana\"],\"draft\":false,\"summary\":\"See how to run a 3 node elasticsearch cluster with docker compose on your laptop for testing.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"3 min read\",\"minutes\":2.56,\"time\":153600,\"words\":512},\"slug\":\"2018/04/29/running-a-3-node-elasticsearch-cluster-with-docker-compose-on-your-laptop-for-testing\",\"path\":\"blog/2018/04/29/running-a-3-node-elasticsearch-cluster-with-docker-compose-on-your-laptop-for-testing\",\"filePath\":\"blog/2018/04/29/running-a-3-node-elasticsearch-cluster-with-docker-compose-on-your-laptop-for-testing.mdx\",\"toc\":[{\"value\":\"Pre-Requisites\",\"url\":\"#pre-requisites\",\"depth\":2},{\"value\":\"Docker Compose:\",\"url\":\"#docker-compose\",\"depth\":2},{\"value\":\"Deploy\",\"url\":\"#deploy\",\"depth\":2},{\"value\":\"Testing Elasticsearch\",\"url\":\"#testing-elasticsearch\",\"depth\":2},{\"value\":\"Kibana\",\"url\":\"#kibana\",\"depth\":2},{\"value\":\"Elasticsearch Head UI\",\"url\":\"#elasticsearch-head-ui\",\"depth\":2},{\"value\":\"Deleting the Cluster:\",\"url\":\"#deleting-the-cluster\",\"depth\":2},{\"value\":\"Resources:\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Running a 3 Node Elasticsearch Cluster with Docker Compose on your Laptop for testing\",\"datePublished\":\"2018-04-29T17:43:35.000Z\",\"dateModified\":\"2018-04-29T17:43:35.000Z\",\"description\":\"See how to run a 3 node elasticsearch cluster with docker compose on your laptop for testing.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2018/04/29/running-a-3-node-elasticsearch-cluster-with-docker-compose-on-your-laptop-for-testing\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Using the Bulk API with Elasticsearch\",\"date\":\"2018-04-29T17:32:21.000Z\",\"tags\":[\"elasticsearch\"],\"draft\":false,\"summary\":\"See how we can use the bulk api in elasticsearch when we want to load bulk data into elasticsearch.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"4 min read\",\"minutes\":3.725,\"time\":223500,\"words\":745},\"slug\":\"2018/04/29/using-the-bulk-api-with-elasticsearch\",\"path\":\"blog/2018/04/29/using-the-bulk-api-with-elasticsearch\",\"filePath\":\"blog/2018/04/29/using-the-bulk-api-with-elasticsearch.mdx\",\"toc\":[{\"value\":\"The Dataset\",\"url\":\"#the-dataset\",\"depth\":2},{\"value\":\"Using the Bulk API:\",\"url\":\"#using-the-bulk-api\",\"depth\":2},{\"value\":\"Demo Recording:\",\"url\":\"#demo-recording\",\"depth\":2},{\"value\":\"Using Bulk with Auto Generated ID's\",\"url\":\"#using-bulk-with-auto-generated-ids\",\"depth\":2},{\"value\":\"Resources:\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Using the Bulk API with Elasticsearch\",\"datePublished\":\"2018-04-29T17:32:21.000Z\",\"dateModified\":\"2018-04-29T17:32:21.000Z\",\"description\":\"See how we can use the bulk api in elasticsearch when we want to load bulk data into elasticsearch.\",\"
1image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2018/04/29/using-the-bulk-api-with-elasticsearch\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Encryption and Decryption with Simple Crypt using Python\",\"date\":\"2018-04-29T14:50:46.000Z\",\"tags\":[\"python\",\"cryptography\",\"encryption\"],\"draft\":false,\"summary\":\"See how you can use simple crypt to encrypt and decrypt using python.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"3 min read\",\"minutes\":2.995,\"time\":179700,\"words\":599},\"slug\":\"2018/04/29/encryption-and-decryption-with-simple-crypt-using-python\",\"path\":\"blog/2018/04/29/encryption-and-decryption-with-simple-crypt-using-python\",\"filePath\":\"blog/2018/04/29/encryption-and-decryption-with-simple-crypt-using-python.mdx\",\"toc\":[{\"value\":\"Simple Crypt\",\"url\":\"#simple-crypt\",\"depth\":2},{\"value\":\"Installing Simple-Crypt:\",\"url\":\"#installing-simple-crypt\",\"depth\":2},{\"value\":\"Simple Examples:\",\"url\":\"#simple-examples\",\"depth\":2},{\"value\":\"SimpleCrypt Base64 and Getpass\",\"url\":\"#simplecrypt-base64-and-getpass\",\"depth\":2},{\"value\":\"Encrypt and Decrypting Data using our Scripts:\",\"url\":\"#encrypt-and-decrypting-data-using-our-scripts\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Encryption and Decryption with Simple Crypt using Python\",\"datePublished\":\"2018-04-29T14:50:46.000Z\",\"dateModified\":\"2018-04-29T14:50:46.000Z\",\"description\":\"See how you can use simple crypt to encrypt and decrypt using python.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2018/04/29/encryption-and-decryption-with-simple-crypt-using-python\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Using Paramiko module in Python to execute Remote Bash Commands\",\"date\":\"2018-04-23T16:16:59.000Z\",\"tags\":[\"paramiko\",\"ssh\",\"python\"],\"draft\":false,\"summary\":\"Use the paramiko module in python to execute remote bash commands.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"2 min read\",\"minutes\":1.105,\"time\":66300,\"words\":221},\"slug\":\"2018/04/23/using-paramiko-module-in-python-to-execute-remote-bash-commands\",\"path\":\"blog/2018/04/23/using-paramiko-module-in-python-to-execute-remote-bash-commands\",\"filePath\":\"blog/2018/04/23/using-paramiko-module-in-python-to-execute-remote-bash-commands.mdx\",\"toc\":[{\"value\":\"Paramiko to execute Remote Commands:\",\"url\":\"#paramiko-to-execute-remote-commands\",\"depth\":2},{\"value\":\"Getting the Dependencies:\",\"url\":\"#getting-the-dependencies\",\"depth\":2},{\"value\":\"Using Paramiko in our Code:\",\"url\":\"#using-paramiko-in-our-code\",\"depth\":2},{\"value\":\"Execute our Command Remotely:\",\"url\":\"#execute-our-command-remotely\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Using Paramiko module in Python to execute Remote Bash Commands\",\"datePublished\":\"2018-04-23T16:16:59.000Z\",\"dateModified\":\"2018-04-23T16:16:59.000Z\",\"description\":\"Use the paramiko module in python to execute remote bash commands.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2018/04/23/using-paramiko-module-in-python-to-execute-remote-bash-commands\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Setup a SSH Tunnel with the sshtunnel module in Python\",\"date\":\"2018-04-23T15:56:46.000Z\",\"tags\":[\"python\",\"ssh\",\"networking\"],\"draft\":false,\"summary\":\"Setup a ssh tunnel with the sshtunnel module in python.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"2 min read\",\"minutes\":1.83,\"time\":109800,\"words\":366},\"slug\":\"2018/04/23/setup-a-ssh-tunnel-with-the-sshtunnel-module-in-python\",\"path\":\"blog/2018/04/23/setup-a-ssh-tunnel-with-the-sshtunnel-module-in-python\",\"filePath\":\"blog/2018/04/23/setup-a-ssh-tunnel-with-the-sshtunnel-module-in-python.mdx\",\"toc\":[{\"value\":\"Remote Side:\",\"url\":\"#remote-side\",\"depth\":2},{\"value\":\"Client Side:\",\"url\":\"#client-side\",\"depth\":2},{\"value\":\"Resources:\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Setup a SSH Tunnel with the sshtunnel module in Python\",\"datePublished\":\"2018-04-23T15:56:46.000Z\",\"dateModified\":\"2018-04-23T15:56:46.000Z\",\"description\":\"Setup a ssh tunnel with the sshtunnel module in python.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2018/04/23/setup-a-ssh-tunnel-with-the-sshtunnel-module-in-python\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Basic RESTFul API Server with Python Flask\",\"date\":\"2018-04-21T23:35:34.000Z\",\"tags\":[\"python\",\"flask\",\"api\"],\"draft\":false,\"summary\":\"Setup a basic restful api server using python flask.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"5 min read\",\"minutes\":4.47,\"time\":268200,\"words\":894},\"slug\":\"2018/04/21/basic-restful-api-server-with-python-flask\",\"path\":\"blog/2018/04/21/basic-restful-api-server-with-python-flask\",\"filePath\":\"blog/2018/04/21/basic-restful-api-server-with-python-flask.mdx\",\"toc\":[{\"value\":\"Description of this demonstration:\",\"url\":\"#description-of-this-demonstration\",\"depth\":2},{\"value\":\"Getting the Dependencies:\",\"url\":\"#getting-the-dependencies\",\"depth\":2},{\"value\":\"The API Server Code:\",\"url\":\"#the-api-server-code\",\"depth\":2},{\"value\":\"Demo Time:\",\"url\":\"#demo-time\",\"depth\":2},{\"value\":\"Using Python Requests:\",\"url\":\"#using-python-requests\",\"depth\":2},{\"value\":\"Resources:\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Basic RESTFul API Server with Python Flask\",\"datePublished\":\"2018-04-21T23:35:34.000Z\",\"dateModified\":\"2018-04-21T23:35:34.000Z\",\"description\":\"Setup a basic restful api server using python flask.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2018/04/21/basic-restful-api-server-with-python-flask\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Basic Introduction to use arguments with Argparse on Python\",\"date\":\"2018-04-18T17:35:28.000Z\",\"tags\":[\"python\",\"argparse\",\"programming\"],\"draft\":false,\"summary\":\"See in this tutorial how you can pass arguments to your python script using argparse in python.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"3 min read\",\"minutes\":2.525,\"time\":151500,\"words\":505},\"slug\":\"2018/04/18/basic-introduction-to-use-arguments-with-argparse-on-python\",\"path\":\"blog/2018/04/18/basic-introduction-to-use-arguments-with-argparse-on-python\",\"filePath\":\"blog/2018/04/18/basic-introduction-to-use-arguments-with-argparse-on-python.mdx\",\"toc\":[{\"value\":\"The Basic Demonstration:\",\"url\":\"#the-basic-demonstration\",\"depth\":2},{\"value\":\"The Python Argparse Tutorial Code:\",\"url\":\"#the-python-argparse-tutorial-code\",\"depth\":2},{\"value\":\"Seeing it in action:\",\"url\":\"#seeing-it-in-action\",\"depth\":2},{\"value\":\"Resource:\",\"url\":\"#resource\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Basic Introduction to use arguments with Argparse on Python\",\"datePublished\":\"2018-04-18T17:35:28.000Z\",\"dateModified\":\"2018-04-18T17:35:28.000Z\",\"description\":\"See in this tutorial how you can pass arguments to your python script using argparse in python.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2018/04/18/basic-introduction-to-use-arguments-with-argparse-on-python\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"How to Monitor a Amazon Elasticsearch Service Cluster Update Process\",\"date\":\"2018-04-16T07:24:09.000Z\",\"tags\":[\"elasticsearch\",\"aws\"],\"draft\":false,\"summary\":\"See how you can monitor a amazon elasticsearch service cluster's update process.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"5 min read\",\"minutes\":4.27,\"time\":256200,\"words\":854},\"slug\":\"2018/04/16/how-to-monitor-a-amazon-elasticsearch-service-cluster-update-process\",\"path\":\"blog/2018/04/16/how-to-monitor-a-amazon-elasticsearch-service-cluster-update-process\",\"filePath\":\"blog/2018/04/16/how-to-monitor-a-amazon-elasticsearch-service-cluster-update-process.mdx\",\"toc\":[{\"value\":\"The Shards API:\",\"url\":\"#the-shards-api\",\"depth\":2},{\"value\":\"The Recovery API:\",\"url\":\"#the-recovery-api\",\"depth\":2},{\"value\":\"The Cluster Health API:\",\"url\":\"#the-cluster-health-api\",\"depth\":2},{\"value\":\"The Pending Tasks API:\",\"url\":\"#the-pending-tasks-api\",\"depth\":2},{\"value\":\"Resources:\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"How to Monitor a Amazon Elasticsearch Service Cluster Update Process\",\"datePublished\":\"2018-04-16T07:24:09.000Z\",\"dateModified\":\"2018-04-16T07:24:09.000Z\",\"description\":\"See how you can monitor a amazon elasticsearch service cluster's update process.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2018/04/16/how-to-monitor-a-amazon-elasticsearch-service-cluster-update-process\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Experimenting with Python and TinyMongo a MongoDB wrapper for TinyDB\",\"date\":\"2018-04-15T20:39:22.000Z\",\"tags\":[\"python\",\"mongodb\",\"databases\"],\"draft\":false,\"summary\":\"We will experiment with python and tinymongo, which is a mongodb wrapper for tinydb.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"2 min read\",\"minutes\":1.865,\"time\":111900,\"words\":373},\"slug\":\"2018/04/15/experimenting-with-python-and-tinymongo-a-mongodb-wrapper-for-tinydb\",\"path\":\"blog/2018/04/15/experimenting-with-python-and-tinymongo-a-mongodb-wrapper-for-tinydb\",\"filePath\":\"blog/2018/04/15/experimenting-with-python-and-tinymongo-a-mongodb-wrapper-for-tinydb.mdx\",\"toc\":[{\"value\":\"Installing Dependencies:\",\"url\":\"#installing-dependencies\",\"depth\":2},{\"value\":\"Usage Examples:\",\"url\":\"#usage-examples\",\"depth\":2},{\"value\":\"Resources:\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Experimenting with Python and TinyMongo a MongoDB wrapper for TinyDB\",\"datePublished\":\"2018-04-15T20:39:22.000Z\",\"dateModified\":\"2018-04-15T20:39:22.000Z\",\"description\":\"We will experiment with python and tinymongo, which is a mongodb wrapper for tinydb.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2018/04/15/experimenting-with-python-and-tinymongo-a-mongodb-wrapper-for-tinydb\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Experimenting with Python and Flata the Lightweight Document Orientated Database\",\"date\":\"2018-04-15T19:09:25.000Z\",\"tags\":[\"python\",\"databases\"],\"draft\":false,\"summary\":\"Experiment with python and flata, the lightweight document orientated database.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"5 min read\",\"minutes\":4.52,\"time\":271200,\"words\":904},\"slug\":\"2018/04/15/experimenting-with-python-and-flata-the-lightweight-document-orientated-database\",\"path\":\"blog/2018/04/15/experimenting-with-python-and-flata-the-lightweight-document-orientated-database\",\"filePath\":\"blog/2018/04/15/experimenting-with-python-and-flata-the-lightweight-document-orientated-database.mdx\",\"toc\":[{\"value\":\"Why Flata?\",\"url\":\"#why-flata\",\"depth\":2},{\"value\":\"What will we be doing today:\",\"url\":\"#what-will-we-be-doing-today\",\"depth\":2},{\"value\":\"Getting the Dependencies:\",\"url\":\"#getting-the-dependencies\",\"depth\":2},{\"value\":\"Usage Examples:\",\"url\":\"#usage-examples\",\"depth\":2},{\"value\":\"Resources:\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Experimenting with Python and Flata the Lightweight Document Orientated Database\",\"datePublished\":\"2018-04-15T19:09:25.000Z\",\"dateModified\":\"2018-04-15T19:09:25.000Z\",\"description\":\"Experiment with python and flata, the lightweight document orientated database.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2018/04/15/experimenting-with-python-and-flata-the-lightweight-document-orientated-database\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Set Docker Environment Variables during Build Time\",\"date\":\"2018-04-07T13:51:35.000Z\",\"tags\":[\"docker\"],\"draft\":false,\"summary\":\"See how to set docker environment variables during build time.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"2 min read\",\"minutes\":1.21,\"time\":72600,\"words\":242},\"slug\":\"2018/04/07/set-docker-environment-variables-during-build-time\",\"path\":\"blog/2018/04/07/set-docker-environment-variables-during-build-time\",\"filePath\":\"blog/2018/04/07/set-docker-environment-variables-during-build-time.mdx\",\"toc\":[{\"value\":\"The Dockerfile:\",\"url\":\"#the-dockerfile\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Set Docker Environment Variables during Build Time\",\"datePublished\":\"2018-04-07T13:51:35.000Z\",\"dateModified\":\"2018-04-07T13:51:35.000Z\",\"description\":\"See how to set docker environment variables during build time.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2018/04/07/set-docker-environment-variables-during-build-time\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Docker Environment Substitution with Dockerfile\",\"date\":\"2018-04-07T13:18:20.000Z\",\"tags\":[\"docker\"],\"draft\":false,\"summary\":\"This tutorial will show you how to substitute environment variables in your dockerfile.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"2 min read\",\"minutes\":1.34,\"time\":80400,\"words\":268}
1,\"slug\":\"2018/04/07/docker-environment-substitution-with-dockerfile\",\"path\":\"blog/2018/04/07/docker-environment-substitution-with-dockerfile\",\"filePath\":\"blog/2018/04/07/docker-environment-substitution-with-dockerfile.mdx\",\"toc\":[{\"value\":\"What will we be doing:\",\"url\":\"#what-will-we-be-doing\",\"depth\":2},{\"value\":\"The Dockerfile\",\"url\":\"#the-dockerfile\",\"depth\":2},{\"value\":\"Putting it to action:\",\"url\":\"#putting-it-to-action\",\"depth\":2},{\"value\":\"Resources:\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Docker Environment Substitution with Dockerfile\",\"datePublished\":\"2018-04-07T13:18:20.000Z\",\"dateModified\":\"2018-04-07T13:18:20.000Z\",\"description\":\"This tutorial will show you how to substitute environment variables in your dockerfile.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2018/04/07/docker-environment-substitution-with-dockerfile\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Using AWS SSM Parameter Store to Retrieve Secrets Encrypted by KMS using Python\",\"date\":\"2018-04-04T20:47:16.000Z\",\"tags\":[\"aws\",\"secrets\",\"python\",\"boto3\"],\"draft\":false,\"summary\":\"This tutorial will show you how to use aws ssm parameter store to retrieve secrets, encrypted by aws kms using python.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"5 min read\",\"minutes\":4.33,\"time\":259800,\"words\":866},\"slug\":\"2018/04/04/using-aws-ssm-parameter-store-to-retrieve-secrets-encrypted-by-kms-using-python\",\"path\":\"blog/2018/04/04/using-aws-ssm-parameter-store-to-retrieve-secrets-encrypted-by-kms-using-python\",\"filePath\":\"blog/2018/04/04/using-aws-ssm-parameter-store-to-retrieve-secrets-encrypted-by-kms-using-python.mdx\",\"toc\":[{\"value\":\"The Do List:\",\"url\":\"#the-do-list\",\"depth\":2},{\"value\":\"Create the KMS Key:\",\"url\":\"#create-the-kms-key\",\"depth\":2},{\"value\":\"Publish the Secrets to SSM:\",\"url\":\"#publish-the-secrets-to-ssm\",\"depth\":2},{\"value\":\"Describe Parameters\",\"url\":\"#describe-parameters\",\"depth\":2},{\"value\":\"Reading from SSM:\",\"url\":\"#reading-from-ssm\",\"depth\":2},{\"value\":\"Grant Permissions to Instance Profile:\",\"url\":\"#grant-permissions-to-instance-profile\",\"depth\":2},{\"value\":\"Reading with GetParameters:\",\"url\":\"#reading-with-getparameters\",\"depth\":2},{\"value\":\"Environment Variable Example from an Application:\",\"url\":\"#environment-variable-example-from-an-application\",\"depth\":2},{\"value\":\"Resources:\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Using AWS SSM Parameter Store to Retrieve Secrets Encrypted by KMS using Python\",\"datePublished\":\"2018-04-04T20:47:16.000Z\",\"dateModified\":\"2018-04-04T20:47:16.000Z\",\"description\":\"This tutorial will show you how to use aws ssm parameter store to retrieve secrets, encrypted by aws kms using python.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2018/04/04/using-aws-ssm-parameter-store-to-retrieve-secrets-encrypted-by-kms-using-python\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Using Python Boto3 and DreamHosts DreamObjects to Interact with their Object Storage Offering\",\"date\":\"2018-04-03T11:19:27.000Z\",\"tags\":[\"dreamhost\",\"python\",\"boto3\",\"s3\",\"storage\"],\"draft\":false,\"summary\":\"This tutorial will show you how to use python boto3 and dreamhost to interact with their s3 compatible object service called dreamobjects.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"4 min read\",\"minutes\":3.26,\"time\":195600,\"words\":652},\"slug\":\"2018/04/03/using-python-boto3-and-dreamhosts-dreamobjects-to-interact-with-their-object-storage-offering\",\"path\":\"blog/2018/04/03/using-python-boto3-and-dreamhosts-dreamobjects-to-interact-with-their-object-storage-offering\",\"filePath\":\"blog/2018/04/03/using-python-boto3-and-dreamhosts-dreamobjects-to-interact-with-their-object-storage-offering.mdx\",\"toc\":[{\"value\":\"Whats on the Menu:\",\"url\":\"#whats-on-the-menu\",\"depth\":2},{\"value\":\"Configuration\",\"url\":\"#configuration\",\"depth\":2},{\"value\":\"List Buckets:\",\"url\":\"#list-buckets\",\"depth\":2}
1,{\"value\":\"List Objects:\",\"url\":\"#list-objects\",\"depth\":2},{\"value\":\"Put Object:\",\"url\":\"#put-object\",\"depth\":2},{\"value\":\"Get Object:\",\"url\":\"#get-object\",\"depth\":2},{\"value\":\"Upload Files:\",\"url\":\"#upload-files\",\"depth\":2},{\"value\":\"Download File:\",\"url\":\"#download-file\",\"depth\":2},{\"value\":\"Delete Object:\",\"url\":\"#delete-object\",\"depth\":2},{\"value\":\"Delete Objects:\",\"url\":\"#delete-objects\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Using Python Boto3 and DreamHosts DreamObjects to Interact with their Object Storage Offering\",\"datePublished\":\"2018-04-03T11:19:27.000Z\",\"dateModified\":\"2018-04-03T11:19:27.000Z\",\"description\":\"This tutorial will show you how to use python boto3 and dreamhost to interact with their s3 compatible object service called dreamobjects.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2018/04/03/using-python-boto3-and-dreamhosts-dreamobjects-to-interact-with-their-object-storage-offering\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Setup MongoDB Server on ARM64 using Scaleway\",\"date\":\"2018-04-01T22:46:27.000Z\",\"tags\":[\"scaleway\",\"databases\",\"arm64\",\"mongodb\",\"linux\"],\"draft\":false,\"summary\":\"This tutorial will show you how to install and configure a mongodb servier on arm64 linux using scaleway.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"4 min read\",\"minutes\":3.825,\"time\":229500,\"words\":765},\"slug\":\"2018/04/01/setup-mongodb-server-on-arm64-using-scaleway\",\"path\":\"blog/2018/04/01/setup-mongodb-server-on-arm64-using-scaleway\",\"filePath\":\"blog/2018/04/01/setup-mongodb-server-on-arm64-using-scaleway.mdx\",\"toc\":[{\"value\":\"What will we be doing today:\",\"url\":\"#what-will-we-be-doing-today\",\"depth\":2},{\"value\":\"Getting Started:\",\"url\":\"#getting-started\",\"depth\":2},{\"value\":\"Dependencies:\",\"url\":\"#dependencies\",\"depth\":2},{\"value\":\"Configuration:\",\"url\":\"#configuration\",\"depth\":2},{\"value\":\"Authentication:\",\"url\":\"#authentication\",\"depth\":2},{\"value\":\"Write and Read from MongoDB\",\"url\":\"#write-and-read-from-mongodb\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Setup MongoDB Server on ARM64 using Scaleway\",\"datePublished\":\"2018-04-01T22:46:27.000Z\",\"dateModified\":\"2018-04-01T22:46:27.000Z\",\"description\":\"This tutorial will show you how to install and configure a mongodb servier on arm64 linux using scaleway.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2018/04/01/setup-mongodb-server-on-arm64-using-scaleway\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Create a Logical Volume using LVM on Ubuntu\",\"date\":\"2018-03-31T00:38:18.000Z\",\"tags\":[\"lvm\",\"storage\",\"linux\"],\"draft\":false,\"summary\":\"This tutorial shows you how to create a logical volume using lvm on ubuntu linux.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"3 min read\",\"minutes\":2.085,\"time\":125100,\"words\":417},\"slug\":\"2018/03/30/create-a-logical-volume-using-lvm-on-ubuntu\",\"path\":\"blog/2018/03/30/create-a-logical-volume-using-lvm-on-ubuntu\",\"filePath\":\"blog/2018/03/30/create-a-logical-volume-using-lvm-on-ubuntu.mdx\",\"toc\":[{\"value\":\"Concepts:\",\"url\":\"#concepts\",\"depth\":2},{\"value\":\"What we are doing today:\",\"url\":\"#what-we-are-doing-today\",\"depth\":2},{\"value\":\"Dependencies:\",\"url\":\"#dependencies\",\"depth\":2},{\"value\":\"Create the Logical Volume:\",\"url\":\"#create-the-logical-volume\",\"depth\":2},{\"value\":\"Other useful commands:\",\"url\":\"#other-useful-commands\",\"depth\":2},{\"value\":\"Resources:\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Create a Logical Volume using LVM on Ubuntu\",\"datePublished\":\"2018-03-31T00:38:18.000Z\",\"dateModified\":\"2018-03-31T00:38:18.000Z\",\"description\":\"This tutorial shows you how to create a logical volume using lvm on ubuntu linux.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2018/03/30/create-a-logical-volume-using-lvm-on-ubuntu\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Setup Payara Application Server on Ubuntu 16.04\",\"date\":\"2018-03-29T23:57:40.000Z\",\"tags\":[\"java\",\"payara\"],\"draft\":false,\"summary\":\"This tutorial shows you how to setup payara application server for java applications on ubuntu linux.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"2 min read\",\"minutes\":1.985,\"time\":119100,\"words\":397},\"slug\":\"2018/03/29/setup-payara-application-server-on-ubuntu-16-dot-04\",\"path\":\"blog/2018/03/29/setup-payara-application-server-on-ubuntu-16-dot-04\",\"filePath\":\"blog/2018/03/29/setup-payara-application-server-on-ubuntu-16-dot-04.mdx\",\"toc\":[{\"value\":\"About:\",\"url\":\"#about\",\"depth\":2},{\"value\":\"Pre-Requirements:\",\"url\":\"#pre-requirements\",\"depth\":2},{\"value\":\"Install Payara:\",\"url\":\"#install-payara\",\"depth\":2},{\"value\":\"Permissions:\",\"url\":\"#permissions\",\"depth\":2},{\"value\":\"Setup the Payara Domain:\",\"url\":\"#setup-the-payara-domain\",\"depth\":2},{\"value\":\"SystemD Unit File:\",\"url\":\"#systemd-unit-file\",\"depth\":2},{\"value\":\"Access Payara Admin UI:\",\"url\":\"#access-payara-admin-ui\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Setup Payara Application Server on Ubuntu 16.04\",\"datePublished\":\"2018-03-29T23:57:40.000Z\",\"dateModified\":\"2018-03-29T23:57:40.000Z\",\"description\":\"This tutorial shows you how to setup payara application server for java applications on ubuntu linux.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2018/03/29/setup-payara-application-server-on-ubuntu-16-dot-04\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Expanding the Size of your EBS Volume on AWS EC2 for Linux\",\"date\":\"2018-03-28T05:45:07.000Z\",\"tags\":[\"aws\",\"ebs\",\"storage\",\"linux\"],\"draft\":false,\"summary\":\"This tutorial will show you how you can resize and expand the size of your aws ebs volume on ec2 for linux.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"3 min read\",\"minutes\":2.54,\"time\":152400,\"words\":508},\"slug\":\"2018/03/28/expanding-the-size-of-your-ebs-volume-on-aws-ec2-for-linux\",\"path\":\"blog/2018/03/28/expanding-the-size-of-your-ebs-volume-on-aws-ec2-for-linux\",\"filePath\":\"blog/2018/03/28/expanding-the-size-of-your-ebs-volume-on-aws-ec2-for-linux.mdx\",\"toc\":[{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Expanding the Size of your EBS Volume on AWS EC2 for Linux\",\"datePublished\":\"2018-03-28T05:45:07.000Z\",\"dateModified\":\"2018-03-28T05:45:07.000Z\",\"description\":\"This tutorial will show you how you can resize and expand the size of your aws ebs volume on ec2 for linux.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2018/03/28/expanding-the-size-of-your-ebs-volume-on-aws-ec2-for-linux\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Nginx Basic Authentication with Source IP Whitelisting\",\"date\":\"2018-03-19T14:57:36.000Z\",\"tags\":[\"nginx\",\"security\"],\"draft\":false,\"summary\":\"This tutorial will demonstrate how we can do ip whitelisting with nginx.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"1 min read\",\"minutes\":0.995,\"time\":59700,\"words\":199},\"slug\":\"2018/03/19/nginx-basic-authentication-with-source-ip-whitelisting\",\"path\":\"blog/2018/03/19/nginx-basic-authentication-with-source-ip-whitelisting\",\"filePath\":\"blog/2018/03/19/nginx-basic-authentication-with-source-ip-whitelisting.mdx\",\"toc\":[{\"value\":\"Dependencies:\",\"url\":\"#dependencies\",\"depth\":2},{\"value\":\"Configuration:\",\"url\":\"#configuration\",\"depth\":2},{\"value\":\"Testing:\",\"url\":\"#testing\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Nginx Basic Authentication with Source IP Whitelisting\",\"datePublished\":\"2018-03-19T14:57:36.000Z\",\"dateModified\":\"2018-03-19T14:57:36.000Z\",\"description\":\"This tutorial will demonstrate how we can do ip whitelisting with nginx.\",\"
1image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2018/03/19/nginx-basic-authentication-with-source-ip-whitelisting\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Populate Environment Variables from Docker Secrets with a Flask Demo App\",\"date\":\"2018-03-12T22:16:42.000Z\",\"tags\":[\"docker\",\"swarm\",\"secrets\"],\"draft\":false,\"summary\":\"In this tutorial we will see how we can use secrets in docker swarm to expose them in our runtime environment as environment variables.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"3 min read\",\"minutes\":2.08,\"time\":124800,\"words\":416},\"slug\":\"2018/03/12/populate-environment-variables-from-docker-secrets-with-a-flask-demo-app\",\"path\":\"blog/2018/03/12/populate-environment-variables-from-docker-secrets-with-a-flask-demo-app\",\"filePath\":\"blog/2018/03/12/populate-environment-variables-from-docker-secrets-with-a-flask-demo-app.mdx\",\"toc\":[{\"value\":\"Our Directory Setup:\",\"url\":\"#our-directory-setup\",\"depth\":2},{\"value\":\"Flow Information:\",\"url\":\"#flow-information\",\"depth\":2},{\"value\":\"Usage:\",\"url\":\"#usage\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Populate Environment Variables from Docker Secrets with a Flask Demo App\",\"datePublished\":\"2018-03-12T22:16:42.000Z\",\"dateModified\":\"2018-03-12T22:16:42.000Z\",\"description\":\"In this tutorial we will see how we can use secrets in docker swarm to expose them in our runtime environment as environment variables.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2018/03/12/populate-environment-variables-from-docker-secrets-with-a-flask-demo-app\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Send SMS Messages with Python and Twilio via their API\",\"date\":\"2018-03-02T22:09:56.000Z\",\"tags\":[\"python\",\"programming\"],\"draft\":false,\"summary\":\"This tutorial will show you how to send sms messages with python and using twilio api.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"2 min read\",\"minutes\":1.205,\"time\":72300,\"words\":241},\"slug\":\"2018/03/02/send-sms-messages-with-python-and-twilio-via-their-api\",\"path\":\"blog/2018/03/02/send-sms-messages-with-python-and-twilio-via-their-api\",\"filePath\":\"blog/2018/03/02/send-sms-messages-with-python-and-twilio-via-their-api.mdx\",\"toc\":[{\"value\":\"Signup for a Trail Account:\",\"url\":\"#signup-for-a-trail-account\",\"depth\":2},{\"value\":\"Create the Config:\",\"url\":\"#create-the-config\",\"depth\":2},{\"value\":\"Create the Client:\",\"url\":\"#create-the-client\",\"depth\":2},{\"value\":\"Message Preview:\",\"url\":\"#message-preview\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Send SMS Messages with Python and Twilio via their API\",\"datePublished\":\"2018-03-02T22:09:56.000Z\",\"dateModified\":\"2018-03-02T22:09:56.000Z\",\"description\":\"This tutorial will show you how to send sms messages with python and using twilio api.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2018/03/02/send-sms-messages-with-python-and-twilio-via-their-api\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Golang: Reading from Files and Writing to Disk with Arguments\",\"date\":\"2018-03-02T12:11:13.000Z\",\"tags\":[\"golang\",\"programming\"],\"draft\":false,\"summary\":\"This is a quick tutorial on how to use the golang programming language to read from files and how to write to disk using arguments.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"2 min read\",\"minutes\":1.815,\"time\":108900,\"words\":363},\"slug\":\"2018/03/02/golang-reading-from-files-and-writing-to-disk-with-arguments\",\"path\":\"blog/2018/03/02/golang-reading-from-files-and-writing-to-disk-with-arguments\",\"filePath\":\"blog/2018/03/02/golang-reading-from-files-and-writing-to-disk-with-arguments.mdx\",\"toc\":[{\"value\":\"Our Golang Application:\",\"url\":\"#our-golang-application\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Golang: Reading from Files and Writing to Disk with Arguments\",\"datePublished\":\"2018-03-02T12:11:13.000Z\",\"dateModified\":\"2018-03-02T12:11:13.000Z\",\"description\":\"This is a quick tutorial on how to use the golang programming language to read from files and how to write to disk using arguments.\",\"
1image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2018/03/02/golang-reading-from-files-and-writing-to-disk-with-arguments\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Golang: Reading from Files and Writing to Disk with Golang\",\"date\":\"2018-03-02T11:44:59.000Z\",\"tags\":[\"golang\",\"programming\"],\"draft\":false,\"summary\":\"In this quick quick tutorial, I will show you how to use the golang programming language to read from files as well as writing to disk.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"2 min read\",\"minutes\":1.48,\"time\":88800,\"words\":296},\"slug\":\"2018/03/02/golang-reading-from-files-and-writing-to-disk-with-golang\",\"path\":\"blog/2018/03/02/golang-reading-from-files-and-writing-to-disk-with-golang\",\"filePath\":\"blog/2018/03/02/golang-reading-from-files-and-writing-to-disk-with-golang.mdx\",\"toc\":[{\"value\":\"Golang Environment: Golang Docker Image\",\"url\":\"#golang-environment-golang-docker-image\",\"depth\":2},{\"value\":\"Our Golang Application\",\"url\":\"#our-golang-application\",\"depth\":2},{\"value\":\"Running the Golang App:\",\"url\":\"#running-the-golang-app\",\"depth\":2},{\"value\":\"Next:\",\"url\":\"#next\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Golang: Reading from Files and Writing to Disk with Golang\",\"datePublished\":\"2018-03-02T11:44:59.000Z\",\"dateModified\":\"2018-03-02T11:44:59.000Z\",\"description\":\"In this quick quick tutorial, I will show you how to use the golang programming language to read from files as well as writing to disk.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2018/03/02/golang-reading-from-files-and-writing-to-disk-with-golang\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Setup a KVM Hypervisor on Ubuntu to Host Virtual Machines\",\"date\":\"2018-02-20T11:21:56.000Z\",\"tags\":[\"kvm\",\"virtualization\",\"linux\"],\"draft\":false,\"summary\":\"This tutorial will demonstrate how you can setup a kvm hypvervisor to host your own virtual machines.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"4 min read\",\"minutes\":3.465,\"time\":207900,\"words\":693},\"slug\":\"2018/02/20/setup-a-kvm-hypervisor-on-ubuntu-to-host-virtual-machines\",\"path\":\"blog/2018/02/20/setup-a-kvm-hypervisor-on-ubuntu-to-host-virtual-machines\",\"filePath\":\"blog/2018/02/20/setup-a-kvm-hypervisor-on-ubuntu-to-host-virtual-machines.mdx\",\"toc\":[{\"value\":\"What we will be doing today:\",\"url\":\"#what-we-will-be-doing-today\",\"depth\":2},{\"value\":\"Check for Hardware Virtualization Support:\",\"url\":\"#check-for-hardware-virtualization-support\",\"depth\":2},{\"value\":\"Installing KVM\",\"url\":\"#installing-kvm\",\"depth\":2},{\"value\":\"Provision the Alpine VM and Setup OpenSSH:\",\"url\":\"#provision-the-alpine-vm-and-setup-openssh\",\"depth\":2},{\"value\":\"Some Useful Commands:\",\"url\":\"#some-useful-commands\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Setup a KVM Hypervisor on Ubuntu to Host Virtual Machines\",\"datePublished\":\"2018-02-20T11:21:56.000Z\",\"dateModified\":\"2018-02-20T11:21:56.000Z\",\"description\":\"This tutorial will demonstrate how you can setup a kvm hypvervisor to host your own virtual machines.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2018/02/20/setup-a-kvm-hypervisor-on-ubuntu-to-host-virtual-machines\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Guide to Setup Docker Convoy Volume Driver for Docker Swarm with NFS\",\"date\":\"2018-02-16T13:51:59.000Z\",\"tags\":[\"docker\",\"swarm\",\"nfs\",\"storage\"],\"draft\":false,\"summary\":\"This tutorial will demonstrate how to use nfs storage for docker swarm using the docker 
1convoy volume driver.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"6 min read\",\"minutes\":5.745,\"time\":344700,\"words\":1149},\"slug\":\"2018/02/16/guide-to-setup-docker-convoy-volume-driver-for-docker-swarm-with-nfs\",\"path\":\"blog/2018/02/16/guide-to-setup-docker-convoy-volume-driver-for-docker-swarm-with-nfs\",\"filePath\":\"blog/2018/02/16/guide-to-setup-docker-convoy-volume-driver-for-docker-swarm-with-nfs.mdx\",\"toc\":[{\"value\":\"The Overview:\",\"url\":\"#the-overview\",\"depth\":2},{\"value\":\"Setup NFS:\",\"url\":\"#setup-nfs\",\"depth\":2},{\"value\":\"Install Rancher Convoy Plugin:\",\"url\":\"#install-rancher-convoy-plugin\",\"depth\":2},{\"value\":\"Create the init script:\",\"url\":\"#create-the-init-script\",\"depth\":2},{\"value\":\"Externally Managed Convoy Volumes\",\"url\":\"#externally-managed-convoy-volumes\",\"depth\":2},{\"value\":\"Creating a Test Service:\",\"url\":\"#creating-a-test-service\",\"depth\":2},{\"value\":\"Create Volume via Compose:\",\"url\":\"#create-volume-vi
1a-compose\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Guide to Setup Docker Convoy Volume Driver for Docker Swarm with NFS\",\"datePublished\":\"2018-02-16T13:51:59.000Z\",\"dateModified\":\"2018-02-16T13:51:59.000Z\",\"description\":\"This tutorial will demonstrate how to use nfs storage for docker swarm using the docker convoy volume driver.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2018/02/16/guide-to-setup-docker-convoy-volume-driver-for-docker-swarm-with-nfs\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Setup a NFS Server on Ubuntu\",\"date\":\"2018-02-11T22:26:56.000Z\",\"tags\":[\"storage\",\"nfs\",\"linux\"],\"draft\":false,\"summary\":\"In this tutorial we will install a nfs server on ubuntu linux and use a nfs client to mount the nfs volume to our filesystem.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"2 min read\",\"minutes\":1.685,\"time\":101100,\"words\":337},\"slug\":\"2018/02/11/setup-a-nfs-server-on-ubuntu\",\"path\":\"blog/2018/02/11/setup-a-nfs-server-on-ubuntu\",\"filePath\":\"blog/2018/02/11/setup-a-nfs-server-on-ubuntu.mdx\",\"toc\":[{\"value\":\"Setup the Dependencies:\",\"url\":\"#setup-the-dependencies\",\"depth\":2},{\"value\":\"Allow the Clients:\",\"url\":\"#allow-the-clients\",\"depth\":2},{\"value\":\"Start the NFS Server:\",\"url\":\"#start-the-nfs-server\",\"depth\":2},{\"value\":\"Client Side:\",\"url\":\"#client-side\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Setup a NFS Server on Ubuntu\",\"datePublished\":\"2018-02-11T22:26:56.000Z\",\"dateModified\":\"2018-02-11T22:26:56.000Z\",\"description\":\"In this tutorial we will install a nfs server on ubuntu linux and use a nfs client to mount the nfs volume to our filesystem.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2018/02/11/setup-a-nfs-server-on-ubuntu\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Setup a Site to Site IPsec VPN with Strongswan and PreShared Key Authentication\",\"date\":\"2018-02-11T21:09:37.000Z\",\"tags\":[\"vpn\",\"strongswan\",\"networking\",\"linux\"],\"draft\":false,\"summary\":\"This tutorial will demonstrate step by step how you can install and configure a site to site vpn with strongswan and using pre-shared key authentication.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"4 min read\",\"minutes\":3.495,\"time\":209700,\"words\":699},\"slug\":\"2018/02/11/setup-a-site-to-site-ipsec-vpn-with-strongswan-and-preshared-key-authentication\",\"path\":\"blog/2018/02/11/setup-a-site-to-site-ipsec-vpn-with-strongswan-and-preshared-key-authentication\",\"filePath\":\"blog/2018/02/11/setup-a-site-to-site-ipsec-vpn-with-strongswan-and-preshared-key-authentication.mdx\",\"toc\":[{\"value\":\"Get the Dependencies:\",\"url\":\"#get-the-dependencies\",\"depth\":2},{\"value\":\"Generate Preshared Key:\",\"url\":\"#generate-preshared-key\",\"depth\":2},{\"value\":\"Details of our 2 Sites:\",\"url\":\"#details-of-our-2-sites\",\"depth\":2},{\"value\":\"Configure Site A:\",\"url\":\"#configure-site-a\",\"depth\":2},{\"value\":\"Configure Site B:\",\"url\":\"#configure-site-b\",\"depth\":2},{\"value\":\"Start the VPN:\",\"url\":\"#start-the-vpn\",\"depth\":2},{\"value\":\"Other useful commands:\",\"url\":\"#other-useful-commands\",\"depth\":2},{\"value\":\"Adding more connections to your config:\",\"url\":\"#adding-more-connections-to-your-config\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Setup a Site to Site IPsec VPN with Strongswan and PreShared Key Authentication\",\"datePublished\":\"2018-02-11T21:09:37.000Z\",\"dateModified\":\"2018-02-11T21:09:37.000Z\",\"description\":\"This tutorial will demonstrate step by step how you can install and configure a site to site vpn with strongswan and using pre-shared key authentication.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2018/02/11/setup-a-site-to-site-ipsec-vpn-with-strongswan-and-preshared-key-authentication\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}}
1,{\"title\":\"Authenticate to your AWS MySQL RDS Instance via IAM\",\"date\":\"2018-01-30T15:02:05.000Z\",\"tags\":[\"aws\",\"mysql\",\"iam\",\"databases\"],\"draft\":false,\"summary\":\"This tutorial will demonstrate how you can use iam based authentication on aws to authenticate without plaintext passwords to your mysql rds database.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"6 min read\",\"minutes\":5.335,\"time\":320100,\"words\":1067},\"slug\":\"2018/01/30/authenticate-to-your-aws-mysql-rds-instance-via-iam\",\"path\":\"blog/2018/01/30/authenticate-to-your-aws-mysql-rds-instance-via-iam\",\"filePath\":\"blog/2018/01/30/authenticate-to-your-aws-mysql-rds-instance-via-iam.mdx\",\"toc\":[{\"value\":\"What we will be doing today:\",\"url\":\"#what-we-will-be-doing-today\",\"depth\":2},{\"value\":\"Create the RDS Database:\",\"url\":\"#create-the-rds-database\",\"depth\":2},{\"value\":\"Create the Database Account:\",\"url\":\"#create-the-database-account\",\"depth\":2},{\"value\":\"Creating the Databases and Granting Permissions\",\"url\":\"#creating-the-databases-and-granting-permissions\",\"depth\":2},{\"value\":\"IAM Permissions to allow our user to authenticate to our RDS.\",\"url\":\"#iam-permissions-to-allow-our-user-to-authenticate-to-our-rds\",\"depth\":2},{\"value\":\"Testing it out:\",\"url\":\"#testing-it-out\",\"depth\":2},{\"value\":\"Creating a MySQL Client Wrapper Script:\",\"url\":\"#creating-a-mysql-client-wrapper-script\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Authenticate to your AWS MySQL RDS Instance via IAM\",\"datePublished\":\"2018-01-30T15:02:05.000Z\",\"dateModified\":\"2018-01-30T15:02:05.000Z\",\"description\":\"This tutorial will demonstrate how you can use iam based authentication on aws to authenticate without plaintext passwords to your mysql rds database.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2018/01/30/authenticate-to-your-aws-mysql-rds-instance-via-iam\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Using Hive for Small Datasets on my Mac using Docker\",\"date\":\"2018-01-23T15:06:16.000Z\",\"tags\":[\"bigdata\",\"hive\",\"docker\"],\"draft\":false,\"summary\":\"This tutorial will demonstrate how how to use hive on your macbook to process small datasets for demonstration purposes\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"2 min read\",\"minutes\":1.38,\"time\":82800,\"words\":276},\"slug\":\"2018/01/23/using-hive-for-small-datasets-on-my-mac-using-docker\",\"path\":\"blog/2018/01/23/using-hive-for-small-datasets-on-my-mac-using-docker\",\"filePath\":\"blog/2018/01/23/using-hive-for-small-datasets-on-my-mac-using-docker.mdx\",\"toc\":[{\"value\":\"Running Hive\",\"url\":\"#running-hive\",\"depth\":2},{\"value\":\"Creating the Table\",\"url\":\"#creating-the-table\",\"depth\":2},{\"value\":\"Loading the Data\",\"url\":\"#loading-the-data\",\"depth\":2},{\"value\":\"Query the Data\",\"url\":\"#query-the-data\",\"depth\":2},{\"value\":\"Resource:\",\"url\":\"#resource\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Using Hive for Small Datasets on my Mac using Docker\",\"datePublished\":\"2018-01-23T15:06:16.000Z\",\"dateModified\":\"2018-01-23T15:06:16.000Z\",\"description\":\"This tutorial will demonstrate how how to use hive on your macbook to process small datasets for demonstration purposes\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2018/01/23/using-hive-for-small-datasets-on-my-mac-using-docker\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Using getpass in Python to accept passwords from stdin without echoing it back\",\"date\":\"2018-01-22T18:15:09.000Z\",\"tags\":[\"python\",\"security\"],\"draft\":false,\"summary\":\"This tutorial will demonstrate how you can use getpass in python to accept input without returning the output\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"1 min read\",\"minutes\":0.965,\"time\":57900,\"words\":193},\"slug\":\"2018/01/22/using-getpass-in-python-to-accept-passwords-from-stdin-without-echoing-it-back\",\"path\":\"blog/2018/01/22/using-getpass-in-python-to-accept-passwords-from-stdin-without-echoing-it-back\",\"filePath\":\"blog/2018/01/22/using-getpass-in-python-to-accept-passwords-from-stdin-without-echoing-it-back.mdx\",\"toc\":[{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Using getpass in Python to accept passwords from stdin without echoing it back\",\"datePublished\":\"2018-01-22T18:15:09.000Z\",\"dateModified\":\"2018-01-22T18:15:09.000Z\",\"description\":\"This tutorial will demonstrate how you can use getpass in python to accept input without returning the output\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2018/01/22/using-getpass-in-python-to-accept-passwords-from-stdin-without-echoing-it-back\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Setup a Basic Hello World Pipeline on Concourse\",\"date\":\"2018-01-11T14:15:27.000Z\",\"tags\":[\"devops\",\"concourse\"],\"draft\":false,\"summary\":\"This tutorial will demonstrate how you can us concourse-ci to setup a basic pipeline\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"2 min read\",\"minutes\":1.185,\"time\":71100,\"words\":237},\"slug\":\"2018/01/11/setup-a-basic-hello-world-pipeline-on-concourse\",\"path\":\"blog/2018/01/11/setup-a-basic-hello-world-pipeline-on-concourse\",\"filePath\":\"blog/2018/01/11/setup-a-basic-hello-world-pipeline-on-concourse.mdx\",\"toc\":[{\"value\":\"Content on Github\",\"url\":\"#content-on-github\",\"depth\":2},{\"value\":\"Running our Pipeline\",\"url\":\"#running-our-pipeline\",\"depth\":2},{\"value\":\"Set Pipeline:\",\"url\":\"#set-pipeline\",\"depth\":2},{\"value\":\"Unpause Pipeline:\",\"url\":\"#unpause-pipeline\",\"depth\":2}
1,{\"value\":\"Trigger Job:\",\"url\":\"#trigger-job\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Setup a Basic Hello World Pipeline on Concourse\",\"datePublished\":\"2018-01-11T14:15:27.000Z\",\"dateModified\":\"2018-01-11T14:15:27.000Z\",\"description\":\"This tutorial will demonstrate how you can us concourse-ci to setup a basic pipeline\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2018/01/11/setup-a-basic-hello-world-pipeline-on-concourse\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Change your Relayhost on Postfix using Sed\",\"date\":\"2017-12-14T15:11:33.000Z\",\"tags\":[\"postfix\",\"mail\",\"linux\"],\"draft\":false,\"summary\":\"This tutorial will demonstrate how you can change your relayhost value inside your config file in postfix using sed. This is handy when you want to use scripting.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"2 min read\",\"minutes\":1.485,\"time\":89100,\"words\":297},\"slug\":\"2017/12/14/change-your-relayhost-on-postfix-using-sed\",\"path\":\"blog/2017/12/14/change-your-relayhost-on-postfix-using-sed\",\"filePath\":\"blog/2017/12/14/change-your-relayhost-on-postfix-using-sed.mdx\",\"toc\":[{\"value\":\"Checking your current relayhost configuration:\",\"url\":\"#checking-your-current-relayhost-configuration\",\"depth\":2},{\"value\":\"Changing your relayhost configuration to a External SMTP Provider:\",\"url\":\"#changing-your-relayhost-configuration-to-a-external-smtp-provider\",\"depth\":2},{\"value\":\"Revert your changes so that postfix sends out directly:\",\"url\":\"#revert-your-changes-so-that-postfix-sends-out-directly\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Change your Relayhost on Postfix using Sed\",\"datePublished\":\"2017-12-14T15:11:33.000Z\",\"dateModified\":\"2017-12-14T15:11:33.000Z\",\"description\":\"This tutorial will demonstrate how you can change your relayhost value inside your config file in postfix using sed. This is handy when you want to use scripting.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2017/12/14/change-your-relayhost-on-postfix-using-sed\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Graphing Pretty Charts with Python Flask and Chartjs\",\"date\":\"2017-12-14T07:28:51.000Z\",\"tags\":[\"python\",\"flask\",\"visualizations\",\"chartjs\"],\"draft\":false,\"summary\":\"This tutorial will demonstrate how to graph pretty charts with python flask and chart.js\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"2 min read\",\"minutes\":1.85,\"time\":111000,\"words\":370},\"slug\":\"2017/12/14/graphing-pretty-charts-with-python-flask-and-chartjs\",\"path\":\"blog/2017/12/14/graphing-pretty-charts-with-python-flask-and-chartjs\",\"filePath\":\"blog/2017/12/14/graphing-pretty-charts-with-python-flask-and-chartjs.mdx\",\"toc\":[{\"value\":\"Dependencies:\",\"url\":\"#dependencies\",\"depth\":2},{\"value\":\"Creating the Flask App:\",\"url\":\"#creating-the-flask-app\",\"depth\":2},{\"value\":\"Populating the HTML Static Content:\",\"url\":\"#populating-the-html-static-content\",\"depth\":2},{\"value\":\"Running our Application:\",\"url\":\"#running-our-application\",\"depth\":2},{\"value\":\"Resources:\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Graphing Pretty Charts with Python Flask and Chartjs\",\"datePublished\":\"2017-12-14T07:28:51.000Z\",\"dateModified\":\"2017-12-14T07:28:51.000Z\",\"description\":\"This tutorial will demonstrate how to graph pretty charts with python flask and chart.js\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2017/12/14/graphing-pretty-charts-with-python-flask-and-chartjs\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Create a Chatbot with Chatterbot on Python\",\"date\":\"2017-12-13T13:53:50.000Z\",\"tags\":[\"chatbot\",\"python\",\"machine-learning\",\"docker\",\"mongodb\"],\"draft\":false,\"summary\":\"This tutorial will demonstrate how to create a chatbot using python and chatterbot.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"7 min read\",\"minutes\":6.035,\"time\":362100,\"words\":1207},\"slug\":\"2017/12/13/create-a-chatbot-with-chatterbot-on-python\",\"path\":\"blog/2017/12/13/create-a-chatbot-with-chatterbot-on-python\",\"filePath\":\"blog/2017/12/13/create-a-chatbot-with-chatterbot-on-python.mdx\",\"toc\":[{\"value\":\"Getting the Dependencies:\",\"url\":\"#getting-the-dependencies\",\"depth\":2},{\"value\":\"Setup the Basic Chatbot:\",\"url\":\"#setup-the-basic-chatbot\",\"depth\":2},{\"value\":\"Training your Bot:\",\"url\":\"#training-your-bot\",\"depth\":2},{\"value\":\"Using an External Database like MongoDB\",\"url\":\"#using-an-external-database-like-mongodb\",\"depth\":2},{\"value\":\"Resources:\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Create a Chatbot with Chatterbot on Python\",\"datePublished\":\"2017-12-13T13:53:50.000Z\",\"dateModified\":\"2017-12-13T13:53:50.000Z\",\"description\":\"This tutorial will demonstrate how to create a chatbot using python and chatterbot.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2017/12/13/create-a-chatbot-with-chatterbot-on-python\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"SSH Host Key Warnings with Strict Checking Enabled\",\"date\":\"2017-12-13T07:07:29.000Z\",\"tags\":[\"ssh\",\"linux\"],\"draft\":false,\"summary\":\"This tutorial will demonstrate how to resolve ssh host key warnings with strict checking enabled.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"2 min read\",\"minutes\":1.165,\"time\":69900,\"words\":233},\"slug\":\"2017/12/13/ssh-host-key-warnings-with-strict-checking-enabled\",\"path\":\"blog/2017/12/13/ssh-host-key-warnings-with-strict-checking-enabled\",\"filePath\":\"blog/2017/12/13/ssh-host-key-warnings-with-strict-checking-enabled.mdx\",\"toc\":[{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"SSH Host Key Warnings with Strict Checking Enabled\",\"datePublished\":\"2017-12-13T07:07:29.000Z\",\"dateModified\":\"2017-12-13T07:07:29.000Z\",\"description\":\"This tutorial will demonstrate how to resolve ssh host key warnings with strict checking enabled.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2017/12/13/ssh-host-key-warnings-with-strict-checking-enabled\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Setup a 3 Node Kubernetes Cluster on Ubuntu\",\"date\":\"2017-12-11T14:31:47.000Z\",\"tags\":[\"kubernetes\",\"o
1penfaas\",\"devops\"],\"draft\":false,\"summary\":\"This tutorial will demonstrate how to install and configure a 3 node kubernetes cluster on ubuntu linux and then deploy openfaas to the cluster to test if its working as expected.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"5 min read\",\"minutes\":4.205,\"time\":252300,\"words\":841},\"slug\":\"2017/12/11/setup-a-3-node-kubernetes-cluster-on-ubuntu\",\"path\":\"blog/2017/12/11/setup-a-3-node-kubernetes-cluster-on-ubuntu\",\"filePath\":\"blog/2017/12/11/setup-a-3-node-kubernetes-cluster-on-ubuntu.mdx\",\"toc\":[{\"value\":\"What is Kubernetes?\",\"url\":\"#what-is-kubernetes\",\"depth\":2},{\"value\":\"Our Setup:\",\"url\":\"#our-setup\",\"depth\":2},{\"value\":\"Deploy Kubernetes: Master\",\"url\":\"#deploy-kubernetes-master\",\"depth\":2},{\"value\":\"Deploy Kubernetes: Worker Nodes\",\"url\":\"#deploy-kubernetes-worker-nodes\",\"depth\":2},{\"value\":\"Verifying if All Nodes are Checked In\",\"url\":\"#verifying-if-all-nodes-are-checked-in\",\"depth\":2},{\"value\":\"Deploy Services to Kubernetes:\",\"url\":\"#deploy-services-to-kubernetes\",\"depth\":2},{\"value\":\"Resources:\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Setup a 3 Node Kubernetes Cluster on Ubuntu\",\"datePublished\":\"2017-12-11T14:31:47.000Z\",\"dateModified\":\"2017-12-11T14:31:47.000Z\",\"description\":\"This tutorial will demonstrate how to install and configure a 3 node kubernetes cluster on ubuntu linux and then deploy openfaas to the cluster to test if its working as expected.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2017/12/11/setup-a-3-node-kubernetes-cluster-on-ubuntu\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Rejoining or Bootstrapping MySQL Galera Cluster Nodes after Shutdown\",\"date\":\"2017-12-10T23:03:44.000Z\",\"tags\":[\"mysql\",\"galera\"],\"draft\":false,\"summary\":\"This tutorial will demonstrate how we can rejoin or bootstrap mysql galera nodes after a shutdown to have your cluster operational.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"3 min read\",\"minutes\":2.075,\"time\":124500,\"words\":415},\"slug\":\"2017/12/10/rejoining-or-bootstrapping-mysql-galera-cluster-nodes-after-shutdown\",\"path\":\"blog/2017/12/10/rejoining-or-bootstrapping-mysql-galera-cluster-nodes-after-shutdown\",\"filePath\":\"blog/2017/12/10/rejoining-or-bootstrapping-mysql-galera-cluster-nodes-after-shutdown.mdx\",\"toc\":[{\"value\":\"Issues Faced\",\"url\":\"#issues-faced\",\"depth\":2},{\"value\":\"Why?\",\"url\":\"#why\",\"depth\":2},{\"value\":\"Rejoining the Cluster\",\"url\":\"#rejoining-the-cluster\",\"depth\":2},{\"value\":\"Verifying\",\"url\":\"#verifying\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Rejoining or Bootstrapping MySQL Galera Cluster Nodes after Shutdown\",\"datePublished\":\"2017-12-10T23:03:44.000Z\",\"dateModified\":\"2017-12-10T23:03:44.000Z\",\"description\":\"This tutorial will demonstrate how we can rejoin or bootstrap mysql galera nodes after a shutdown to have your cluster operational.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2017/12/10/rejoining-or-bootstrapping-mysql-galera-cluster-nodes-after-shutdown\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Unmask a Masked Service in Systemd\",\"date\":\"2017-12-09T07:02:21.000Z\",\"tags\":[\"systemd\",\"linux\",\"sysadmin\"],\"draft\":false,\"summary\":\"Systemd - In this tutorial, we will demonstrate how to unmask a masked service in systemd using Ubuntu Linux, ensuring your services run smoothly.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"3 min read\",\"minutes\":2.045,\"time\":122700,\"words\":409},\"slug\":\"2017/12/09/unmask-a-masked-service-in-systemd\",\"path\":\"blog/2017/12/09/unmask-a-masked-service-in-systemd\",\"filePath\":\"blog/2017/12/09/unmask-a-masked-service-in-systemd.mdx\",\"toc\":[{\"value\":\"Checking the Status of the Masked Service\",\"url\":\"#checking-the-status-of-the-masked-service\",\"depth\":2},{\"value\":\"Unmasking the Service\",\"url\":\"#unmasking-the-service\",\"depth\":2},{\"value\":\"Reloading the Systemd Daemon\",\"url\":\"#reloading-the-systemd-daemon\",\"depth\":2},{\"value\":\"Starting and Enabling the Service\",\"url\":\"#starting-and-enabling-the-service\",\"depth\":2},{\"value\":\"Conclusion\",\"url\":\"#conclusion\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Unmask a Masked Service in Systemd\",\"datePublished\":\"2017-12-09T07:02:21.000Z\",\"dateModified\":\"2017-12-09T07:02:21.000Z\",\"description\":\"Systemd - In this tutorial, we will demonstrate how to unmask a masked service in systemd using Ubuntu Linux, ensuring your services run smoothly.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2017/12/09/unmask-a-masked-service-in-systemd\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Setup a NFS Server on a RaspberryPi\",\"date\":\"2017-12-05T15:45:35.000Z\",\"tags\":[\"nfs\",\"raspberypi\",\"linux\",\"storage\"],\"draft\":false,\"summary\":\"This tutorial will demonstrate how to install and configure a nfs server on a raspberry pi.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"3 min read\",\"minutes\":2.075,\"time\":124500,\"words\":415},\"slug\":\"2017/12/05/setup-a-nfs-server-on-a-raspberrypi\",\"path\":\"blog/2017/12/05/setup-a-nfs-server-on-a-raspberrypi\",\"filePath\":\"blog/2017/12/05/setup-a-nfs-server-on-a-raspberrypi.mdx\",\"toc\":[{\"value\":\"Setup the Server Side - Disks and Directories\",\"url\":\"#setup-the-server-side---disks-and-directories\",\"depth\":2},{\"value\":\"Setup the Server Side - Installing NFS Server\",\"url\":\"#setup-the-server-side---installing-nfs-server\",\"depth\":2},{\"value\":\"Setup the NFS Client\",\"url\":\"#setup-the-nfs-client\",\"depth\":2},{\"value\":\"Resources:\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Setup a NFS Server on a RaspberryPi\",\"datePublished\":\"2017-12-05T15:45:35.000Z\",\"dateModified\":\"2017-12-05T15:45:35.000Z\",\"description\":\"This tutorial will demonstrate how to install and configure a nfs server on a raspberry pi.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2017/12/05/setup-a-nfs-server-on-a-raspberrypi\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Elasticsearch Curator to Manage and Curate your Elasticsearch Indexes\",\"date\":\"2017-12-04T13:39:06.000Z\",\"tags\":[\"elasticsearch\",\"curator\"],\"draft\":false,\"summary\":\"In this tutorial we will use a opensource tool called curator to manage our elasticsearch indices, by creating, deleting, reindexing etc.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"9 min read\",\"minutes\":8.33,\"time\":499800,\"words\":1666},\"slug\":\"2017/12/04/elasticsearch-curator-to-manage-and-curate-your-elasticsearch-indexe
1s\",\"path\":\"blog/2017/12/04/elasticsearch-curator-to-manage-and-curate-your-elasticsearch-indexes\",\"filePath\":\"blog/2017/12/04/elasticsearch-curator-to-manage-and-curate-your-elasticsearch-indexes.mdx\",\"toc\":[{\"value\":\"Install Elasticsearch Curator\",\"url\":\"#install-elasticsearch-curator\",\"depth\":2},{\"value\":\"Action: Create Indices\",\"url\":\"#action-create-indices\",\"depth\":2},{\"value\":\"Action: Reindex Indices based on Timestring\",\"url\":\"#action-reindex-indices-based-on-timestring\",\"depth\":2},{\"value\":\"Curator to Change Replica Counts on your Indices:\",\"url\":\"#curator-to-change-replica-counts-on-your-indices\",\"depth\":2},{\"value\":\"Curator to Delete your Indices:\",\"url\":\"#curator-to-delete-your-indices\",\"depth\":2},{\"value\":\"Resources:\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Elasticsearch Curator to Manage and Curate your Elasticsearch Indexes\",\"datePublished\":\"2017-12-04T13:39:06.000Z\",\"dateModified\":\"2017-12-04T13:39:06.000Z\",\"description\":\"In this tutorial we will use a opensource tool called curator to manage our elasticsearch indices, by creating, deleting, reindexing etc.\",\"
1image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2017/12/04/elasticsearch-curator-to-manage-and-curate-your-elasticsearch-indexes\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Basic Concourse Pipeline with Bash and Golang Jobs\",\"date\":\"2017-11-24T23:38:15.000Z\",\"tags\":[\"concourse\",\"devops\",\"cicd\",\"golang\"],\"draft\":false,\"summary\":\"In this devops tutorial we will create a basic concourse ci pipeline with bash and go jobs to demonstrate the functionality of concourse.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"4 min read\",\"minutes\":3.05,\"time\":183000,\"words\":610},\"slug\":\"2017/11/24/basic-concourse-pipeline-with-bash-and-golang-jobs\",\"path\":\"blog/2017/11/24/basic-concourse-pipeline-with-bash-and-golang-jobs\",\"filePath\":\"blog/2017/11/24/basic-concourse-pipeline-with-bash-and-golang-jobs.mdx\",\"toc\":[{\"value\":\"What are we doing today?\",\"url\":\"#what-are-we-doing-today\",\"depth\":2},{\"value\":\"Our Pipeline Definition:\",\"url\":\"#our-pipeline-definition\",\"depth\":2},{\"value\":\"Login to Concourse:\",\"url\":\"#login-to-concourse\",\"depth\":2},{\"value\":\"Apply Configuration\",\"url\":\"#apply-configuration\",\"depth\":2},{\"value\":\"Unpause\",\"url\":\"#unpause\",\"depth\":2},{\"value\":\"Trigger\",\"url\":\"#trigger\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Basic Concourse Pipeline with Bash and Golang Jobs\",\"datePublished\":\"2017-11-24T23:38:15.000Z\",\"dateModified\":\"2017-11-24T23:38:15.000Z\",\"description\":\"In this devops tutorial we will create a basic concourse ci pipeline with bash and go jobs to demonstrate the functionality of concourse.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2017/11/24/basic-concourse-pipeline-with-bash-and-golang-jobs\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Use Docker Secrets with MySQL on Docker Swarm\",\"date\":\"2017-11-23T21:55:15.000Z\",\"tags\":[\"docker\",\"swarm\",\"security\",\"mysql\"],\"draft\":false,\"summary\":\"In this tutorial we will demonstrate how to handle sensitive data like passwords with docker secrets, where we create a secret and then define the secret for our mysql service on docker swarm so that the container can reference the password inside the cluster.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"6 min read\",\"minutes\":5.485,\"time\":329100,\"words\":1097},\"slug\":\"2017/11/23/use-docker-secrets-with-mysql-on-docker-swarm\",\"path\":\"blog/2017/11/23/use-docker-secrets-with-mysql-on-docker-swarm\",\"filePath\":\"blog/2017/11/23/use-docker-secrets-with-mysql-on-docker-swarm.mdx\",\"toc\":[{\"value\":\"What is Docker Secrets:\",\"url\":\"#what-is-docker-secrets\",\"depth\":2},{\"value\":\"Deploy MySQL with Docker Secrets\",\"url\":\"#deploy-mysql-with-docker-secrets\",\"depth\":2},{\"value\":\"Dependencies:\",\"url\":\"#dependencies\",\"depth\":2},{\"value\":\"Deployment Time!\",\"url\":\"#deployment-time\",\"depth\":2},{\"value\":\"Connect to MySQL\",\"url\":\"#connect-to-mysql\",\"depth\":2},{\"value\":\"Testing Data Persistance:\",\"url\":\"#testing-data-persistance\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Use Docker Secrets with MySQL on Docker Swarm\",\"datePublished\":\"2017-11-23T21:55:15.000Z\",\"dateModified\":\"2017-11-23T21:55:15.000Z\",\"description\":\"In this tutorial we will demonstrate how to handle sensitive data like passwords with docker secrets, where we create a secret and then define the secret for our mysql service on docker swarm so that the container can reference the password inside the cluster.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2017/11/23/use-docker-secrets-with-mysql-on-docker-swarm\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Setup a 3 Node Galera MariaDB Cluster on Ubuntu 16\",\"date\":\"2017-11-22T23:17:14.000Z\",\"tags\":[\"mariadb\",\"mysql\",\"galera\"],\"draft\":false,\"summary\":\"This tutorial will demonstrate how to setup a highly available 3 node galera mariadb sql cluster on ubuntu linux. Author: Ruan Bekker\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"4 min read\",\"minutes\":3.3,\"time\":198000,\"words\":660},\"slug\":\"2017/11/22/setup-a-3-node-galera-mariadb-cluster-on-ubuntu-16\",\"path\":\"blog/2017/11/22/setup-a-3-node-galera-mariadb-cluster-on-ubuntu-16\",\"filePath\":\"blog/2017/11/22/setup-a-3-node-galera-mariadb-cluster-on-ubuntu-16.mdx\",\"toc\":[{\"value\":\"Our Server Details:\",\"url\":\"#our-server-details\",\"depth\":2},{\"value\":\"Update Repo Index and Upgrade:\",\"url\":\"#update-repo-index-and-upgrade\",\"depth\":2},{\"value\":\"Configuration:\",\"url\":\"#configuration\",\"depth\":2},{\"value\":\"Initialize the Cluster:\",\"url\":\"#initialize-the-cluster\",\"depth\":2},{\"value\":\"Node-2: Start and Enable MariaDB\",\"url\":\"#node-2-start-and-enable-mariadb\",\"depth\":2},{\"value\":\"Node-3: Start and Enable MariaDB\",\"url\":\"#node-3-start-and-enable-mariadb\",\"depth\":2},{\"value\":\"Create a Database, Table and Record:\",\"url\":\"#create-a-database-table-and-record\",\"depth\":2},{\"value\":\"Node-1: Writing the Data to Our Galera Cluster\",\"url\":\"#node-1-writing-the-data-to-our-galera-cluster\",\"depth\":2},{\"value\":\"Firewall Rules opened while testing:\",\"url\":\"#f
1irewall-rules-opened-while-testing\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Setup a 3 Node Galera MariaDB Cluster on Ubuntu 16\",\"datePublished\":\"2017-11-22T23:17:14.000Z\",\"dateModified\":\"2017-11-22T23:17:14.000Z\",\"description\":\"This tutorial will demonstrate how to setup a highly available 3 node galera mariadb sql cluster on ubuntu linux. Author: Ruan Bekker\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2017/11/22/setup-a-3-node-galera-mariadb-cluster-on-ubuntu-16\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Delete Old Items with Amazons DynamoDB TTL Feature\",\"date\":\"2017-11-22T22:47:31.000Z\",\"tags\":[\"aws\",\"dynamodb\",\"python\"],\"draft\":false,\"summary\":\"In this tutorial we will demonstrate how to expire old dynamodb items using a aws dynamodb ttl feature, where we can delete items when they are older than a configurable threshold.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"4 min read\",\"minutes\":3.445,\"time\":206700,\"words\":689},\"slug\":\"2017/11/22/delete-old-items-with-amazons-dynamodb-ttl-feature\",\"path\":\"blog/2017/11/22/delete-old-items-with-amazons-dynamodb-ttl-feature\",\"filePath\":\"blog/2017/11/22/delete-old-items-with-amazons-dynamodb-ttl-feature.mdx\",\"toc\":[{\"value\":\"Automatically Deleting Old Data in DynamoDB:\",\"url\":\"#automatically-deleting-old-data-in-dynamodb\",\"depth\":2},{\"value\":\"What we will be doing:\",\"url\":\"#what-we-will-be-doing\",\"depth\":2},{\"value\":\"Pre-Requisites:\",\"url\":\"#pre-requisites\",\"depth\":2},{\"value\":\"Create the Table:\",\"url\":\"#create-the-table\",\"depth\":2}
1,{\"value\":\"Write Data to DynamoDB\",\"url\":\"#write-data-to-dynamodb\",\"depth\":2},{\"value\":\"Verify:\",\"url\":\"#verify\",\"depth\":2},{\"value\":\"Delete the Table:\",\"url\":\"#delete-the-table\",\"depth\":2},{\"value\":\"Resources:\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Delete Old Items with Amazons DynamoDB TTL Feature\",\"datePublished\":\"2017-11-22T22:47:31.000Z\",\"dateModified\":\"2017-11-22T22:47:31.000Z\",\"description\":\"In this tutorial we will demonstrate how to expire old dynamodb items using a aws dynamodb ttl feature, where we can delete items when they are older than a configurable threshold.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2017/11/22/delete-old-items-with-amazons-dynamodb-ttl-feature\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Update your Ghost Blog with the Ghost-CLI\",\"date\":\"2017-11-22T22:36:45.000Z\",\"tags\":[\"ghost\",\"blog\",\"nodejs\"],\"draft\":false,\"summary\":\"This tutorial will demonstrate how to update your ghost blog platform using the ghost cli.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"1 min read\",\"minutes\":0.7,\"time\":42000,\"words\":140},\"slug\":\"2017/11/22/update-your-ghost-blog-with-the-ghost-cli\",\"path\":\"blog/2017/11/22/update-your-ghost-blog-with-the-ghost-cli\",\"filePath\":\"blog/2017/11/22/update-your-ghost-blog-with-the-ghost-cli.mdx\",\"toc\":[{\"value\":\"Backups\",\"url\":\"#backups\",\"depth\":2},{\"value\":\"Check the Current Version:\",\"url\":\"#check-the-current-version\",\"depth\":2},{\"value\":\"Update Ghost:\",\"url\":\"#update-ghost\",\"depth\":2},{\"value\":\"Verify Version:\",\"url\":\"#verify-version\",\"depth\":2},{\"value\":\"Resources:\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Update your Ghost Blog with the Ghost-CLI\",\"datePublished\":\"2017-11-22T22:36:45.000Z\",\"dateModified\":\"2017-11-22T22:36:45.000Z\",\"description\":\"This tutorial will demonstrate how to update your ghost blog platform using the ghost cli.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2017/11/22/update-your-ghost-blog-with-the-ghost-cli\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Use the Reindex API on Elasticsearch to Reindex your Data\",\"date\":\"2017-11-22T14:32:00.000Z\",\"tags\":[\"elasticsearch\"],\"draft\":false,\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"3 min read\",\"minutes\":2.13,\"time\":127800,\"words\":426},\"slug\":\"2017/11/22/use-the-reindex-api-on-elasticsearch-to-reindex-your-data\",\"path\":\"blog/2017/11/22/use-the-reindex-api-on-elasticsearch-to-reindex-your-data\",\"filePath\":\"blog/2017/11/22/use-the-reindex-api-on-elasticsearch-to-reindex-your-data.mdx\",\"toc\":[{\"value\":\"Provision Elasticsearch with Docker:\",\"url\":\"#provision-elasticsearch-with-docker\",\"depth\":2},{\"value\":\"Create Indexes:\",\"url\":\"#create-indexes\",\"depth\":2},{\"value\":\"View the Indexes:\",\"url\":\"#view-the-indexes\",\"depth\":2},{\"value\":\"Reindex the Data to our Monthly Index:\",\"url\":\"#reindex-the-data-to-our-monthly-index\",\"depth\":2},{\"value\":\"View the Indexes:\",\"url\":\"#view-the-indexes\",\"depth\":2},{\"value\":\"Delete the Old Indexes:\",\"url\":\"#delete-the-old-indexes\",\"depth\":2},{\"value\":\"Resources:\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Use the Reindex API on Elasticsearch to Reindex your Data\",\"datePublished\":\"2017-11-22T14:32:00.000Z\",\"dateModified\":\"2017-11-22T14:32:00.000Z\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2017/11/22/use-the-reindex-api-on-elasticsearch-to-reindex-your-data\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Using Elasticsearch Curator to Reindex Data\",\"date\":\"2017-11-22T14:09:28.000Z\",\"tags\":[\"elasticsearch\"],\"draft\":false,\"summary\":\"In this tutorial we will look at an alternative approach to reindex elasticsearch indices using the curator open source tool.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"2 min read\",\"minutes\":1.66,\"time\":99600,\"words\":332},\"slug\":\"2017/11/22/using-elasticsearch-curator-to-reindex-data\",\"path\":\"blog/2017/11/22/using-elasticsearch-curator-to-reindex-data\",\"filePath\":\"blog/2017/11/22/using-elasticsearch-curator-to-reindex-data.mdx\",\"toc\":[{\"value\":\"Install Elasticsearch Curator\",\"url\":\"#install-elasticsearch-curator\",\"depth\":2},{\"value\":\"Create Configs:\",\"url\":\"#create-configs\",\"depth\":2},{\"value\":\"Create the Elasticsearch Index:\",\"url\":\"#create-the-elasticsearch-index\",\"depth\":2},{\"value\":\"Run the Curator:\",\"url\":\"#run-the-curator\",\"depth\":2},{\"value\":\"Resources:\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Using Elasticsearch Curator to Reindex Data\",\"datePublished\":\"2017-11-22T14:09:28.000Z\",\"dateModified\":\"2017-11-22T14:09:28.000Z\",\"description\":\"In this tutorial we will look at an alternative approach to reindex elasticsearch indices using the curator open source tool.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2017/11/22/using-elasticsearch-curator-to-reindex-data\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Using Elasticdump to Backup Elasticsearch Indexes to JSON\",\"date\":\"2017-11-22T13:35:28.000Z\",\"tags\":[\"elasticsearch\",\"backups\"],\"draft\":false,\"summary\":\"This tutorial will demonstrate how to backup your elasticsearch data to json files using a opensource tool called elasticdump.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"4 min read\",\"minutes\":3.725,\"time\":223500,\"words\":745},\"slug\":\"2017/11/22/using-elasticdump-to-backup-elasticsearch-indexe
1s-to-json\",\"path\":\"blog/2017/11/22/using-elasticdump-to-backup-elasticsearch-indexes-to-json\",\"filePath\":\"blog/2017/11/22/using-elasticdump-to-backup-elasticsearch-indexes-to-json.mdx\",\"toc\":[{\"value\":\"Install Elasticdump:\",\"url\":\"#install-elasticdump\",\"depth\":2},{\"value\":\"Create a Index:\",\"url\":\"#create-a-index\",\"depth\":2},{\"value\":\"Elasticdump to dump the ata\",\"url\":\"#elasticdump-to-dump-the-ata\",\"depth\":2},{\"value\":\"Restore The Data\",\"url\":\"#restore-the-data\",\"depth\":2},{\"value\":\"Restore the Data for the Index:\",\"url\":\"#restore-the-data-for-the-index\",\"depth\":2},{\"value\":\"Resources:\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Using Elasticdump to Backup Elasticsearch Indexes to JSON\",\"datePublished\":\"2017-11-22T13:35:28.000Z\",\"dateModified\":\"2017-11-22T13:35:28.000Z\",\"description\":\"This tutorial will demonstrate how to backup your elasticsearch data to json files using a opensource tool called elasticdump.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2017/11/22/using-elasticdump-to-backup-elasticsearch-indexes-to-json\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Routing Web Traffic with a SOCKS Tunnel\",\"date\":\"2017-11-14T15:17:07.000Z\",\"tags\":[\"ssh\",\"socks\",\"tunnel\"],\"draft\":false,\"summary\":\"This tutorial will demonstrate how to access a non standard http port on a target server if that port is not directly accessible via the internet and using a socks tunnel to proxy the traffic through.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"1 min read\",\"minutes\":0.995,\"time\":59700,\"words\":199},\"slug\":\"2017/11/14/routing-web-traffic-with-a-socks-tunnel\",\"path\":\"blog/2017/11/14/routing-web-traffic-with-a-socks-tunnel\",\"filePath\":\"blog/2017/11/14/routing-web-traffic-with-a-socks-tunnel.mdx\",\"toc\":[{\"value\":\"Web Application on my LAN\",\"url\":\"#web-application-on-my-lan\",\"depth\":2},{\"value\":\"Establish the SOCKS Tunnel\",\"url\":\"#establish-the-socks-tunnel\",\"depth\":2},{\"value\":\"Configure your Browser:\",\"url\":\"#configure-your-browser\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Routing Web Traffic with a SOCKS Tunnel\",\"datePublished\":\"2017-11-14T15:17:07.000Z\",\"dateModified\":\"2017-11-14T15:17:07.000Z\",\"description\":\"This tutorial will demonstrate how to access a non standard http port on a target server if that port is not directly accessible via the internet and using a socks tunnel to proxy the traffic through.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2017/11/14/routing-web-traffic-with-a-socks-tunnel\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Local Dev Environment with Docker MySQL and Adminer WebUI with Docker Compose\",\"date\":\"2017-11-13T21:15:34.000Z\",\"tags\":[\"docker\",\"mysql\"],\"draft\":false,\"summary\":\"This tutorial will demonstrate how to setup a local development environment with docker, mysql and adminer using docker compose.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"2 min read\",\"minutes\":2.005,\"time\":120300,\"words\":401},\"slug\":\"2017/11/13/local-dev-environment-with-docker-mysql-and-adminer-webui-with-docker-compose\",\"path\":\"blog/2017/11/13/local-dev-environment-with-docker-mysql-and-adminer-webui-with-docker-compose\",\"filePath\":\"blog/2017/11/13/local-dev-environment-with-docker-mysql-and-adminer-webui-with-docker-compose.mdx\",\"toc\":[{\"value\":\"Docker Compose File:\",\"url\":\"#docker-compose-file\",\"depth\":2},{\"value\":\"Pre-Requirements:\",\"url\":\"#pre-requirements\",\"depth\":2},{\"value\":\"Launching our Services:\",\"url\":\"#launching-our-services\",\"depth\":2},{\"value\":\"Using the Debug Container:\",\"url\":\"#using-the-debug-container\",\"depth\":2},{\"value\":\"Accessing the MySQL WebUI: Adminer\",\"url\":\"#accessing-the-mysql-webui-adminer\",\"depth\":2},{\"value\":\"Deleting the Environment:\",\"url\":\"#deleting-the-environment\",\"depth\":2},{\"value\":\"Resources:\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Local Dev Environment with Docker MySQL and Adminer WebUI with Docker Compose\",\"datePublished\":\"2017-11-13T21:15:34.000Z\",\"dateModified\":\"2017-11-13T21:15:34.000Z\",\"description\":\"This tutorial will demonstrate how to setup a local development environment with docker, mysql and adminer using docker 
1compose.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2017/11/13/local-dev-environment-with-docker-mysql-and-adminer-webui-with-docker-compose\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Setup a Concourse-CI Server on Ubuntu 16\",\"date\":\"2017-11-07T22:55:46.000Z\",\"tags\":[\"devops\",\"concourse\",\"cicd\"],\"draft\":false,\"summary\":\"This devops tutorial will demonstrate how to install and configure a concourse ci server for your cicd pipelines and demonstrate with a basic example on how the pipeline will run.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"6 min read\",\"minutes\":5.15,\"time\":309000,\"words\":1030},\"slug\":\"2017/11/07/setup-a-concourse-ci-server-on-ubuntu-16\",\"path\":\"blog/2017/11/07/setup-a-concourse-ci-server-on-ubuntu-16\",\"filePath\":\"blog/2017/11/07/setup-a-concourse-ci-server-on-ubuntu-16.mdx\",\"toc\":[{\"value\":\"Resources:\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"A Newer Version\",\"url\":\"#a-newer-version\",\"depth\":2},{\"value\":\"What is Concourse CI:\",\"url\":\"#what-is-concourse-ci\",\"depth\":2},{\"value\":\"What will we be doing today\",\"url\":\"#what-will-we-be-doing-today\",\"depth\":2},{\"value\":\"Setup the Server:\",\"url\":\"#setup-the-server\",\"depth\":2},{\"value\":\"Client Side:\",\"url\":\"#client-side\",\"depth\":2},{\"value\":\"Hello World Pipeline:\",\"url\":\"#hello-world-pipeline\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Setup a Concourse-CI Server on Ubuntu 16\",\"datePublished\":\"2017-11-07T22:55:46.000Z\",\"dateModified\":\"2017-11-07T22:55:46.000Z\",\"description\":\"This devops tutorial will demonstrate how to install and configure a concourse ci server for your cicd pipelines and demonstrate with a basic example on how the pipeline will run.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2017/11/07/setup-a-concourse-ci-server-on-ubuntu-16\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Installing Elastalert for Elasticsearch on Amazon Linux\",\"date\":\"2017-11-07T12:53:33.000Z\",\"tags\":[\"elasticsearch\",\"alerting\",\"monitoring\",\"aws\"],\"draft\":false,\"summary\":\"This tutorial will demonstrate how to install elastalert to alert based of elasticsearch data.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"2 min read\",\"minutes\":1.355,\"time\":81300,\"words\":271},\"slug\":\"2017/11/07/installing-elastalert-for-elasticsearch-on-amazon-linux\",\"path\":\"blog/2017/11/07/installing-elastalert-for-elasticsearch-on-amazon-linux\",\"filePath\":\"blog/2017/11/07/installing-elastalert-for-elasticsearch-on-amazon-linux.mdx\",\"toc\":[{\"value\":\"Setting up Elastalert\",\"url\":\"#setting-up-elastalert\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Installing Elastalert for Elasticsearch on Amazon Linux\",\"datePublished\":\"2017-11-07T12:53:33.000Z\",\"dateModified\":\"2017-11-07T12:53:33.000Z\",\"description\":\"This tutorial will demonstrate how to install elastalert to alert based of elasticsearch data.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2017/11/07/installing-elastalert-for-elasticsearch-on-amazon-linux\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Linux Shell Commands with the Python Commands Module\",\"date\":\"2017-11-06T20:15:23.000Z\",\"tags\":[\"python\",\"linux\",\"commands\"],\"draft\":false,\"summary\":\"This tutorial demonstrate how to use linux commands from your python code.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"1 min read\",\"minutes\":0.735,\"time\":44100,\"words\":147},\"slug\":\"2017/11/06/linux-shell-commands-with-the-python-commands-module\",\"path\":\"blog/2017/11/06/linux-shell-commands-with-the-python-commands-module\",\"filePath\":\"blog/2017/11/06/linux-shell-commands-with-the-python-commands-module.mdx\",\"toc\":[{\"value\":\"Status Code and Output:\",\"url\":\"#status-code-and-output\",\"depth\":2},{\"value\":\"Command Output Only:\",\"url\":\"#command-output-only\",\"depth\":2},{\"value\":\"Basic Script\",\"url\":\"#basic-script\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Linux Shell Commands with the Python Commands Module\",\"datePublished\":\"2017-11-06T20:15:23.000Z\",\"dateModified\":\"2017-11-06T20:15:23.000Z\",\"description\":\"This tutorial demonstrate how to use linux commands from your python code.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2017/11/06/linux-shell-commands-with-the-python-commands-module\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Using Python to Query MySQL Database with MySQLdb Library\",\"date\":\"2017-10-26T07:40:11.000Z\",\"tags\":[\"python\",\"mysql\",\"databases\"],\"draft\":false,\"summary\":\"In this tutorial we will use python to query mysql databases using the python mysqldb library.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"2 min read\",\"minutes\":1.285,\"time\":77100,\"words\":257},\"slug\":\"2017/10/26/using-python-to-query-mysql-database-with-mysqldb-library\",\"path\":\"blog/2017/10/26/using-python-to-query-mysql-database-with-mysqldb-library\",\"filePath\":\"blog/2017/10/26/using-python-to-query-mysql-database-with-mysqldb-library.mdx\",\"toc\":[{\"value\":\"Provision MySQL\",\"url\":\"#provision-mysql\",\"depth\":2},{\"value\":\"Populate some data in MySQL\",\"url\":\"#populate-some-data-in-mysql\",\"depth\":2},{\"value\":\"Python with MySQL: Setup the Environment\",\"url\":\"#python-with-mysql-setup-the-environment\",\"depth\":2},{\"value\":\"Python with MySQL: Develop the Client\",\"url\":\"#python-with-mysql-develop-the-client\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Using Python to Query MySQL Database with MySQLdb Library\",\"datePublished\":\"2017-10-26T07:40:11.000Z\",\"dateModified\":\"2017-10-26T07:40:11.000Z\",\"description\":\"In this tutorial we will use python to query mysql databases using the python mysqldb library.\",\"
1image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2017/10/26/using-python-to-query-mysql-database-with-mysqldb-library\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Your First Hello World App with Golang\",\"date\":\"2017-10-25T21:16:25.000Z\",\"tags\":[\"golang\",\"programming\"],\"draft\":false,\"summary\":\"In this programming tutorial we will use golang to write a hello world app and we will use a docker container as our environment.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"1 min read\",\"minutes\":0.995,\"time\":59700,\"words\":199},\"slug\":\"2017/10/25/your-first-hello-world-app-with-golang\",\"path\":\"blog/2017/10/25/your-first-hello-world-app-with-golang\",\"filePath\":\"blog/2017/10/25/your-first-hello-world-app-with-golang.mdx\",\"toc\":[{\"value\":\"Golang Environment: Golang Docker Image\",\"url\":\"#golang-environment-golang-docker-image\",\"depth\":2},{\"value\":\"Our Basic App\",\"url\":\"#our-basic-app\",\"depth\":2},{\"value\":\"Running our App:\",\"url\":\"#running-our-app\",\"depth\":2},{\"value\":\"Resources:\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Your First Hello World App with Golang\",\"datePublished\":\"2017-10-25T21:16:25.000Z\",\"dateModified\":\"2017-10-25T21:16:25.000Z\",\"description\":\"In this programming tutorial we will use golang to write a hello world app and we will use a docker container as our environment.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2017/10/25/your-first-hello-world-app-with-golang\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"New Posts on Github Pages with Octopress not Showing on your Blog\",\"date\":\"2017-10-25T10:54:59.000Z\",\"tags\":[\"octopress\",\"github-pages\"],\"draft\":false,\"summary\":\"This tutorial will show how we can debug when new posts on github pages dont appear when we use octopress.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"1 min read\",\"minutes\":0.475,\"time\":28500,\"words\":95},\"slug\":\"2017/10/25/new-posts-on-github-pages-with-octopress-not-showing-on-your-blog\",\"path\":\"blog/2017/10/25/new-posts-on-github-pages-with-octopress-not-showing-on-your-blog\",\"filePath\":\"blog/2017/10/25/new-posts-on-github-pages-with-octopress-not-showing-on-your-blog.mdx\",\"toc\":[{\"value\":\"The Issue:\",\"url\":\"#the-issue\",\"depth\":2},{\"value\":\"Resolving the Issue:\",\"url\":\"#resolving-the-issue\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"New Posts on Github Pages with Octopress not Showing on your Blog\",\"datePublished\":\"2017-10-25T10:54:59.000Z\",\"dateModified\":\"2017-10-25T10:54:59.000Z\",\"description\":\"This tutorial will show how we can debug when new posts on github pages dont appear when we use octopress.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2017/10/25/new-posts-on-github-pages-with-octopress-not-showing-on-your-blog\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Running Java Web Applications on Tomcat with Docker Swarm\",\"date\":\"2017-10-24T13:37:38.000Z\",\"tags\":[\"docker\",\"swarm\",\"java\",\"tomcat\"],\"draft\":false,\"summary\":\"This tutorail will demonstrate how to run java web applications as containers on tomcat using docker swarm.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"5 min read\",\"minutes\":4.05,\"time\":243000,\"words\":810},\"slug\":\"2017/10/24/running-java-web-applications-on-tomcat-with-docker-swarm\",\"path\":\"blog/2017/10/24/running-java-web-applications-on-tomcat-with-docker-swarm\",\"filePath\":\"blog/2017/10/24/running-java-web-applications-on-tomcat-with-docker-swarm.mdx\",\"toc\":[{\"value\":\"Our Dockerfile for our Own Tomcat Image:\",\"url\":\"#our-dockerfile-for-our-own-tomcat-image\",\"depth\":2},{\"value\":\"Building our Image and Pusing to our Registry:\",\"url\":\"#building-our-image-and-pusing-to-our-registry\",\"depth\":2},{\"value\":\"Dockerfile for our Application:\",\"url\":\"#dockerfile-for-our-application\",\"depth\":2},{\"value\":\"Setup the Compose file for our Stack:\",\"url\":\"#setup-the-compose-file-for-our-stack\",\"depth\":2},{\"value\":\"Deploy our Application:\",\"url\":\"#deploy-our-application\",\"depth\":2},{\"value\":\"Testing our Application:\",\"url\":\"#testing-our-application\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Running Java Web Applications on Tomcat with Docker Swarm\",\"datePublished\":\"2017-10-24T13:37:38.000Z\",\"dateModified\":\"2017-10-24T13:37:38.000Z\",\"description\":\"This tutorail will demonstrate how to run java web applications as containers on tomcat using docker swarm.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2017/10/24/running-java-web-applications-on-tomcat-with-docker-swarm\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Managing Traefik Configuration with Consul on Docker Swarm\",\"date\":\"2017-10-24T07:08:15.000Z\",\"tags\":[\"docker\",\"docker-swarm\",\"traefik\",\"consul\"],\"draft\":false,\"summary\":\"This tutorial will demonstrate managing traefik configuration using consul on docker swarm.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"9 min read\",\"minutes\":8.995,\"time\":539700,\"words\":1799},\"slug\":\"2017/10/24/managing-traefik-configuration-with-consul-on-docker-swarm\",\"path\":\"blog/2017/10/24/managing-traefik-configuration-with-consul-on-docker-swarm\",\"filePath\":\"blog/2017/10/24/managing-traefik-configuration-with-consul-on-docker-swarm.mdx\",\"toc\":[{\"value\":\"Resources:\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Create Consul in the Swarm:\",\"url\":\"#create-consul-in-the-swarm\",\"depth\":2},{\"value\":\"Create Compose Files:\",\"url\":\"#create-compose-files\",\"depth\":2},{\"value\":\"Create Overlay Network and Deploy Stacks\",\"url\":\"#create-overlay-network-and-deploy-stacks\",\"depth\":2},{\"value\":\"Populate Configs and Push to Consul KV Store:\",\"url\":\"#populate-configs-and-push-to-consul-kv-store\",\"depth\":2},{\"value\":\"Testing Applications:\",\"url\":\"#testing-applications\",\"depth\":2},{\"value\":\"Data Persistent Test:\",\"url\":\"#data-persistent-test\",\"depth\":2},{\"value\":\"Inspect Services:\",\"url\":\"#inspect-services\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Managing Traefik Configuration with Consul on Docker Swarm\",\"datePublished\":\"2017-10-24T07:08:15.000Z\",\"dateModified\":\"2017-10-24T07:08:15.000Z\",\"description\":\"This tutorial will demonstrate managing traefik configuration using consul on docker swarm.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2017/10/24/managing-traefik-configuration-with-consul-on-docker-swarm\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Basic Example with Python to create a Module that consists of Classes and Functions\",\"date\":\"2017-10-22T09:45:17.000Z\",\"tags\":[\"python\",\"programming\"],\"draft\":false,\"summary\":\"This tutorial will demonstrate using the python programming language to create a module that consists of classes and functions.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"2 min read\",\"minutes\":1.345,\"time\":80700,\"words\":269},\"slug\":\"2017/10/22/basic-example-with-python-to-create-a-module-that-consists-of-classes-and-functions\",\"path\":\"blog/2017/10/22/basic-example-with-python-to-create-a-module-that-consists-of-classes-and-functions\",\"filePath\":\"blog/2017/10/22/basic-example-with-python-to-create-a-module-that-consists-of-classes-and-functions.mdx\",\"toc\":[{\"value\":\"The Directory Setup:\",\"url\":\"#the-directory-setup\",\"depth\":2},{\"value\":\"Our Test Module:\",\"url\":\"#our-test-module\",\"depth\":2},{\"value\":\"Testing it out:\",\"url\":\"#testing-it-out\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Basic Example with Python to create a Module that consists of Classes and Functions\",\"datePublished\":\"2017-10-22T09:45:17.000Z\",\"dateModified\":\"2017-10-22T09:45:17.000Z\",\"description\":\"This tutorial will demonstrate using the python programming language to create a module that consists of classes and functions.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2017/10/22/basic-example-with-python-to-create-a-module-that-consists-of-classes-and-functions\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Python Script to Decrypt Encrypted Data with AWS KMS\",\"date\":\"2017-10-20T08:54:51.000Z\",\"tags\":[\"aws\",\"python\",\"kms\",\"encryption\",\"security\"],\"draft\":false,\"summary\":\"This tutorial will demonstrate how to use a python script to decrypt encrypted data on aws using aws kms.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"1 min read\",\"minutes\":0.6,\"time\":36000,\"words\":120},\"slug\":\"2017/10/20/python-script-to-decrypt-encrypted-data-with-aws-kms\",\"path\":\"blog/2017/10/20/python-script-to-decrypt-encrypted-data-with-aws-kms\",\"filePath\":\"blog/2017/10/20/python-script-to-decrypt-encrypted-data-with-aws-kms.mdx\",\"toc\":[{\"value\":\"The Script:\",\"url\":\"#the-script\",\"depth\":2},{\"value\":\"Usage:\",\"url\":\"#usage\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Python Script to Decrypt Encrypted Data with AWS KMS\",\"datePublished\":\"2017-10-20T08:54:51.000Z\",\"dateModified\":\"2017-10-20T08:54:51.000Z\",\"description\":\"This tutorial will demonstrate how to use a python script to decrypt encrypted data on aws using aws kms.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2017/10/20/python-script-to-decrypt-encrypted-data-with-aws-kms\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Setup Kerberos Server and Client on Ubuntu\",\"date\":\"2017-10-18T22:25:11.000Z\",\"tags\":[\"authentication\",\"kerberos\",\"ubuntu\",\"linux\"],\"draft\":false,\"summary\":\"This tutorial will demonstrate how to setup a kerbero server on linux to act as a centralized authentication server.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"3 min read\",\"minutes\":2.56,\"time\":153600,\"words\":512},\"slug\":\"2017/10/18/setup-kerberos-server-and-client-on-ubuntu\",\"path\":\"blog/2017/10/18/setup-kerberos-server-and-client-on-ubuntu\",\"filePath\":\"blog/2017/10/18/setup-kerberos-server-and-client-on-ubuntu.mdx\",\"toc\":[{\"value\":\"Setup the Server:\",\"url\":\"#setup-the-server\",\"depth\":2},{\"value\":\"Setup the Client:\",\"url\":\"#setup-the-client\",\"depth\":2},{\"value\":\"Resources:\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Setup Kerberos Server and Client on Ubuntu\",\"datePublished\":\"2017-10-18T22:25:11.000Z\",\"dateModified\":\"2017-10-18T22:25:11.000Z\",\"description\":\"This tutorial will demonstrate how to setup a kerbero server on linux to act as a centralized authentication server.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2017/10/18/setup-kerberos-server-and-client-on-ubuntu\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Using Python to build a Dictionary from data eg sports per person\",\"date\":\"2017-10-14T18:53:48.000Z\",\"tags\":[\"python\",\"programming\",\"scripting\"],\"draft\":false,\"summary\":\"This tutorial shows how we 
1can use the python programming language to build a dictionary.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"2 min read\",\"minutes\":1.84,\"time\":110400,\"words\":368},\"slug\":\"2017/10/14/using-python-to-build-a-dictionary-from-data-eg-sports-per-person\",\"path\":\"blog/2017/10/14/using-python-to-build-a-dictionary-from-data-eg-sports-per-person\",\"filePath\":\"blog/2017/10/14/using-python-to-build-a-dictionary-from-data-eg-sports-per-person.mdx\",\"toc\":[{\"value\":\"The Idea\",\"url\":\"#the-idea\",\"depth\":2},{\"value\":\"Some Catches\",\"url\":\"#some-catches\",\"depth\":2},{\"value\":\"The Code\",\"url\":\"#the-code\",\"depth\":2},{\"value\":\"Running the Script:\",\"url\":\"#running-the-script\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Using Python to build a Dictionary from data eg sports per person\",\"datePublished\":\"2017-10-14T18:53:48.000Z\",\"dateModified\":\"2017-10-14T18:53:48.000Z\",\"description\":\"This tutorial shows how we can use the python programming language to build a dictionary.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2017/10/14/using-python-to-build-a-dictionary-from-data-eg-sports-per-person\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Customize Ubuntu 16 Desktop with Arc Dark Theme\",\"date\":\"2017-10-11T19:56:10.000Z\",\"tags\":[\"desktop\",\"linux\",\"ubuntu\",\"customization\"],\"draft\":false,\"summary\":\"This tutorial will demonstrate how to customize ubunto desktop with the arc dark theme.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"3 min read\",\"minutes\":2.495,\"time\":149700,\"words\":499},\"slug\":\"2017/10/11/customize-ubuntu-16-desktop-with-arc-dark-theme\",\"path\":\"blog/2017/10/11/customize-ubuntu-16-desktop-with-arc-dark-theme\",\"filePath\":\"blog/2017/10/11/customize-ubuntu-16-desktop-with-arc-dark-theme.mdx\",\"toc\":[{\"value\":\"Customizations:\",\"url\":\"#customizations\",\"depth\":2},{\"value\":\"Other Preferred Applications:\",\"url\":\"#other-preferred-applications\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Customize Ubuntu 16 Desktop with Arc Dark Theme\",\"datePublished\":\"2017-10-11T19:56:10.000Z\",\"dateModified\":\"2017-10-11T19:56:10.000Z\",\"description\":\"This tutorial will demonstrate how to customize ubunto desktop with the arc dark theme.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2017/10/11/customize-ubuntu-16-desktop-with-arc-dark-theme\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Display PHP Content through HTML files\",\"date\":\"2017-10-11T06:43:55.000Z\",\"tags\":[\"html\",\"php\",\"nginx\"],\"draft\":false,\"summary\":\"This tutorial will demonstrate how to display php content through html files.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"1 min read\",\"minutes\":0.99,\"time\":59400,\"words\":198},\"slug\":\"2017/10/11/display-php-content-through-html-files\",\"path\":\"blog/2017/10/11/display-php-content-through-html-files\",\"filePath\":\"blog/2017/10/11/display-php-content-through-html-files.mdx\",\"toc\":[{\"value\":\"The Issue:\",\"url\":\"#the-issue\",\"depth\":2},{\"value\":\"My Nginx Config:\",\"url\":\"#my-nginx-config\",\"depth\":2},{\"value\":\"The Fix:\",\"url\":\"#the-fix\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Display PHP Content through HTML files\",\"datePublished\":\"2017-10-11T06:43:55.000Z\",\"dateModified\":\"2017-10-11T06:43:55.000Z\",\"description\":\"This tutorial will demonstrate how to display php content through html files.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2017/10/11/display-php-content-through-
1html-files\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Sending Mail with SSMTP on Alpine Linux\",\"date\":\"2017-10-09T20:36:35.000Z\",\"tags\":[\"mail\",\"ssmtp\",\"alpine\",\"linux\"],\"draft\":false,\"summary\":\"This tutorial will demonstrate how to send email using ssmtp on alpine linux.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"1 min read\",\"minutes\":0.62,\"time\":37200,\"words\":124},\"slug\":\"2017/10/09/sending-mail-with-ssmtp-on-alpine-linux\",\"path\":\"blog/2017/10/09/sending-mail-with-ssmtp-on-alpine-linux\",\"filePath\":\"blog/2017/10/09/sending-mail-with-ssmtp-on-alpine-linux.mdx\",\"toc\":[{\"value\":\"Update and Install SSMTP\",\"url\":\"#update-and-install-ssmtp\",\"depth\":2},{\"value\":\"Configure SSMTP\",\"url\":\"#configure-ssmtp\",\"depth\":2},{\"value\":\"Create the Mail Content\",\"url\":\"#create-the-mail-content\",\"depth\":2},{\"value\":\"Testing Mail Delivery\",\"url\":\"#testing-mail-delivery\",\"depth\":2},{\"value\":\"Related:\",\"url\":\"#related\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Sending Mail with SSMTP on Alpine Linux\",\"datePublished\":\"2017-10-09T20:36:35.000Z\",\"dateModified\":\"2017-10-09T20:36:35.000Z\",\"description\":\"This tutorial will demonstrate how to send email using ssmtp on alpine linux.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2017/10/09/sending-mail-with-ssmtp-on-alpine-linux\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Backup and Restore Mutliple Collections from a Database with MongoDB\",\"date\":\"2017-10-03T20:42:34.000Z\",\"tags\":[\"mongodb\",\"backups\",\"rocketchat\",\"mlab\"],\"draft\":false,\"summary\":\"In this tutorial we will demonstrate how to backup and restore multiple collections in mongodb.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"3 min read\",\"minutes\":2.09,\"time\":125400,\"words\":418},\"slug\":\"2017/10/03/backup-and-restore-mutliple-collections-from-a-database-with-mongodb\",\"path\":\"blog/2017/10/03/backup-and-restore-mutliple-collections-from-a-database-with-mongodb\",\"filePath\":\"blog/2017/10/03/backup-and-restore-mutliple-collections-from-a-database-with-mongodb.mdx\",\"toc\":[{\"value\":\"Create the MongoDB Backup\",\"url\":\"#create-the-mongodb-backup\",\"depth\":2},{\"value\":\"Restore MongoDB Database\",\"url\":\"#restore-mongodb-database\",\"depth\":2},{\"value\":\"Checkout the New MongoDB Database:\",\"url\":\"#checkout-the-new-mongodb-database\",\"depth\":2},{\"value\":\"Resources:\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Backup and Restore Mutliple Collections from a Database with MongoDB\",\"datePublished\":\"2017-10-03T20:42:34.000Z\",\"dateModified\":\"2017-10-03T20:42:34.000Z\",\"description\":\"In this tutorial we will demonstrate how to backup and restore multiple collections in mongodb.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2017/10/03/backup-and-restore-mutliple-collections-from-a-database-with-mongodb\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Creating a Nodejs Hostname App with Docker Stacks on Swarm\",\"date\":\"2017-09-24T21:52:51.000Z\",\"tags\":[\"docker\",\"swarm\",\"nodejs\",\"haproxy\"],\"draft\":false,\"summary\":\"This tutorial will demonstrate how to create a nodejs application and deploy it on docker swarm.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"3 min read\",\"minutes\":2.22,\"time\":133200,\"words\":444},\"slug\":\"2017/09/24/creating-a-nodejs-hostname-app-with-docker-stacks-on-swarm\",\"path\":\"blog/2017/09/24/creating-a-nodejs-hostname-app-with-docker-stacks-on-swarm\",\"filePath\":\"blog/2017/09/24/creating-a-nodejs-hostname-app-with-docker-stacks-on-swarm.mdx\",\"toc\":[{\"value\":\"Creating the Application:\",\"url\":\"#creating-the-application\",\"depth\":2},{\"value\":\"Creating the Compose file\",\"url\":\"#creating-the-compose-file\",\"depth\":2},{\"value\":\"Create the Stack:\",\"url\":\"#create-the-stack\",\"depth\":2},{\"value\":\"Test out our Application\",\"url\":\"#test-out-our-application\",\"depth\":2},{\"value\":\"Scaling Out:\",\"url\":\"#scaling-out\",\"depth\":2},{\"value\":\"Cleanup\",\"url\":\"#cleanup\",\"depth\":2},{\"value\":\"Resources:\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Creating a Nodejs Hostname App with Docker Stacks on Swarm\",\"datePublished\":\"2017-09-24T21:52:51.000Z\",\"dateModified\":\"2017-09-24T21:52:51.000Z\",\"description\":\"This tutorial will demonstrate how to create a nodejs application and deploy it on docker swarm.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2017/09/24/creating-a-nodejs-hostname-app-with-docker-stacks-on-swarm\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Create a 3 Node Elasticsearch Stack with HAProxy on Docker Swarm\",\"date\":\"2017-09-24T19:40:19.000Z\",\"tags\":[\"docker\",\"swarm\",\"haproxy\",\"elasticsearch\"],\"draft\":false,\"summary\":\"This tutorial demonstrates how to create a 3 node elasticsearch cluster with haproxy on docker swarm.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"4 min read\",\"minutes\":3.73,\"time\":223800,\"words\":746},\"slug\":\"2017/09/24/create-a-3-node-elasticsearch-stack-with-haproxy-on-docker-swarm\",\"path\":\"blog/2017/09/24/create-a-3-node-elasticsearch-stack-with-haproxy-on-docker-swarm\",\"filePath\":\"blog/2017/09/24/create-a-3-node-elasticsearch-stack-with-haproxy-on-docker-swarm.mdx\",\"toc\":[{\"value\":\"Environment:\",\"url\":\"#environment\",\"depth\":2},{\"value\":\"Defining our Stack\",\"url\":\"#defining-our-stack\",\"depth\":2},{\"value\":\"Creating our Elasticsearch Stack\",\"url\":\"#creating-our-elasticsearch-stack\",\"depth\":2},{\"value\":\"Testing Elasticsearch:\",\"url\":\"#testing-elasticsearch\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Create a 3 Node Elasticsearch Stack with HAProxy on Docker Swarm\",\"datePublished\":\"2017-09-24T19:40:19.000Z\",\"dateModified\":\"2017-09-24T19:40:19.000Z\",\"description\":\"This tutorial demonstrates how to create a 3 node elasticsearch cluster with haproxy on docker swarm.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2017/09/24/create-a-3-node-elasticsearch-stack-with-haproxy-on-docker-swarm\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Simple Program with C Language on Linux\",\"date\":\"2017-09-24T10:41:58.000Z\",\"tags\":[\"linux\",\"programming\",\"c\"],\"draft\":false,\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"1 min read\",\"minutes\":0.965,\"time\":57900,\"words\":193},\"slug\":\"2017/09/24/simple-program-with-c-language-on-linux\",\"path\":\"blog/2017/09/24/simple-program-with-c-language-on-linux\",\"filePath\":\"blog/2017/09/24/simple-program-with-c-language-on-linux.mdx\",\"toc\":[{\"value\":\"Requirements:\",\"url\":\"#requirements\",\"depth\":2},{\"value\":\"Writing our first Program:\",\"url\":\"#writing-our-first-program\",\"depth\":2},{\"value\":\"Testing our App:\",\"url\":\"#testing-our-app\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Simple Program with C Language on Linux\",\"datePublished\":\"2017-09-24T10:41:58.000Z\",\"dateModified\":\"2017-09-24T10:41:58.000Z\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2017/09/24/simple-program-with-c-language-on-linux\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Using the AWS CLI tools to grab CloudWatch Metrics for Elasticsearch\",\"date\":\"2017-09-22T22:06:23.000Z\",\"tags\":[\"aws\",\"monitoring\",\"cloudwatch\",\"elasticsearch\"],\"draft\":false,\"summary\":\"This tutorial demonstrates on how to use the awscli tools to consume cloudwatch metrics for elasticsearch.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"2 min read\",\"minutes\":1.765,\"time\":105900,\"words\":353},\"slug\":\"2017/09/22/using-the-aws-cli-tools-to-grab-cloudwatch-metrics-for-elasticsearch\",\"path\":\"blog/2017/09/22/using-the-aws-cli-tools-to-grab-cloudwatch-metrics-for-elasticsearch\",\"filePath\":\"blog/2017/09/22/using-the-aws-cli-tools-to-grab-cloudwatch-metrics-for-elasticsearch.mdx\",\"toc\":[{\"value\":\"Elasticsearch:\",\"url\":\"#elasticsearch\",\"depth\":2},{\"value\":\"Metric: JVMMemoryPressure\",\"url\":\"#metric-jvmmemorypressure\",\"depth\":2},{\"value\":\"Metric: WriteIOPS\",\"url\":\"#metric-writeiops\",\"depth\":2},{\"value\":\"Metric: FreeStorageSpace\",\"url\":\"#metric-freestoragespace\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Using the AWS CLI tools to grab CloudWatch Metrics for Elasticsearch\",\"datePublished\":\"2017-09-22T22:06:23.000Z\",\"dateModified\":\"2017-09-22T22:06:23.000Z\",\"description\":\"This tutorial demonstrates on how to use the awscli tools to consume cloudwatch metrics for elasticsearch.\",\"
1image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2017/09/22/using-the-aws-cli-tools-to-grab-cloudwatch-metrics-for-elasticsearch\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Using the Python sys library to read data from stdin\",\"date\":\"2017-09-18T15:42:01.000Z\",\"tags\":[\"python\",\"programming\"],\"draft\":false,\"summary\":\"This is a short tutorial to show how to use python to read data from stdin.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"1 min read\",\"minutes\":0.76,\"time\":45600,\"words\":152},\"slug\":\"2017/09/18/using-the-python-sys-library-to-read-data-from-stdin\",\"path\":\"blog/2017/09/18/using-the-python-sys-library-to-read-data-from-stdin\",\"filePath\":\"blog/2017/09/18/using-the-python-sys-library-to-read-data-from-stdin.mdx\",\"toc\":[{\"value\":\"Python: Read Data from Standard Input\",\"url\":\"#python-read-data-from-standard-input\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Using the Python sys library to read data from stdin\",\"datePublished\":\"2017-09-18T15:42:01.000Z\",\"dateModified\":\"2017-09-18T15:42:01.000Z\",\"description\":\"This is a short tutorial to show how to use python to read data from stdin.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2017/09/18/using-the-python-sys-library-to-read-data-from-stdin\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Setup a Postfix Relay Server that Uses SES to Relay Outbound Mail\",\"date\":\"2017-09-16T22:01:49.000Z\",\"tags\":[\"aws\",\"postfix\",\"ses\"],\"draft\":false,\"summary\":\"This tutorial will demonstrate how to setup a postfix relay server that utilises AWS SES to relay outbound email.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"2 min read\",\"minutes\":1.17,\"time\":70200,\"words\":234},\"slug\":\"2017/09/16/setup-a-postfix-relay-server-that-uses-ses-to-relay-outbound-mail\",\"path\":\"blog/2017/09/16/setup-a-postfix-relay-server-that-uses-ses-to-relay-outbound-mail\",\"filePath\":\"blog/2017/09/16/setup-a-postfix-relay-server-that-uses-ses-to-relay-outbound-mail.mdx\",\"toc\":[{\"value\":\"Setup EC2 Instance to Relay through AWS SES:\",\"url\":\"#setup-ec2-instance-to-relay-through-aws-ses\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Setup a Postfix Relay Server that Uses SES to Relay Outbound Mail\",\"datePublished\":\"2017-09-16T22:01:49.000Z\",\"dateModified\":\"2017-09-16T22:01:49.000Z\",\"description\":\"This tutorial will demonstrate how to setup a postfix relay server that utilises AWS SES to relay outbound email.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2017/09/16/setup-a-postfix-relay-server-that-uses-ses-to-relay-outbound-mail\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Nginx Reverse Proxy for Elasticsearch and Kibana 5 on AWS\",\"date\":\"2017-09-16T21:24:32.000Z\",\"tags\":[\"aws\",\"elasticsearch\",\"kibana\",\"nginx\"],\"draft\":false,\"summary\":\"This tutorial will demonstrate how to setup a nginx reverse proxy for elasticsearch and kibana 5 on AWS.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"3 min read\",\"minutes\":2.77,\"time\":166200,\"words\":554},\"slug\":\"2017/09/16/nginx-reverse-proxy-for-elasticsearch-and-kibana-5-on-aws\",\"path\":\"blog/2017/09/16/nginx-reverse-proxy-for-elasticsearch-and-kibana-5-on-aws\",\"filePath\":\"blog/2017/09/16/nginx-reverse-proxy-for-elasticsearch-and-kibana-5-on-aws.mdx\",\"toc\":[{\"value\":\"Workaround:\",\"url\":\"#workaround\",\"depth\":2},{\"value\":\"Installing Nginx:\",\"url\":\"#installing-nginx\",\"depth\":2},{\"value\":\"Configure Nginx:\",\"url\":\"#configure-nginx\",\"depth\":2},{\"value\":\"Create User Accounts for HTTP Basic Auth\",\"url\":\"#create-user-accounts-for-http-basic-auth\",\"depth\":2},{\"value\":\"Restart Nginx:\",\"url\":\"#restart-nginx\",\"depth\":2},{\"value\":\"Resources:\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Nginx Reverse Proxy for Elasticsearch and Kibana 5 on AWS\",\"datePublished\":\"2017-09-16T21:24:32.000Z\",\"dateModified\":\"2017-09-16T21:24:32.000Z\",\"description\":\"This tutorial will demonstrate how to setup a nginx reverse proxy for elasticsearch and kibana 5 on AWS.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2017/09/16/nginx-reverse-proxy-for-elasticsearch-and-kibana-5-on-aws\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"AWS: IAM S3 Policy for Cyberduck to Allow Listing Buckets and Access to One Bucket\",\"date\":\"2017-09-15T15:18:17.000Z\",\"tags\":[\"aws\",\"iam\",\"s3\"],\"draft\":false,\"summary\":\"This tutorial will show you how to use Cyberduck to access S3.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"2 min read\",\"minutes\":1.355,\"time\":81300,\"words\":271},\"slug\":\"2017/09/15/aws-iam-s3-policy-for-cyberduck-to-allow-listing-buckets-and-access-to-one-bucket\",\"path\":\"blog/2017/09/15/aws-iam-s3-policy-for-cyberduck-to-allow-listing-buckets-and-access-to-one-bucket\",\"filePath\":\"blog/2017/09/15/aws-iam-s3-policy-for-cyberduck-to-allow-listing-buckets-and-access-to-one-bucket.mdx\",\"toc\":[{\"value\":\"Creating the IAM Policy:\",\"url\":\"#creating-the-iam-policy\",\"depth\":2},{\"value\":\"Resources:\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"AWS: IAM S3 Policy for Cyberduck to Allow Listing Buckets and Access to One Bucket\",\"datePublished\":\"2017-09-15T15:18:17.000Z\",\"dateModified\":\"2017-09-15T15:18:17.000Z\",\"description\":\"This tutorial will show you how to use Cyberduck to access S3.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2017/09/15/aws-iam-s3-policy-for-cyberduck-to-allow-listing-buckets-and-access-to-one-bucket\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Using Python for Image Analysis with Amazons Rekognition Service\",\"date\":\"2017-09-11T14:20:28.000Z\",\"tags\":[\"aws\",\"python\",\"rekognition\",\"machine-learning\"],\"draft\":false,\"summary\":\"This tutorial will demonstrate how to use AWS Rekognition Service with Python.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"2 min read\",\"minutes\":1.43,\"time\":85800,\"words\":286},\"slug\":\"2017/09/11/using-python-for-image-analysis-with-amazons-rekognition-service\",\"path\":\"blog/2017/09/11/using-python-for-image-analysis-with-amazons-rekognition-service\",\"filePath\":\"blog/2017/09/11/using-python-for-image-analysis-with-amazons-rekognition-service.mdx\",\"toc\":[{\"value\":\"Getting a Random Image:\",\"url\":\"#getting-a-random-image\",\"depth\":2}
1,{\"value\":\"Our Python Code:\",\"url\":\"#our-python-code\",\"depth\":2},{\"value\":\"Running the App:\",\"url\":\"#running-the-app\",\"depth\":2},{\"value\":\"Resources:\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Using Python for Image Analysis with Amazons Rekognition Service\",\"datePublished\":\"2017-09-11T14:20:28.000Z\",\"dateModified\":\"2017-09-11T14:20:28.000Z\",\"description\":\"This tutorial will demonstrate how to use AWS Rekognition Service with Python.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2017/09/11/using-python-for-image-analysis-with-amazons-rekognition-service\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Setup RocketChat on Docker Swarm\",\"date\":\"2017-09-10T22:45:12.000Z\",\"tags\":[\"rocketchat\",\"mongodb\",\"docker\",\"swarm\"],\"draft\":false,\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"3 min read\",\"minutes\":2.055,\"time\":123300,\"words\":411},\"slug\":\"2017/09/10/setup-rocketchat-on-docker-swarm\",\"path\":\"blog/2017/09/10/setup-rocketchat-on-docker-swarm\",\"filePath\":\"blog/2017/09/10/setup-rocketchat-on-docker-swarm.mdx\",\"toc\":[{\"value\":\"Requirements:\",\"url\":\"#requirements\",\"depth\":2},{\"value\":\"Setup Rocket Chat\",\"url\":\"#setup-rocket-chat\",\"depth\":2},{\"value\":\"View the RocketChat Service Logs\",\"url\":\"#view-the-rocketchat-service-logs\",\"depth\":2},{\"value\":\"Resources:\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Setup RocketChat on Docker Swarm\",\"datePublished\":\"2017-09-10T22:45:12.000Z\",\"dateModified\":\"2017-09-10T22:45:12.000Z\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2017/09/10/setup-rocketchat-on-docker-swarm\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"HTTPS Termination using LetsEncrypt with Traefik on Docker Swarm\",\"date\":\"2017-09-09T22:40:15.000Z\",\"tags\":[\"docker\",\"traefik\",\"letsencrypt\",\"swarm\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"2 min read\",\"minutes\":1.765,\"time\":105900,\"words\":353},\"slug\":\"2017/09/09/https-termination-using-letsencrypt-with-traefik-on-docker-swarm\",\"path\":\"blog/2017/09/09/https-termination-using-letsencrypt-with-traefik-on-docker-swarm\",\"filePath\":\"blog/2017/09/09/https-termination-using-letsencrypt-with-traefik-on-docker-swarm.mdx\",\"toc\":[{\"value\":\"Traefik Dockerfile:\",\"url\":\"#traefik-dockerfile\",\"depth\":2},{\"value\":\"traefik.toml\",\"url\":\"#traefiktoml\",\"depth\":2},{\"value\":\"Build the Image:\",\"url\":\"#build-the-image\",\"depth\":2},{\"value\":\"Traefik:\",\"url\":\"#traefik\",\"depth\":2},{\"value\":\"Java Web Application:\",\"url\":\"#java-web-application\",\"depth\":2},{\"value\":\"Resources:\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"HTTPS Termination using LetsEncrypt with Traefik on Docker Swarm\",\"datePublished\":\"2017-09-09T22:40:15.000Z\",\"dateModified\":\"2017-09-09T22:40:15.000Z\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2017/09/09/https-termination-using-letsencrypt-with-traefik-on-docker-swarm\",\"author\":[{\"@type\":\"Person\",\"name\":\"$undefined\"}]}},{\"title\":\"Run Kibana on Docker Swarm with Traefik\",\"date\":\"2017-09-09T22:33:12.000Z\",\"tags\":[\"docker\",\"swarm\",\"kibana\",\"traefik\"],\"draft\":false,\"summary\":\"This tutorial will demonstrate how to run Kibana on Docker Swarm, backed by a Traefik Proxy.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"2 min read\",\"minutes\":1.055,\"time\":63300,\"words\":211},\"slug\":\"2017/09/09/run-kibana-on-docker-swarm-with-traefik\",\"path\":\"blog/2017/09/09/run-kibana-on-docker-swarm-with-traefik\",\"filePath\":\"blog/2017/09/09/run-kibana-on-docker-swarm-with-traefik.mdx\",\"toc\":[{\"value\":\"Create the Overlay Network:\",\"url\":\"#create-the-overlay-network\",\"depth\":2},{\"value\":\"Create the Traefik Service:\",\"url\":\"#create-the-traefik-service\",\"depth\":2},{\"value\":\"Set DNS:\",\"url\":\"#set-dns\",\"depth\":2},{\"value\":\"Create Kibana:\",\"url\":\"#create-kibana\",\"depth\":2},{\"value\":\"Access Kibana:\",\"url\":\"#access-kibana\",\"depth\":2},{\"value\":\"Resources:\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Run Kibana on Docker Swarm with Traefik\",\"datePublished\":\"2017-09-09T22:33:12.000Z\",\"dateModified\":\"2017-09-09T22:33:12.000Z\",\"description\":\"This tutorial will demonstrate how to run Kibana on Docker Swarm, backed by a Traefik Proxy.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2017/09/09/run-kibana-on-docker-swarm-with-traefik\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Using Python to Write Data to a MySQL Database\",\"date\":\"2017-09-09T20:39:59.000Z\",\"tags\":[\"python\",\"mysql\"],\"draft\":false,\"summary\":\"This tutorial will demonstrate how to use the P
1ython programming language to write data to a MySQL database.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"4 min read\",\"minutes\":3.08,\"time\":184800,\"words\":616},\"slug\":\"2017/09/09/using-python-to-write-data-to-a-mysql-database\",\"path\":\"blog/2017/09/09/using-python-to-write-data-to-a-mysql-database\",\"filePath\":\"blog/2017/09/09/using-python-to-write-data-to-a-mysql-database.mdx\",\"toc\":[{\"value\":\"Create The Database:\",\"url\":\"#create-the-database\",\"depth\":2},{\"value\":\"Python Code to Write to MySQL\",\"url\":\"#python-code-to-write-to-mysql\",\"depth\":2},{\"value\":\"Reading the Data from MySQLL\",\"url\":\"#reading-the-data-from-mysqll\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Using Python to Write Data to a MySQL Database\",\"datePublished\":\"2017-09-09T20:39:59.000Z\",\"dateModified\":\"2017-09-09T20:39:59.000Z\",\"description\":\"This tutorial will demonstrate how to use the Python programming language to write data to a MySQL database.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2017/09/09/using-python-to-write-data-to-a-mysql-database\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Using Python to Read Data from a MySQL Database\",\"date\":\"2017-09-09T19:23:05.000Z\",\"tags\":[\"python\",\"mysql\",\"pandas\",\"plotly\"],\"draft\":false,\"summary\":\"This tutorial will demonstrate how to use the Python programming language to read data from a MySQL database.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"2 min read\",\"minutes\":1.795,\"time\":107700,\"words\":359},\"slug\":\"2017/09/09/using-python-to-read-data-from-a-mysql-database\",\"path\":\"blog/2017/09/09/using-python-to-read-data-from-a-mysql-database\",\"filePath\":\"blog/2017/09/09/using-python-to-read-data-from-a-mysql-database.mdx\",\"toc\":[{\"value\":\"Install Dependencies:\",\"url\":\"#install-dependencies\",\"depth\":2},{\"value\":\"Download Some Sample Data:\",\"url\":\"#download-some-sample-data\",\"depth\":2},{\"value\":\"Create Database:\",\"url\":\"#create-database\",\"depth\":2},{\"value\":\"Import Data:\",\"url\":\"#import-data\",\"depth\":2},{\"value\":\"Create the MySQL Credentials File:\",\"url\":\"#create-the-mysql-credentials-file\",\"depth\":2},{\"value\":\"Run Queries from Python:\",\"url\":\"#run-queries-from-python\",\"depth\":2},{\"value\":\"Graphing Results to Plotly:\",\"url\":\"#graphing-results-to-plotly\",\"depth\":2},{\"value\":\"Resources:\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Using Python to Read Data from a MySQL Database\",\"datePublished\":\"2017-09-09T19:23:05.000Z\",\"dateModified\":\"2017-09-09T19:23:05.000Z\",\"description\":\"This tutorial will demonstrate how to use the Python programming language to read data from a MySQL database.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2017/09/09/using-python-to-read-data-from-a-mysql-database\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Using Minios Python SDK to interact with a Minio S3 Bucket\",\"date\":\"2017-09-08T20:15:52.000Z\",\"tags\":[\"minio\",\"s3\",\"python\"],\"draft\":false,\"summary\":\"This tutorial will demonstrate how to use Python to interact with Minio.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"2 min read\",\"minutes\":1.765,\"time\":105900,\"words\":353},\"slug\":\"2017/09/08/using-minios-python-sdk-to-interact-with-a-minio-s3-bucket\",\"path\":\"blog/2017/09/08/using-minios-python-sdk-to-interact-with-a-minio-s3-bucket\",\"filePath\":\"blog/2017/09/08/using-minios-python-sdk-to-interact-with-a-minio-s3-bucket.mdx\",\"toc\":[{\"value\":\"Installing the Minio Python Library:\",\"url\":\"#installing-the-minio-python-library\",\"depth\":2},{\"value\":\"Create a Bucket:\",\"url\":\"#create-a-bucket\",\"depth\":2},{\"value\":\"List Buckets:\",\"url\":\"#list-buckets\",\"depth\":2},{\"value\":\"Put Objects to your Bucket:\",\"url\":\"#put-objects-to-your-bucket\",\"depth\":2}
1,{\"value\":\"List Objects in your Bucket:\",\"url\":\"#list-objects-in-your-bucket\",\"depth\":2},{\"value\":\"Remove Objects from your Bucket:\",\"url\":\"#remove-objects-from-your-bucket\",\"depth\":2},{\"value\":\"Remove the Bucket:\",\"url\":\"#remove-the-bucket\",\"depth\":2},{\"value\":\"Resources:\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Using Minios Python SDK to interact with a Minio S3 Bucket\",\"datePublished\":\"2017-09-08T20:15:52.000Z\",\"dateModified\":\"2017-09-08T20:15:52.000Z\",\"description\":\"This tutorial will demonstrate how to use Python to interact with Minio.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2017/09/08/using-minios-python-sdk-to-interact-with-a-minio-s3-bucket\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Run your Self-Hosted S3 Service with Minio on Docker Swarm\",\"date\":\"2017-09-08T19:29:29.000Z\",\"tags\":[\"docker\",\"swarm\",\"minio\"],\"draft\":false,\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"3 min read\",\"minutes\":2.495,\"time\":149700,\"words\":499},\"slug\":\"2017/09/08/run-your-self-hosted-s3-service-with-minio-on-docker-swarm\",\"path\":\"blog/2017/09/08/run-your-self-hosted-s3-service-with-minio-on-docker-swarm\",\"filePath\":\"blog/2017/09/08/run-your-self-hosted-s3-service-with-minio-on-docker-swarm.mdx\",\"toc\":[{\"value\":\"Prepare the Data Directory:\",\"url\":\"#prepare-the-data-directory\",\"depth\":2},{\"value\":\"Create the Service:\",\"url\":\"#create-the-service\",\"depth\":2},{\"value\":\"Install the AWS CLI Tools:\",\"url\":\"#install-the-aws-cli-tools\",\"depth\":2},{\"value\":\"Configure the Client:\",\"url\":\"#configure-the-client\",\"depth\":2},{\"value\":\"Create the Bucket:\",\"url\":\"#create-the-bucket\",\"depth\":2},{\"value\":\"List Buckets:\",\"url\":\"#list-buckets\",\"depth\":2},{\"value\":\"Upload an Object to your Bucket:\",\"url\":\"#upload-an-object-to-your-bucket\",\"depth\":2},{\"value\":\"List Bucket:\",\"url\":\"#list-bucket\",\"depth\":2},{\"value\":\"Download Object:\",\"url\":\"#download-object\",\"depth\":2},{\"value\":\"Web Access:\",\"url\":\"#web-access\",\"depth\":2},{\"value\":\"Resources:\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Run your Self-Hosted S3 Service with Minio on Docker Swarm\",\"datePublished\":\"2017-09-08T19:29:29.000Z\",\"dateModified\":\"2017-09-08T19:29:29.000Z\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2017/09/08/run-your-self-hosted-s3-service-with-minio-on-docker-swarm\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"How to create a Local Docker Swarm Cluster with Docker in Docker on your Workstation\",\"date\":\"2017-09-07T08:03:37.000Z\",\"tags\":[\"docker\",\"swarm\",\"containers\"],\"draft\":false,\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"2 min read\",\"minutes\":1.475,\"time\":88500,\"words\":295},\"slug\":\"2017/09/07/how-to-create-a-local-docker-swarm-cluster-with-docker-in-docker-on-your-workstation\",\"path\":\"blog/2017/09/07/how-to-create-a-local-docker-swarm-cluster-with-docker-in-docker-on-your-workstation\",\"filePath\":\"blog/2017/09/07/how-to-create-a-local-docker-swarm-cluster-with-docker-in-docker-on-your-workstation.mdx\",\"toc\":[{\"value\":\"Project Resources:\",\"url\":\"#project-resources\",\"depth\":2},{\"value\":\"Create The Nodes:\",\"url\":\"#create-the-nodes\",\"depth\":2},{\"value\":\"Initialize the Swarm:\",\"url\":\"#initialize-the-swarm\",\"depth\":2},{\"value\":\"List the Nodes:\",\"url\":\"#list-the-nodes\",\"depth\":2},{\"value\":\"Traefik:\",\"url\":\"#traefik\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"How to create a Local Docker Swarm Cluster with Docker in Docker on your Workstation\",\"datePublished\":\"2017-09-07T08:03
1:37.000Z\",\"dateModified\":\"2017-09-07T08:03:37.000Z\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2017/09/07/how-to-create-a-local-docker-swarm-cluster-with-docker-in-docker-on-your-workstation\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Getting Started with Chef: Creating a Website with Apache\",\"date\":\"2017-09-04T18:21:20.000Z\",\"tags\":[\"chef\",\"devops\",\"ruby\"],\"draft\":false,\"summary\":\"This tutorial will demonstrate how to get started with Chef and how we will use Chef to deploy a website on Apache Webserver.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"4 min read\",\"minutes\":3.16,\"time\":189600,\"words\":632},\"slug\":\"2017/09/04/getting-started-with-chef-creating-a-website-with-apache\",\"path\":\"blog/2017/09/04/getting-started-with-chef-creating-a-website-with-apache\",\"filePath\":\"blog/2017/09/04/getting-started-with-chef-creating-a-website-with-apache.mdx\",\"toc\":[{\"value\":\"Creating a Web Server:\",\"url\":\"#creating-a-web-server\",\"depth\":2},{\"value\":\"Running our Chef Client against our Recipe:\",\"url\":\"#running-our-chef-client-against-our-recipe\",\"depth\":2},{\"value\":\"Testing our Website:\",\"url\":\"#testing-our-website\",\"depth\":2},{\"value\":\"Resources:\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Getting Started with Chef: Creating a Website with Apache\",\"datePublished\":\"2017-09-04T18:21:20.000Z\",\"dateModified\":\"2017-09-04T18:21:20.000Z\",\"description\":\"This tutorial will demonstrate how to get started with Chef and how we will use Chef to deploy a website on Apache Webserver.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2017/09/04/getting-started-with-chef-creating-a-website-with-apache\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Getting Started with Chef: Working with Files\",\"date\":\"2017-09-04T18:06:01.000Z\",\"tags\":[\"chef\",\"devops\",\"ruby\"],\"draft\":false,\"summary\":\"This tutorial will demonstrate how to get started with Chef and specifically how we will be working with files.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"3 min read\",\"minutes\":2.575,\"time\":154500,\"words\":515},\"slug\":\"2017/09/04/getting-started-with-chef-working-with-files\",\"path\":\"blog/2017/09/04/getting-started-with-chef-working-with-files\",\"filePath\":\"blog/2017/09/04/getting-started-with-chef-working-with-files.mdx\",\"toc\":[{\"value\":\"Getting Started with Chef: Installation:\",\"url\":\"#getting-started-with-chef-installation\",\"depth\":2},{\"value\":\"Configure a Resource:\",\"url\":\"#configure-a-resource\",\"depth\":2},{\"value\":\"Resources:\",\"url\":\"#resources\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Getting Started with Chef: Working with Files\",\"datePublished\":\"2017-09-04T18:06:01.000Z\",\"dateModified\":\"2017-09-04T18:06:01.000Z\",\"description\":\"This tutorial will demonstrate how to get started with Chef and specifically how we will be working with files.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2017/09/04/getting-started-with-chef-working-with-files\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Splitting Characters with Python to determine Name Surname and Email Address\",\"date\":\"2017-09-04T13:22:42.000Z\",\"tags\":[\"python\"],\"draft\":false,\"summary\":\"This programming tutorial will demonstrate how to split characters with Python.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"2 min read\",\"minutes\":1.28,\"time\":76800,\"words\":256},\"slug\":\"2017/09/04/splitting-characters-with-python-to-determine-name-surname-and-email-address\",\"path\":\"blog/2017/09/04/splitting-characters-with-python-to-determine-name-surname-and-email-address\",\"filePath\":\"blog/2017/09/04/splitting-characters-with-python-to-determine-name-surname-and-email-address.mdx\",\"toc\":[{\"value\":\"Using Split in Python\",\"url\":\"#using-split-in-python\",\"depth\":2},{\"value\":\"Print The Values in Question:\",\"url\":\"#print-the-values-in-question\",\"depth\":2},{\"value\":\"Update: Capitalize from One String\",\"url\":\"#update-capitalize-from-one-string\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Splitting Characters with Python to determine Name Surname and Email Address\",\"datePublished\":\"2017-09-04T13:22:42.000Z\",\"dateModified\":\"2017-09-04T13:22:42.000Z\",\"description\":\"This programming tutorial will demonstrate how to split characters with Python.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2017/09/04/splitting-characters-with-python-to-determine-name-surname-and-email-address\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Setup a 3 Node MongoDB Replica Set on Ubuntu 16\",\"date\":\"2017-09-02T23:29:10.000Z\",\"tags\":[\"mongodb\",\"databases\"],\"draft\":false,\"summary\":\"This tutorial will demonstrate how to setup a 3 node MongoDB replica set on Ubuntu Linux.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"4 min read\",\"minutes\":3.36,\"time\":201600,\"words\":672},\"slug\":\"2017/09/02/setup-a-3-node-mongodb-replica-set-on-ubuntu-16\",\"path\":\"blog/2017/09/02/setup-a-3-node-mongodb-replica-set-on-ubuntu-16\",\"filePath\":\"blog/2017/09/02/setup-a-3-node-mongodb-replica-set-on-ubuntu-16.mdx\",\"toc\":[{\"value\":\"Resources:\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Installing MongoDB on our 3 Nodes:\",\"url\":\"#installing-mongodb-on-our-3-nodes\",\"depth\":2},{\"value\":\"Setup MongoDB Replica Sets:\",\"url\":\"#setup-mongodb-replica-sets\",\"depth\":2},{\"value\":\"Setup Auth:\",\"url\":\"#setup-auth\",\"depth\":2},{\"value\":\"Connect and Authenticate against MongoDB:\",\"url\":\"#connect-and-authenticate-against-mongodb\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Setup a 3 Node MongoDB Replica Set on Ubuntu 16\",\"datePublished\":\"2017-09-02T23:29:10.000Z\",\"dateModified\":\"2017-09-02T23:29:10.000Z\",\"description\":\"This tutorial will demonstrate how to setup a 3 node MongoDB replica set on Ubuntu Linux.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2017/09/02/setup-a-3-node-mongodb-replica-set-on-ubuntu-16\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Setup HAProxy Load Balancer for MySQL Galera with IP Whitelisting and Backup Servers\",\"date\":\"2017-08-31T23:15:50.000Z\",\"tags\":[\"mysql\",\"haproxy\",\"loadbalancer\",\"security\"],\"draft\":false,\"summary\":\"This post will show you how to setup haproxy load balancer for mysql galera and how to implement ip whitelisting.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"3 min read\",\"minutes\":2.635,\"time\":158100,\"words\":527}
1,\"slug\":\"2017/08/31/setup-haproxy-load-balancer-for-mysql-galera-with-ip-whitelisting-and-backup-servers\",\"path\":\"blog/2017/08/31/setup-haproxy-load-balancer-for-mysql-galera-with-ip-whitelisting-and-backup-servers\",\"filePath\":\"blog/2017/08/31/setup-haproxy-load-balancer-for-mysql-galera-with-ip-whitelisting-and-backup-servers.mdx\",\"toc\":[{\"value\":\"Our Setup:\",\"url\":\"#our-setup\",\"depth\":2},{\"value\":\"Security:\",\"url\":\"#security\",\"depth\":2},{\"value\":\"HAProxy:\",\"url\":\"#haproxy\",\"depth\":2},{\"value\":\"Authorize HAProxy Hostnames to Connect to MySQL:\",\"url\":\"#authorize-haproxy-hostnames-to-connect-to-mysql\",\"depth\":2},{\"value\":\"Resources:\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Setup HAProxy Load Balancer for MySQL Galera with IP Whitelisting and Backup Servers\",\"datePublished\":\"2017-08-31T23:15:50.000Z\",\"dateModified\":\"2017-08-31T23:15:50.000Z\",\"description\":\"This post will show you how to setup haproxy load balancer for mysql galera and how to implement ip whitelisting.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2017/08/31/setup-haproxy-load-balancer-for-mysql-galera-with-ip-whitelisting-and-backup-servers\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Secure your Access to Kibana 5 and Elasticsearch 5 with Nginx for AWS\",\"date\":\"2017-08-31T14:40:09.000Z\",\"tags\":[\"aws\",\"nginx\",\"elasticsearch\",\"kibana\",\"security\"],\"draft\":false,\"summary\":\"This post shows you how to secure access to kibana and elasticsearch with nginx on AWS.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"3 min read\",\"minutes\":2.845,\"time\":170700,\"words\":569},\"slug\":\"2017/08/31/secure-your-access-to-kibana-5-and-elasticsearch-5-with-nginx-for-aws\",\"path\":\"blog/2017/08/31/secure-your-access-to-kibana-5-and-elasticsearch-5-with-nginx-for-aws\",\"filePath\":\"blog/2017/08/31/secure-your-access-to-kibana-5-and-elasticsearch-5-with-nginx-for-aws.mdx\",\"toc\":[{\"value\":\"Our Setup:\",\"url\":\"#our-setup\",\"depth\":2},{\"value\":\"Install Nginx\",\"url\":\"#install-nginx\",\"depth\":2},{\"value\":\"Configure Nginx:\",\"url\":\"#configure-nginx\",\"depth\":2},{\"value\":\"Setup Authentication:\",\"url\":\"#setup-authentication\",\"depth\":2},{\"value\":\"Restart Nginx and Enable on Startup\",\"url\":\"#restart-nginx-and-enable-on-startup\",\"depth\":2},{\"value\":\"Configure ELB:\",\"url\":\"#configure-elb\",\"depth\":2},{\"value\":\"End Result\",\"url\":\"#end-result\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Secure your Access to Kibana 5 and Elasticsearch 5 with Nginx for AWS\",\"datePublished\":\"2017-08-31T14:40:09.000Z\",\"dateModified\":\"2017-08-31T14:40:09.000Z\",\"description\":\"This post shows you how to secure access to kibana and elasticsearch with nginx on AWS.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2017/08/31/secure-your-access-to-kibana-5-and-elasticsearch-5-with-nginx-for-aws\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Reference Credentials Outside Your Main Application in Python\",\"date\":\"2017-08-31T07:00:58.000Z\",\"tags\":[\"python\",\"security\",\"programming\"],\"draft\":false,\"summary\":\"This tutorial shows you how to reference your credentials outside your main application in python.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"1 min read\",\"minutes\":0.84,\"time\":50400,\"words\":168},\"slug\":\"2017/08/31/reference-credentials-outside-your-main-application-in-python\",\"path\":\"blog/2017/08/31/reference-credentials-outside-your-main-application-in-python\",\"filePath\":\"blog/2017/08/31/reference-credentials-outside-your-main-application-in-python.mdx\",\"toc\":[{\"value\":\"Our Main Application\",\"url\":\"#our-main-application\",\"depth\":2},{\"value\":\"Our Credentials File\",\"url\":\"#our-credentials-file\",\"depth\":2},{\"value\":\"References:\",\"url\":\"#references\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Reference Credentials Outside Your Main Application in Python\",\"datePublished\":\"2017-08-31T07:00:58.000Z\",\"dateModified\":\"2017-08-31T07:00:58.000Z\",\"description\":\"This tutorial shows you how to reference your credentials outside your main application in python.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2017/08/31/reference-credentials-outside-your-main-application-in-python\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Change IAM Username with AWS CLI\",\"date\":\"2017-08-28T22:27:21.000Z\",\"tags\":[\"aws\",\"iam\",\"awscli\"],\"draft\":false,\"summary\":\"This tutorial will show you how to change your IAM username with the awscli.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"3 min read\",\"minutes\":2.58,\"time\":154800,\"words\":516},\"slug\":\"2017/08/28/change-iam-username-with-aws-cli\",\"path\":\"blog/2017/08/28/change-iam-username-with-aws-cli\",\"filePath\":\"blog/2017/08/28/change-iam-username-with-aws-cli.mdx\",\"toc\":[{\"value\":\"Details of our User:\",\"url\":\"#details-of-our-user\",\"depth\":2},{\"value\":\"Rename the IAM User\",\"url\":\"#rename-the-iam-user\",\"depth\":2},{\"value\":\"Some Useful CLI Commands:\",\"url\":\"#some-useful-cli-commands\",\"depth\":2},{\"value\":\"Determine when the AccessKey was last used, and for which Service:\",\"url\":\"#determine-when-the-accesskey-was-last-used-and-for-which-service\",\"depth\":2},{\"value\":\"Resources:\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Change IAM Username with AWS CLI\",\"datePublished\":\"2017-08-28T22:27:21.000Z\",\"dateModified\":\"2017-08-28T22:27:21.000Z\",\"description\":\"This tutorial will show you how to change your IAM username with the awscli.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2017/08/28/change-iam-username-with-aws-cli\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Using the Python API for MongoDB using PyMongo\",\"date\":\"2017-08-27T20:19:48.000Z\",\"tags\":[\"mongodb\",\"python\",\"databases\"],\"draft\":false,\"summary\":\"This tutorial shows you how to use Python to interact with MongoDB using the PyMongo package.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"4 min read\",\"minutes\":3.5,\"time\":210000,\"words\":700},\"slug\":\"2017/08/27/using-the-python-api-for-mongodb-using-pymongo\",\"path\":\"blog/2017/08/27/using-the-python-api-for-mongodb-using-pymongo\",\"filePath\":\"blog/2017/08/27/using-the-python-api-for-mongodb-using-pymongo.mdx\",\"toc\":[{\"value\":\"Requirements:\",\"url\":\"#requirements\",\"depth\":2},{\"value\":\"Connecting to MongoDB:\",\"url\":\"#connecting-to-mongodb\",\"depth\":2},{\"value\":\"Create a Database, Collection and Write a Document into your Database:\",\"url\":\"#create-a-database-collection-and-write-a-document-into-your-
1database\",\"depth\":2},{\"value\":\"Query Data from MongoDB:\",\"url\":\"#query-data-from-mongodb\",\"depth\":2},{\"value\":\"Connecting to an existing Database:\",\"url\":\"#connecting-to-an-existing-database\",\"depth\":2},{\"value\":\"Deleting Databases:\",\"url\":\"#deleting-databases\",\"depth\":2},{\"value\":\"Resources:\",\"url\":\"#resources\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Using the Python API for MongoDB using PyMongo\",\"datePublished\":\"2017-08-27T20:19:48.000Z\",\"dateModified\":\"2017-08-27T20:19:48.000Z\",\"description\":\"This tutorial shows you how to use Python to interact with MongoDB using the PyMongo package.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2017/08/27/using-the-python-api-for-mongodb-using-pymongo\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Setup a Local MongoDB Development 3 Member Replica Set\",\"date\":\"2017-08-27T05:10:16.000Z\",\"tags\":[\"mongodb\",\"databases\"],\"draft\":false,\"summary\":\"This tutorial will show you how to setup a local mongodb deployment using 3 member replica set.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"5 min read\",\"minutes\":4.785,\"time\":287100,\"words\":957},\"slug\":\"2017/08/27/setup-a-local-mongodb-development-3-member-replica-set\",\"path\":\"blog/2017/08/27/setup-a-local-mongodb-development-3-member-replica-set\",\"filePath\":\"blog/2017/08/27/setup-a-local-mongodb-development-3-member-replica-set.mdx\",\"toc\":[{\"value\":\"Resources:\",\"url\":\"#resources\",\"depth\":2},{\"value\":\"Installation:\",\"url\":\"#installation\",\"depth\":2},{\"value\":\"Prepare Directories:\",\"url\":\"#prepare-directories\",\"depth\":2},{\"value\":\"Run 3 MongoDB Instances:\",\"url\":\"#run-3-mongodb-instances\",\"depth\":2},{\"value\":\"Cofirm:\",\"url\":\"#cofirm\",\"depth\":2},{\"value\":\"Connect to the first MongoDB Instnace:\",\"url\":\"#connect-to-the-first-mongodb-instnace\",\"depth\":2},{\"value\":\"Write some Data to MongoDB:\",\"url\":\"#write-some-data-to-mongodb\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Setup a Local MongoDB Development 3 Member Replica Set\",\"datePublished\":\"2017-08-27T05:10:16.000Z\",\"dateModified\":\"2017-08-27T05:10:16.000Z\",\"description\":\"This tutorial will show you how to setup a local mongodb deployment using 3 member replica set.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2017/08/27/setup-a-local-mongodb-development-3-member-replica-set\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Building a Alpine Nginx PHP-Fpm Image on Docker for PHP Applications\",\"date\":\"2017-08-27T00:41:16.000Z\",\"tags\":[\"docker\",\"php\",\"nginx\"],\"draft\":false,\"summary\":\"In this post I will be using docker, nginx and php-fpm to run php web applications in docker.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"5 min read\",\"minutes\":4.755,\"time\":285300,\"words\":951},\"slug\":\"2017/08/26/building-a-alpine-nginx-php-fpm-image-on-docker-for-php-applications\",\"path\":\"blog/2017/08/26/building-a-alpine-nginx-php-fpm-image-on-docker-for-php-applications\",\"filePath\":\"blog/2017/08/26/building-a-alpine-nginx-php-fpm-image-on-docker-for-php-applications.mdx\",\"toc\":[{\"value\":\"One of the Requirements:\",\"url\":\"#one-of-the-requirements\",\"depth\":2},{\"value\":\"Our Directory Structure:\",\"url\":\"#our-directory-structure\",\"depth\":2},{\"value\":\"Going into Some Detail:\",\"url\":\"#going-into-some-detail\",\"depth\":2},{\"value\":\"Building the Image:\",\"url\":\"#building-the-image\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Building a Alpine Nginx PHP-Fpm Image on Docker for PHP Applications\",\"datePublished\":\"2017-08-27T00:41:16.000Z\",\"dateModified\":\"2017-08-27T00:41:16.000Z\",\"description\":\"In this post I will be using docker, nginx and php-fpm to run php web applications in docker.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2017/08/26/building-a-alpine-nginx-php-fpm-image-on-docker-for-php-applications\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Create a Lightweight Webserver (Service) with Lighttpd on Alpine running on Docker Swarm\",\"date\":\"2017-08-26T15:37:19.000Z\",\"tags\":[\"docker\"],\"draft\":false,\"summary\":\"This tutorial will show you how to create a lightweight web service on docker swarm using lighttpd and html.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"3 min read\",\"minutes\":2.055,\"time\":123300,\"words\":411},\"slug\":\"2017/08/26/create-a-lightweight-webserver-service-with-lighttpd-on-alpine-running-on-docker-swarm\",\"path\":\"blog/2017/08/26/create-a-lightweight-webserver-service-with-lighttpd-on-alpine-running-on-docker-swarm\",\"filePath\":\"blog/2017/08/26/create-a-lightweight-webserver-service-with-lighttpd-on-alpine-running-on-docker-swarm.mdx\",\"toc\":[{\"value\":\"The Directory Structure:\",\"url\":\"#the-directory-structure\",\"depth\":2},{\"value\":\"Creating the Service:\",\"url\":\"#creating-the-service\",\"depth\":2},{\"value\":\"Accessing your Website:\",\"url\":\"#accessing-your-website\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Create a Lightweight Webserver (Service) with Lighttpd on Alpine running on Docker Swarm\",\"datePublished\":\"2017-08-26T15:37:19.000Z\",\"dateModified\":\"2017-08-26T15:37:19.000Z\",\"description\":\"This tutorial will show you how to create a lightweight web service on docker swarm using lighttpd and html.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2017/08/26/create-a-lightweight-webserver-service-with-lighttpd-on-alpine-running-on-docker-swarm\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Structured Search with Elasticsearch\",\"date\":\"2017-08-26T03:42:19.000Z\",\"tags\":[\"elasticsearch\"],\"draft\":false,\"summary\":\"This tutorial will show you how to ingest and search for data on Elasticsearch using a structured search.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"9 min read\",\"minutes\":8.46,\"time\":507600,\"words\":1692},\"slug\":\"2017/08/25/structured-search-with-elasticsearch\",\"path\":\"blog/2017/08/25/structured-search-with-elasticsearch\",\"filePath\":\"blog/2017/08/25/structured-search-with-elasticsearch.mdx\",\"toc\":[{\"value\":\"Create the Mapping for our Index:\",\"url\":\"#create-the-mapping-for-our-index\",\"depth\":2},{\"value\":\"Ingesting the Data into Elasticsearch:\",\"url\":\"#ingesting-the-data-into-elasticsearch\",\"depth\":2},{\"value\":\"Query Student Names:\",\"url\":\"#query-student-names\",\"depth\":2},{\"value\":\"Search Student Ages:\",\"url\":\"#search-student-ages\",\"depth\":2},{\"value\":\"Query, Include but also Exclude:\",\"url\":\"#query-include-but-also-exclude\",\"depth\":2},{\"value\":\"Query for Age, Gender with High Grades:\",\"url\":\"#query-for-age-gender-with-high-grades\",\"depth\":2},{\"value\":\"Everyone that got 70 and more:\",\"url\":\"#everyone-that-got-70-and-more\",\"depth\":2},{\"value\":\"Query Range only with gt:\",\"url\":\"#query-range-only-with-gt\",\"depth\":2},{\"value\":\"Gender Specific, with Grades more than 70:\",\"url\":\"#gender-specific-with-grades-more-than-70\",\"depth\":2},{\"value\":\"Grade Specific:\",\"url\":\"#grade-specific\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Structured Search with Elasticsearch\",\"datePublished\":\"2017-08-26T03:42:19.000Z\",\"dateModified\":\"2017-08-26T03:42:19.000Z\",\"description\":\"This tutorial will show you how to ingest and search for data on Elasticsearch using a structured search.\",\"
1image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2017/08/25/structured-search-with-elasticsearch\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Modern Reverse Proxy with Traefik on Docker Swarm\",\"date\":\"2017-08-24T23:00:33.000Z\",\"tags\":[\"docker\",\"traefik\"],\"draft\":false,\"summary\":\"This tutorial will show you how to setup a traefik reverse proxy on docker swarm.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"3 min read\",\"minutes\":2.515,\"time\":150900,\"words\":503},\"slug\":\"2017/08/24/modern-reverse-proxy-with-traefik-on-docker-swarm\",\"path\":\"blog/2017/08/24/modern-reverse-proxy-with-traefik-on-docker-swarm\",\"filePath\":\"blog/2017/08/24/modern-reverse-proxy-with-traefik-on-docker-swarm.mdx\",\"toc\":[{\"value\":\"Pre-Requisites:\",\"url\":\"#pre-requisites\",\"depth\":2},{\"value\":\"Static Website with Traefik:\",\"url\":\"#static-website-with-traefik\",\"depth\":2},{\"value\":\"Build a WebService with 2 Endpoints:\",\"url\":\"#build-a-webservice-with-2-endpoints\",\"depth\":2},{\"value\":\"Create the 1st Service, No Hostname or Path based specified:\",\"url\":\"#create-the-1st-service-no-hostname-or-path-based-specified\",\"depth\":2},{\"value\":\"Create the 2nd Service, Only 1 Path Based Routing:\",\"url\":\"#create-the-2nd-service-only-1-path-based-routing\",\"depth\":2},{\"value\":\"Hostname Based and Path Based Routing:\",\"url\":\"#hostname-based-and-path-based-routing\",\"depth\":2},{\"value\":\"Strictly Hostname Based Routing and not specifying any paths:\",\"url\":\"#strictly-hostname-based-routing-and-not-specifying-any-paths\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Modern Reverse Proxy with Traefik on Docker Swarm\",\"datePublished\":\"2017-08-24T23:00:33.000Z\",\"dateModified\":\"2017-08-24T23:00:33.000Z\",\"description\":\"This tutorial will show you how to setup a traefik reverse proxy on docker swarm.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2017/08/24/modern-reverse-proxy-with-traefik-on-docker-swarm\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Create a ZFS Raidz1 Volume Pool on Ubuntu 16\",\"date\":\"2017-08-24T13:16:34.000Z\",\"tags\":[\"zfs\",\"storage\"],\"draft\":false,\"summary\":\"This tutorial will show you how to create a ZFS Raidz1 pool.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"2 min read\",\"minutes\":1.185,\"time\":71100,\"words\":237},\"slug\":\"2017/08/24/create-a-zfs-raidz1-volume-pool-on-ubuntu-16\",\"path\":\"blog/2017/08/24/create-a-zfs-raidz1-volume-pool-on-ubuntu-16\",\"filePath\":\"blog/2017/08/24/create-a-zfs-raidz1-volume-pool-on-ubuntu-16.mdx\",\"toc\":[{\"value\":\"Installation\",\"url\":\"#installation\",\"depth\":2},{\"value\":\"Creating the ZFS Storage Pool\",\"url\":\"#creating-the-zfs-storage-pool\",\"depth\":2},{\"value\":\"Listing Pools\",\"url\":\"#listing-pools\",\"depth\":2},{\"value\":\"Mounting the Volume:\",\"url\":\"#mounting-the-volume\",\"depth\":2},{\"value\":\"Resources:\",\"url\":\"#resources\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Create a ZFS Raidz1 Volume Pool on Ubuntu 16\",\"datePublished\":\"2017-08-24T13:16:34.000Z\",\"dateModified\":\"2017-08-24T13:16:34.000Z\",\"description\":\"This tutorial will show you how to create a ZFS Raidz1 pool.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2017/08/24/create-a-zfs-raidz1-volume-pool-on-ubuntu-16\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Setup MongoDB Client on CentOS 6\",\"date\":\"2017-08-24T12:58:10.000Z\",\"tags\":[\"mongodb\",\"linux\"],\"draft\":false,\"summary\":\"This post demonstrates how to setup the mongodb client on a linux centos server.\",\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"1 min read\",\"minutes\":0.57,\"time\":34200,\"words\":114},\"slug\":\"2017/08/24/setup-mongodb-client-on-centos-6\",\"path\":\"blog/2017/08/24/setup-mongodb-client-on-centos-6\",\"filePath\":\"blog/2017/08/24/setup-mongodb-client-on-centos-6.mdx\",\"toc\":[{\"value\":\"Setup the Repositories\",\"url\":\"#setup-the-repositories\",\"depth\":2},{\"value\":\"Install MongoDB-Shell\",\"url\":\"#install-mongodb-shell\",\"depth\":2},{\"value\":\"Connect to your Remote MongoDB Instance:\",\"url\":\"#connect-to-your-remote-mongodb-instance\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Setup MongoDB Client on CentOS 6\",\"datePublished\":\"2017-08-24T12:58:10.000Z\",\"dateModified\":\"2017-08-24T12:58:10.000Z\",\"description\":\"This post demonstrates how to setup the mongodb client on a linux centos server.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2017/08/24/setup-mongodb-client-on-centos-6\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}}],\"initialDisplayPosts\":[{\"title\":\"How to use Ollama with Claude Code\",\"date\":\"2026-05-08T21:48:29.000Z\",\"tags\":[\"ai\",\"claude\",\"ollama\",\"claude-code\"],\"draft\":false,\"summary\":\"This tutorial shows you how to use Ollama Local Models with Claude Code.\",\"images\":[\"/static/images/ruan-dev-default-image.png\"],\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"3 min read\",\"minutes\":2.13,\"time\":127800,\"words\":426}
1,\"slug\":\"2026/05/08/how-to-use-ollama-with-claude-code\",\"path\":\"blog/2026/05/08/how-to-use-ollama-with-claude-code\",\"filePath\":\"blog/2026/05/08/how-to-use-ollama-with-claude-code.mdx\",\"toc\":[{\"value\":\"Ollama\",\"url\":\"#ollama\",\"depth\":2},{\"value\":\"Claude Code\",\"url\":\"#claude-code\",\"depth\":2},{\"value\":\"Testing Claude Code\",\"url\":\"#testing-claude-code\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"How to use Ollama with Claude Code\",\"datePublished\":\"2026-05-08T21:48:29.000Z\",\"dateModified\":\"2026-05-08T21:48:29.000Z\",\"description\":\"This tutorial shows you how to use Ollama Local Models with Claude Code.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2026/05/08/how-to-use-ollama-with-claude-code\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Level Up your Code Quality with SonarQube - a Beginners Guide\",\"date\":\"2025-06-06T11:09:46.000Z\",\"tags\":[\"qa\",\"quality\",\"sonarqube\",\"python\"],\"draft\":false,\"summary\":\"Learn what SonarQube is and how it helps improve code quality by detecting bugs, security issues, and code smells before they reach production. In this beginner-friendly guide, we’ll walk through a simple Python example, explore common code smells, and show you how to run SonarQube locally using Docker Compose. Perfect for junior developers, students, and QA engineers looking to improve their code review process and CI pipeline.\",\"images\":[\"/static/images/ruan-dev-default-image.png\"],\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"10 min read\",\"minutes\":9.12,\"time\":547200,\"words\":1824},\"slug\":\"2025/06/06/level-up-your-code-quality-with-sonarqube---a-beginners-guide\",\"path\":\"blog/2025/06/06/level-up-your-code-quality-with-sonarqube---a-beginners-guide\",\"filePath\":\"blog/2025/06/06/level-up-your-code-quality-with-sonarqube---a-beginners-guide.mdx\",\"toc\":[{\"value\":\"What is SonarQube?\",\"url\":\"#what-is-sonarqube\",\"depth\":2},{\"value\":\"Why use SonarQube?\",\"url\":\"#why-use-sonarqube\",\"depth\":2},{\"value\":\"How to SonarQube sits in your workflow\",\"url\":\"#how-to-sonarqube-sits-in-your-workflow\",\"depth\":2},{\"value\":\"Example use-case using SonarQube\",\"url\":\"#example-use-case-using-sonarqube\",\"depth\":2},{\"value\":\"Example of Code Smells\",\"url\":\"#example-of-code-smells\",\"depth\":2},{\"value\":\"Code Smell Example 1\",\"url\":\"#code-smell-example-1\",\"depth\":3},{\"value\":\"Code Smell Example 2\",\"url\":\"#code-smell-example-2\",\"depth\":3},{\"value\":\"Motivation for integrating SonarQube into your CI Pipeline\",\"url\":\"#motivation-for-integrating-sonarqube-into-your-ci-pipeline\",\"depth\":2},{\"value\":\"Implementing SonarQube with Python and Github Actions\",\"url\":\"#implementing-sonarqube-with-python-and-github-actions\",\"depth\":2},{\"value\":\"SonarQube on Docker\",\"url\":\"#sonarqube-on-docker\",\"depth\":3},{\"value\":\"Github Actions Runner\",\"url\":\"#github-actions-runner\",\"depth\":3},{\"value\":\"Python Application\",\"url\":\"#python-application\",\"depth\":3},{\"value\":\"Configure SonarQube Project\",\"url\":\"#configure-sonarqube-project\",\"depth\":3},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Level Up your Code Quality with SonarQube - a Beginners Guide\",\"datePublished\":\"2025-06-06T11:09:46.000Z\",\"dateModified\":\"2025-06-06T11:09:46.000Z\",\"description\":\"Learn what SonarQube is and how it helps improve code quality by detecting bugs, security issues, and code smells before they reach production. In this beginner-friendly guide, we’ll walk through a simple Python example, explore common code smells, and show you how to run SonarQube locally using Docker Compose. Perfect for junior developers, students, and QA engineers looking to improve their code review process and CI pipeline.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2025/06/06/level-up-your-code-quality-with-sonarqube---a-beginners-guide\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"How to Choose a Career in IT - A Practical Guide\",\"date\":\"2025-06-04T16:35:57.000Z\",\"tags\":[\"it\",\"career\"],\"draft\":false,\"summary\":\"Discover how to choose the right IT career path based on your interests, skills, and long-term goals.\",\"images\":[\"/static/images/ruan-dev-default-image.png\"],\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"14 min read\",\"minutes\":13.615,\"time\":816900,\"words\":2723},\"slug\":\"2025/06/04/how-to-choose-a-career-in-it\",\"path\":\"blog/2025/06/04/how-to-choose-a-career-in-it\",\"filePath\":\"blog/2025/06/04/how-to-choose-a-career-in-it.mdx\",\"toc\":[{\"value\":\"Story-Time from my last 15 Years of Experience\",\"url\":\"#story-time-from-my-last-15-years-of-ex
1perience\",\"depth\":2},{\"value\":\"Why am I telling you all this?\",\"url\":\"#why-am-i-telling-you-all-this\",\"depth\":3},{\"value\":\"Getting Started in IT\",\"url\":\"#getting-started-in-it\",\"depth\":2},{\"value\":\"If I had to start all over again\",\"url\":\"#if-i-had-to-start-all-over-again\",\"depth\":2},{\"value\":\"Gaining Experience Without a Job\",\"url\":\"#gaining-experience-without-a-job\",\"depth\":2},{\"value\":\"Popular IT Career Paths with Descriptions\",\"url\":\"#popular-it-career-paths-with-descriptions\",\"depth\":2},{\"value\":\"A Day in the Life (Role Scenarios)\",\"url\":\"#a-day-in-the-life-role-scenarios\",\"depth\":2},{\"value\":\"Career Path Diagrams\",\"url\":\"#career-path-diagrams\",\"depth\":2},{\"value\":\"Online Courses\",\"url\":\"#online-courses\",\"depth\":2},{\"value\":\"Career Roadmaps\",\"url\":\"#career-roadmaps\",\"depth\":2},{\"value\":\"Final Thoughts\",\"url\":\"#final-thoughts\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"How to Choose a Career in IT - A Practical Guide\",\"datePublished\":\"2025-06-04T16:35:57.000Z\",\"dateModified\":\"2025-06-04T16:35:57.000Z\",\"description\":\"Discover how to choose the right IT career path based on your interests, skills, and long-term goals.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2025/06/04/how-to-choose-a-career-in-it\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Building a Local AI Assistant with llama-cpp-python\",\"date\":\"2025-02-14T21:36:25.000Z\",\"tags\":[\"python\",\"ollama\",\"ai\",\"engineering\"],\"draft\":false,\"summary\":\"Learn how to build a local AI assistant using llama-cpp-python. This guide covers installing the model, adding conversation memory, and integrating external tools for automation, web scraping, and real-time data retrieval.\",\"images\":[\"/static/images/ruan-dev-default-image.png\"],\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"12 min read\",\"minutes\":11.93,\"time\":715800,\"words\":2386},\"slug\":\"2025/02/14/building-a-local-ai-assistant-with-llama-cpp-python\",\"path\":\"blog/2025/02/14/building-a-local-ai-assistant-with-llama-cpp-python\",\"filePath\":\"blog/2025/02/14/building-a-local-ai-assistant-with-llama-cpp-python.mdx\",\"toc\":[{\"value\":\"What is llama-cpp-python\",\"url\":\"#what-is-llama-cpp-python\",\"depth\":2},{\"value\":\"Installing llama-cpp-python\",\"url\":\"#installing-llama-cpp-python\",\"depth\":2},{\"value\":\"Downloading a Small Llama Model\",\"url\":\"#downloading-a-small-llama-model\",\"depth\":2},{\"value\":\"Running Llama Locally with Python\",\"url\":\"#running-llama-locally-with-python\",\"depth\":2},{\"value\":\"Adding Persistent Memory and Selective Recall\",\"url\":\"#adding-persistent-memory-and-selective-recall\",\"depth\":2},{\"value\":\"Define Important Facts vs Small Talk\",\"url\":\"#define-important-facts-vs-small-talk\",\"depth\":2},{\"value\":\"Testing our bot\",\"url\":\"#testing-our-bot\",\"depth\":2},{\"value\":\"Integrate External Tasks within our Chatbot\",\"url\":\"#integrate-external-tasks-within-our-chatbot\",\"depth\":2},{\"value\":\"Modular Task Execution\",\"url\":\"#modular-task-execution\",\"depth\":2},{\"value\":\"Create the Task Manager\",\"url\":\"#create-the-task-manager\",\"depth\":2},{\"value\":\"Implement Task Execution\",\"url\":\"#implement-task-execution\",\"depth\":2},{\"value\":\"Task Automation (System Commands)\",\"url\":\"#task-automation-system-commands\",\"depth\":2},{\"value\":\"Web Scraping for News\",\"url\":\"#web-scraping-for-news\",\"depth\":2},{\"value\":\"Calling APIs (Crypto Prices)\",\"url\":\"#calling-apis-crypto-prices\",\"depth\":2},{\"value\":\"Running our AI Assistant\",\"url\":\"#running-our-ai-assistant\",\"depth\":2},{\"value\":\"Next Steps\",\"url\":\"#next-steps\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Building a Local AI Assistant with llama-cpp-python\",\"datePublished\":\"2025-02-14T21:36:25.000Z\",\"dateModified\":\"2025-02-14T21:36:25.000Z\",\"description\":\"Learn how to build a local AI assistant using llama-cpp-python. This guide covers installing the model, adding conversation memory, and integrating external tools for automation, web scraping, and real-time data retrieval.\",\"image\":\"/static/images/ruan-dev-default-image.png\",\"url\":\"https://ruan.dev/blog/2025/02/14/building-a-local-ai-assistant-with-llama-cpp-python\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}},{\"title\":\"Getting Started with Ollama and LLMs in Python\",\"date\":\"2025-02-14T20:54:57.000Z\",\"tags\":[\"python\",\"ollama\",\"ai\",\"engineering\"],\"draft\":false,\"summary\":\"Learn how to run Large Language Models (LLMs) locally using Ollama and integrate them into Python with langchain-ollama. A step-by-step guide for setting up and generating AI-powered responses.\",\"images\":[\"/static/images/ollama-llm-python-langchain.png\"],\"authors\":[\"ruanbekker\"],\"type\":\"Blog\",\"readingTime\":{\"text\":\"3 min read\",\"minutes\":2.425,\"time\":145500,\"words\":485},\"slug\":\"2025/02/14/getting-started-with-ollama-and-llms-in-python\",\"path\":\"blog/2025/02/14/getting-started-with-ollama-and-llms-in-python\",\"filePath\":\"blog/2025/02/14/getting-started-with-ollama-and-llms-in-python.mdx\",\"toc\":[{\"value\":\"Introduction\",\"url\":\"#introduction\",\"depth\":2},{\"value\":\"What is Ollama?\",\"url\":\"#what-is-ollama\",\"depth\":2},{\"value\":\"What is an LLM (Large Language Model)\",\"url\":\"#what-is-an-llm-large-language-model\",\"depth\":2},{\"value\":\"Setting Up Ollama in Python\",\"url\":\"#setting-up-ollama-in-python\",\"depth\":2},{\"value\":\"Installing the Python Libraries\",\"url\":\"#installing-the-python-libraries\",\"depth\":2},{\"value\":\"Use Ollama with LangChain in Python\",\"url\":\"#use-ollama-with-langchain-in-python\",\"depth\":2},{\"value\":\"Thank You\",\"url\":\"#thank-you\",\"depth\":2}],\"structuredData\":{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"Getting Started with Ollama and LLMs in Python\",\"datePublished\":\"2025-02-14T20:54:57.000Z\",\"dateModified\":\"2025-02-14T20:54:57.000Z\",\"description\":\"Learn how to run Large Language Models (LLMs) locally using Ollama and integrate them into Python with langchain-ollama. A step-by-step guide for setting up and generating AI-powered responses.\",\"image\":\"/static/images/ollama-llm-python-langchain.png\",\"url\":\"https://ruan.dev/blog/2025/02/14/getting-started-with-ollama-and-llms-in-python\",\"author\":[{\"@type\":\"Person\",\"name\":\"Ruan Bekker\"}]}}],\"pagination\":{\"currentPage\":1,\"totalPages\":79},\"title\":\"All Posts\"}],null],\"segment\":\"__PAGE__\"},\"styles\":[]}],\"segment\":\"blog\"},\"styles\":[]}]}]]}],[\"$\",\"footer\",null,{\"children\":[\"$\",\"div\",null,{\"className\":\"mt-16 flex flex-col items-center\",\"children\":[[\"$\",\"div\",null,{\"className\":\"mb-3 flex space-x-4\",\"children\":[[\"$\",\"a\",null,{\"className\":\"text-sm text-gray-500 transition hover:text-gray-600\",\"target\":\"_blank\",\"rel\":\"noopener noreferrer\",\"href\":\"mailto:[email protected]\",\"children\":[[\"$\",\"span\",null,{\"className\":\"sr-only\",\"children\":\"mail\"}],[\"$\",\"svg\",null,{\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 20 20\",\"className\":\"fill-current text-gray-700 hover:text-primary-500 dark:text-gray-200 dark:hover:text-primary-400 h-6 w-6\",\"children\":[[\"$\",\"path\",null,{\"d\":\"M2.003 5.884L10 9.882l7.997-3.998A2 2 0 0016 4H4a2 2 0 00-1.997 1.884z\"}],[\"$\",\"path\",null,{\"d\":\"M18 8.118l-8 4-8-4V14a2 2 0 002 2h12a2 2 0 002-2V8.118z\"}]]}]]}],[\"$\",\"a\",null,{\"className\":\"text-sm text-gray-500 transition hover:text-gray-600\",\"target\":\"_blank\",\"rel\":\"noopener noreferrer\",\"href\":\"https://github.com/ruanbekker\",\"children\":[[\"$\",\"span\",null,{\"className\":\"sr-only\",\"children\":\"github\"}],[\"$\",\"svg\",null,{\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 24 24\",\"className\":\"fill-current text-gray-700 hover:text-primary-500 dark:text-gray-200 dark:hover:text-primary-400 h-6 w-6\",\"children\":[\"$\",\"path\",null,{\"d\":\"M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12\"}]}]]}],null,[\"$\",\"a\",null,{\"className\":\"text-sm text-gray-500 transition hover:text-gray-600\",\"target\":\"_blank\",\"rel\":\"noopener noreferrer\",\"href\":\"https://www.linkedin.com/in/ruanbekker\",\"children\":[[\"$\",\"span\",null,{\"className\":\"sr-only\",\"children\":\"linkedin\"}],[\"$\",\"svg\",null,{\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 24 24\",\"className\":\"fill-current text-gray-700 hover:text-primary-500 dark:text-gray-200 dark:hover:text-primary-400 h-6 w-6\",\"children\":[\"$\",\"path\",null,{\"d\":\"M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433a2.062 2.062 0 01-2.063-2.065 2.064 2.064 0 112.063 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z\"}]}]]}],[\"$\",\"a\",null,{\"className\":\"text-sm text-gray-500 transition hover:text-gray-600\",\"target\":\"_blank\",\"rel\":\"noopener noreferrer\",\"href\":\"https://twitter.com/ruanbekker\",\"children\":[[\"$\",\"span\",null,{\"className\":\"sr-only\",\"children\":\"twitter\"}],[\"$\",\"svg\",null,{\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 24 24\",\"className\":\"fill-current text-gray-700 hover:text-primary-500 dark:text-gray-200 dark:hover:text-primary-400 h-6 w-6\",\"children\":[\"$\",\"path\",null,{\"d\":\"M23.953 4.57a10 10 0 01-2.825.775 4.958 4.958 0 002.163-2.723c-.951.555-2.005.959-3.127 1.184a4.92 4.92 0 00-8.384 4.482C7.69 8.095 4.067 6.13 1.64 3.162a4.822 4.822 0 00-.666 2.475c0 1.71.87 3.213 2.188 4.096a4.904 4.904 0 01-2.228-.616v.06a4.923 4.923 0 003.946 4.827 4.996 4.996 0 01-2.212.085 4.936 4.936 0 004.604 3.417 9.867 9.867 0 01-6.102 2.105c-.39 0-.779-.023-1.17-.067a13.995 13.995 0 007.557 2.209c9.053 0 13.998-7.496 13.998-13.985 0-.21 0-.42-.015-.63A9.935 9.935 0 0024 4.59z\"}]}]]}]]}],[\"$\",\"div\",null,{\"className\":\"mb-2 flex space-x-2 text-sm text-gray-500 dark:text-gray-400\",\"children\":[[\"$\",\"div\",null,{\"children\":\"Ruan Bekker\"}],[\"$\",\"div\",null,{\"children\":\" • \"}],[\"$\",\"div\",null,{\"children\":\"© 2026\"}],[\"$\",\"div\",null,{\"children\":\" • \"}],[\"$\",\"$Lb\",null,{\"href\":\"/\",\"children\":\"Ruan Bekker's Blog\"}]]}],[\"$\",\"div\",null,{\"className\":\"mb-8 text-sm text-gray-500 dark:text-gray-400\",\"children\":[\"$\",\"a\",null,{\"target\":\"_blank\",\"rel\":\"noopener noreferrer\",\"href\":\"https://github.com/timlrx/tailwind-nextjs-starter-blog\",\"children\":\"Tailwind Nextjs Theme\"}]}]]}]}]]}]}]]}]}]]}],null]}]]\n"])</script>
1<script>self.__next_f.push([1,"6:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"title\",\"1\",{\"children\":\"Blog | Ruan Bekker's Blog\"}],[\"$\",\"meta\",\"2\",{\"name\":\"description\",\"content\":\"Bridging Ideas and Implementation in the World of Open Source and DevOps.\"}],[\"$\",\"meta\",\"3\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}],[\"$\",\"meta\",\"4\",{\"name\":\"robots\",\"content\":\"index, follow\"}],[\"$\",\"meta\",\"5\",{\"name\":\"googlebot\",\"content\":\"index, follow, max-video-preview:-1, max-image-preview:large, max-snippet:-1\"}],[\"$\",\"link\",\"6\",{\"rel\":\"canonical\",\"href\":\"https://ruan.dev/blog\"}],[\"$\",\"link\",\"7\",{\"rel\":\"alternate\",\"type\":\"application/rss+xml\",\"href\":\"https://ruan.dev/feed.xml\"}],[\"$\",\"meta\",\"8\",{\"property\":\"og:title\",\"content\":\"Blog | Ruan Bekker's Blog\"}],[\"$\",\"meta\",\"9\",{\"property\":\"og:description\",\"content\":\"Bridging Ideas and Implementation in the World of Open Source and DevOps.\"}],[\"$\",\"meta\",\"10\",{\"property\":\"og:url\",\"content\":\"https://ruan.dev/blog\"}],[\"$\",\"meta\",\"11\",{\"property\":\"og:site_name\",\"content\":\"Ruan Bekker's Blog\"}],[\"$\",\"meta\",\"12\",{\"property\":\"og:locale\",\"content\":\"en_US\"}],[\"$\",\"meta\",\"13\",{\"property\":\"og:image\",\"content\":\"https://ruan.dev/static/images/ruan-dev-default-image.png\"}],[\"$\",\"meta\",\"14\",{\"property\":\"og:type\",\"content\":\"website\"}],[\"$\",\"meta\",\"15\",{\"name\":\"twitter:card\",\"content\":\"summary_large_image\"}],[\"$\",\"meta\",\"16\",{\"name\":\"twitter:title\",\"content\":\"Blog | Ruan Bekker's Blog\"}],[\"$\",\"meta\",\"17\",{\"name\":\"twitter:description\",\"content\":\"Bridging Ideas and Implementation in the World of Open Source and DevOps.\"}],[\"$\",\"meta\",\"18\",{\"name\":\"twitter:image\",\"content\":\"https://ruan.dev/static/images/ruan-dev-default-image.png\"}],[\"$\",\"meta\",\"19\",{\"name\":\"next-size-adjust\"}]]\n"])</script>
1<script>self.__next_f.push([1,"11:null\n"])</script>
1</body></html>

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.