<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>DevOps | DCMST</title><link>https://portfolio.devcrumbs.com/tag/devops/</link><atom:link href="https://portfolio.devcrumbs.com/tag/devops/index.xml" rel="self" type="application/rss+xml"/><description>DevOps</description><generator>Wowchemy (https://wowchemy.com)</generator><language>en-us</language><lastBuildDate>Thu, 25 Mar 2021 09:10:47 -0500</lastBuildDate><image><url>https://portfolio.devcrumbs.com/media/icon_hu28290437db960aa4e7d19bb9f7230401_6937_512x512_fill_lanczos_center_3.png</url><title>DevOps</title><link>https://portfolio.devcrumbs.com/tag/devops/</link></image><item><title>Differences between Kubernetes and Openshift</title><link>https://portfolio.devcrumbs.com/slides/k8s-vs-ocp/</link><pubDate>Thu, 25 Mar 2021 09:10:47 -0500</pubDate><guid>https://portfolio.devcrumbs.com/slides/k8s-vs-ocp/</guid><description>&lt;!-- [revealoptions]
controlsBackArrows= "hidden"
history= false
center= true
showNotes= false
width= "100%"
height= "100%"
margin= 0.2
minScale= 0.2
maxScale= 1.5 -->
&lt;h1 id="heading">&lt;/h1>
&lt;h2 id="differences-between-kubernetes-and-openshift">Differences between Kubernetes and Openshift&lt;/h2>
&lt;hr>
&lt;h3 id="dcmst">dcmst&lt;/h3>
&lt;h4 id="senior-container-infrastructure-consultant">Senior Container Infrastructure Consultant&lt;/h4>
&lt;h5 id="red-hathttpsredhatcom">&lt;a href="https://redhat.com" target="_blank" rel="noopener">@Red Hat&lt;/a>&lt;/h5>
&lt;hr>
&lt;section data-shortcode-section>
&lt;h3 id="kubernetes">Kubernetes&lt;/h3>
&lt;h4 id="some-assembly-required">Some assembly required&lt;/h4>
&lt;figure >
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="" srcset="
/media/slides/k8s-vs-ocp/k8s-lego_hu5d4fa49e9520c9dd96a24d33f6995b83_231012_48794af0155d9a2bccc567c0020e68ae.webp 400w,
/media/slides/k8s-vs-ocp/k8s-lego_hu5d4fa49e9520c9dd96a24d33f6995b83_231012_dd12ccf7664715d6e555f2ac927603a6.webp 760w,
/media/slides/k8s-vs-ocp/k8s-lego_hu5d4fa49e9520c9dd96a24d33f6995b83_231012_1200x1200_fit_q90_h2_lanczos.webp 1200w"
src="https://portfolio.devcrumbs.com/media/slides/k8s-vs-ocp/k8s-lego_hu5d4fa49e9520c9dd96a24d33f6995b83_231012_48794af0155d9a2bccc567c0020e68ae.webp"
width="50%"
height="760"
loading="lazy" />&lt;/div>
&lt;/div>&lt;/figure>
&lt;hr>
&lt;!-- markdownlint-capture -->
&lt;!-- markdownlint-disable -->
&lt;h3 id="kubernetes-1">Kubernetes&lt;/h3>
&lt;!-- markdownlint-restore -->
&lt;h4 id="some-assembly-required-1">Some assembly required&lt;/h4>
&lt;figure >
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="" srcset="
/media/slides/k8s-vs-ocp/k8s-lack_hue22ff0180dba771c4b2ced3e722d392b_12541_e93d7511a3f9d6d1a8a73de2dceb786c.webp 400w,
/media/slides/k8s-vs-ocp/k8s-lack_hue22ff0180dba771c4b2ced3e722d392b_12541_832425835d1bbb59e844aefb220cdae5.webp 760w,
/media/slides/k8s-vs-ocp/k8s-lack_hue22ff0180dba771c4b2ced3e722d392b_12541_1200x1200_fit_q90_h2_lanczos_3.webp 1200w"
src="https://portfolio.devcrumbs.com/media/slides/k8s-vs-ocp/k8s-lack_hue22ff0180dba771c4b2ced3e722d392b_12541_e93d7511a3f9d6d1a8a73de2dceb786c.webp"
width="100%"
height="327"
loading="lazy" />&lt;/div>
&lt;/div>&lt;/figure>
&lt;aside class="notes">
&lt;ul>
&lt;li>Press &lt;code>S&lt;/code> key to view -&lt;/li>
&lt;/ul>
&lt;p>Kubernetes does not provide (out-of-the-box):&lt;/p>
&lt;ol>
&lt;li>Operative System&lt;/li>
&lt;li>Developer tooling and UX&lt;/li>
&lt;li>Container runtime (CRI-O, Containerd, Docker, etc).&lt;/li>
&lt;li>Image registry&lt;/li>
&lt;li>Software-defined networking&lt;/li>
&lt;li>Load‐balancer and routing&lt;/li>
&lt;li>Log management&lt;/li>
&lt;li>Container metrics and monitoring&lt;/li>
&lt;li>DNS&lt;/li>
&lt;li>Ingress&lt;/li>
&lt;li>RBAC&lt;/li>
&lt;li>Storage&lt;/li>
&lt;li>Management&lt;/li>
&lt;li>Service Catalog (Operators)&lt;/li>
&lt;/ol>
&lt;/aside>
&lt;hr>
&lt;!-- markdownlint-capture -->
&lt;!-- markdownlint-disable -->
&lt;h3 id="kubernetes-2">Kubernetes&lt;/h3>
&lt;!-- markdownlint-restore -->
&lt;h4 id="some-assembly-required-2">Some assembly required&lt;/h4>
&lt;figure >
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="" srcset="
/media/slides/k8s-vs-ocp/k8s-landscape_hud934df60cc460e6bdc2a2320bcb1b77e_6556548_3714d455a464221b6a1d8baf8dd3d70d.webp 400w,
/media/slides/k8s-vs-ocp/k8s-landscape_hud934df60cc460e6bdc2a2320bcb1b77e_6556548_2d3810e7e57aa438895b4bee44290b15.webp 760w,
/media/slides/k8s-vs-ocp/k8s-landscape_hud934df60cc460e6bdc2a2320bcb1b77e_6556548_1200x1200_fit_q90_h2_lanczos_3.webp 1200w"
src="https://portfolio.devcrumbs.com/media/slides/k8s-vs-ocp/k8s-landscape_hud934df60cc460e6bdc2a2320bcb1b77e_6556548_3714d455a464221b6a1d8baf8dd3d70d.webp"
width="100%"
height="460"
loading="lazy" />&lt;/div>
&lt;/div>&lt;/figure>
&lt;/section>
&lt;hr>
&lt;section data-shortcode-section>
&lt;h3 id="openshift">Openshift&lt;/h3>
&lt;h4 id="value-added">Value Added&lt;/h4>
&lt;figure >
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="" srcset="
/media/slides/k8s-vs-ocp/ocp-logo_hub55d0082020858bd8e0d2513214bb36a_58983_27ac333dfa6b7cab104fa5c4bf33e82d.webp 400w,
/media/slides/k8s-vs-ocp/ocp-logo_hub55d0082020858bd8e0d2513214bb36a_58983_360fe55c5a4b106c7fe23b1a6cd1e52f.webp 760w,
/media/slides/k8s-vs-ocp/ocp-logo_hub55d0082020858bd8e0d2513214bb36a_58983_1200x1200_fit_q90_h2_lanczos_3.webp 1200w"
src="https://portfolio.devcrumbs.com/media/slides/k8s-vs-ocp/ocp-logo_hub55d0082020858bd8e0d2513214bb36a_58983_27ac333dfa6b7cab104fa5c4bf33e82d.webp"
width="70%"
height="324"
loading="lazy" />&lt;/div>
&lt;/div>&lt;/figure>
&lt;hr>
&lt;!-- markdownlint-capture -->
&lt;!-- markdownlint-disable -->
&lt;h3 id="openshift-1">Openshift&lt;/h3>
&lt;!-- markdownlint-restore -->
&lt;h4 id="value-added-1">Value Added&lt;/h4>
&lt;figure >
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="" srcset="
/media/slides/k8s-vs-ocp/ocp-landscape_hud934df60cc460e6bdc2a2320bcb1b77e_6563729_1aaf0e92aea7613704fa9ac8bebc3a0f.webp 400w,
/media/slides/k8s-vs-ocp/ocp-landscape_hud934df60cc460e6bdc2a2320bcb1b77e_6563729_641a6e6fa95ce9815f897687463d4ca1.webp 760w,
/media/slides/k8s-vs-ocp/ocp-landscape_hud934df60cc460e6bdc2a2320bcb1b77e_6563729_1200x1200_fit_q90_h2_lanczos_3.webp 1200w"
src="https://portfolio.devcrumbs.com/media/slides/k8s-vs-ocp/ocp-landscape_hud934df60cc460e6bdc2a2320bcb1b77e_6563729_1aaf0e92aea7613704fa9ac8bebc3a0f.webp"
width="100%"
height="460"
loading="lazy" />&lt;/div>
&lt;/div>&lt;/figure>
&lt;hr>
&lt;!-- markdownlint-capture -->
&lt;!-- markdownlint-disable -->
&lt;h3 id="openshift-2">Openshift&lt;/h3>
&lt;!-- markdownlint-restore -->
&lt;h4 id="value-added-2">Value Added&lt;/h4>
&lt;figure >
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="" srcset="
/media/slides/k8s-vs-ocp/ocp-arch_hu5ad65d1c520fefa54127e833cd143ea7_167834_b5727e55f72b3d94cb10d01346c89252.webp 400w,
/media/slides/k8s-vs-ocp/ocp-arch_hu5ad65d1c520fefa54127e833cd143ea7_167834_4638c01656df18eef165986fb64bc40a.webp 760w,
/media/slides/k8s-vs-ocp/ocp-arch_hu5ad65d1c520fefa54127e833cd143ea7_167834_1200x1200_fit_q90_h2_lanczos_2.webp 1200w"
src="https://portfolio.devcrumbs.com/media/slides/k8s-vs-ocp/ocp-arch_hu5ad65d1c520fefa54127e833cd143ea7_167834_b5727e55f72b3d94cb10d01346c89252.webp"
width="100%"
height="429"
loading="lazy" />&lt;/div>
&lt;/div>&lt;/figure>
&lt;/section>
&lt;hr>
&lt;section data-shortcode-section>
&lt;h3 id="openshift-contains-kubernetes">Openshift contains Kubernetes&lt;/h3>
&lt;figure >
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="" srcset="
/media/slides/k8s-vs-ocp/ocp-contains-k8s_hu1e0fae1efb02309ebe72b4ea66218d50_97537_f8b786763edc718263bf7bbb9b9cc32b.webp 400w,
/media/slides/k8s-vs-ocp/ocp-contains-k8s_hu1e0fae1efb02309ebe72b4ea66218d50_97537_96f387002adacb57fbf6e32a888c96a8.webp 760w,
/media/slides/k8s-vs-ocp/ocp-contains-k8s_hu1e0fae1efb02309ebe72b4ea66218d50_97537_1200x1200_fit_q90_h2_lanczos_3.webp 1200w"
src="https://portfolio.devcrumbs.com/media/slides/k8s-vs-ocp/ocp-contains-k8s_hu1e0fae1efb02309ebe72b4ea66218d50_97537_f8b786763edc718263bf7bbb9b9cc32b.webp"
width="90%"
height="435"
loading="lazy" />&lt;/div>
&lt;/div>&lt;/figure>
&lt;aside class="notes">
&lt;ul>
&lt;li>Press &lt;code>S&lt;/code> key to view -&lt;/li>
&lt;/ul>
&lt;/aside>
&lt;hr>
&lt;!-- markdownlint-capture -->
&lt;!-- markdownlint-disable -->
&lt;h3 id="openshift-contains-kubernetes-1">Openshift contains Kubernetes&lt;/h3>
&lt;!-- markdownlint-restore -->
&lt;figure >
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="" srcset="
/media/slides/k8s-vs-ocp/ocp-is-k8s_hud3011e5a0c6e498bbc0af9bd76a3a0dd_105280_89205a684652c1b7301a7c7737a9ce4e.webp 400w,
/media/slides/k8s-vs-ocp/ocp-is-k8s_hud3011e5a0c6e498bbc0af9bd76a3a0dd_105280_afdaf2fcf41a32a0c5da9a20e5afb4cd.webp 760w,
/media/slides/k8s-vs-ocp/ocp-is-k8s_hud3011e5a0c6e498bbc0af9bd76a3a0dd_105280_1200x1200_fit_q90_h2_lanczos_3.webp 1200w"
src="https://portfolio.devcrumbs.com/media/slides/k8s-vs-ocp/ocp-is-k8s_hud3011e5a0c6e498bbc0af9bd76a3a0dd_105280_89205a684652c1b7301a7c7737a9ce4e.webp"
width="90%"
height="386"
loading="lazy" />&lt;/div>
&lt;/div>&lt;/figure>
&lt;/section>
&lt;hr>
&lt;h2 id="conclusion">Conclusion&lt;/h2>
&lt;h3 id="openshit-is-a-kubernetes-flavor">Openshit IS a Kubernetes flavor&lt;/h3>
&lt;hr>
&lt;h2 id="thank-you">Thank You&lt;/h2></description></item><item><title>Podman remote client on MacOS using Vagrant</title><link>https://portfolio.devcrumbs.com/podman-macos-vagrant/</link><pubDate>Tue, 23 Feb 2021 00:00:00 +0000</pubDate><guid>https://portfolio.devcrumbs.com/podman-macos-vagrant/</guid><description>&lt;details class="toc-inpage d-print-none " open>
&lt;summary class="font-weight-bold">Table of Contents&lt;/summary>
&lt;nav id="TableOfContents">
&lt;ul>
&lt;li>&lt;a href="#introduction">Introduction&lt;/a>
&lt;ul>
&lt;li>&lt;a href="#brief-architecture">Brief Architecture&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a href="#installation">Installation&lt;/a>
&lt;ul>
&lt;li>&lt;a href="#install-podman-on-macos">Install podman on MacOS&lt;/a>&lt;/li>
&lt;li>&lt;a href="#create-a-new-ssh-keys-on-macos">Create a new ssh-keys on MacOS&lt;/a>&lt;/li>
&lt;li>&lt;a href="#create-a-vagrant-vm">Create a vagrant VM&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a href="#implementation">Implementation&lt;/a>
&lt;ul>
&lt;li>&lt;a href="#copy-ssh-key-from-macos-to-linux-vm">Copy ssh-key from MacOS to Linux VM&lt;/a>&lt;/li>
&lt;li>&lt;a href="#configure-the-linux-vm">Configure the Linux VM&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a href="#using-the-client">Using the client&lt;/a>&lt;/li>
&lt;li>&lt;a href="#next-steps">Next steps&lt;/a>&lt;/li>
&lt;/ul>
&lt;/nav>
&lt;/details>
&lt;h2 id="introduction">Introduction&lt;/h2>
&lt;p>&lt;a href="http://podman.io/" target="_blank" rel="noopener">Podman&lt;/a> is a daemonless, open-source, Linux native tool designed to make it easy to find, run, build, share and deploy applications using
Open Containers Initiative (&lt;a href="https://www.opencontainers.org/" target="_blank" rel="noopener">OCI&lt;/a>) Containers and Container Images.&lt;/p>
&lt;p>That been said, the core of podman only runs in Linux!
To use podman on macOS, we need to implement the &lt;strong>remote client&lt;/strong> to manage container using a Linux as a backend.&lt;/p>
&lt;h3 id="brief-architecture">Brief Architecture&lt;/h3>
&lt;p>The remote client uses a client-server model.
We need Podman installed on a Linux VM that also has the SSH daemon running.
On our MacOS, when you execute a Podman command:&lt;/p>
&lt;ul>
&lt;li>Podman connects to the server via SSH.&lt;/li>
&lt;li>It then connects to the Podman service by using systemd socket activation.&lt;/li>
&lt;li>The Podman commands are executed on the Linux VM.&lt;/li>
&lt;li>From the client&amp;rsquo;s point of view, it seems like Podman runs locally.&lt;/li>
&lt;/ul>
&lt;h2 id="installation">Installation&lt;/h2>
&lt;h3 id="install-podman-on-macos">Install podman on MacOS&lt;/h3>
&lt;p>To install podman remote client on MacOS, we use &lt;a href="https://brew.sh/" target="_blank" rel="noopener">Homebrew&lt;/a>&lt;/p>
&lt;!-- markdownlint-disable commands-show-output -->
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">$ brew install podman
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;!-- markdownlint-restore -->
&lt;h3 id="create-a-new-ssh-keys-on-macos">Create a new ssh-keys on MacOS&lt;/h3>
&lt;p>We will need to connect via ssh to our vagrant VM, in order to do it passwordless, we will create a ssh-key, the commands for that are:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">$ ssh-keygen -t rsa -b &lt;span class="m">4096&lt;/span> -C &lt;span class="s2">&amp;#34;podman+vagrant&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Generating public/private rsa key pair.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Enter file in which to save the key &lt;span class="o">(&lt;/span>/Users/&amp;lt;USERNAME&amp;gt;/.ssh/id_rsa&lt;span class="o">)&lt;/span>:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Enter passphrase &lt;span class="o">(&lt;/span>empty &lt;span class="k">for&lt;/span> no passphrase&lt;span class="o">)&lt;/span>:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Enter same passphrase again:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Your identification has been saved in /Users/&amp;lt;USERNAME&amp;gt;/.ssh/id_rsa.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Your public key has been saved in /Users/&amp;lt;USERNAME&amp;gt;/.ssh/id_rsa.pub.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">The key fingerprint is:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">SHA256:+pGx7Wcn9WdfRYKJrcdMiKEIPKFRW1lQ1MXP/8i0PLA podman+vagrant
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">The key&lt;span class="err">&amp;#39;&lt;/span>s randomart image is:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+---&lt;span class="o">[&lt;/span>RSA 4096&lt;span class="o">]&lt;/span>----+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">|&lt;/span> ....&lt;span class="o">=&lt;/span>B+. ooo ..&lt;span class="p">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">|&lt;/span> . ++. ..+oo.+ &lt;span class="p">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">|&lt;/span> o .. o +oo &lt;span class="o">=&lt;/span>&lt;span class="p">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">|&lt;/span> .o+ &lt;span class="p">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">|&lt;/span> S ..&lt;span class="p">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">|&lt;/span> . &lt;span class="o">=&lt;/span> . . o&lt;span class="p">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">|&lt;/span> . + . B oo&lt;span class="p">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">|&lt;/span> . o E X o&lt;span class="p">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">|&lt;/span> . .+.&lt;span class="o">=&lt;/span> o.&lt;span class="p">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+----&lt;span class="o">[&lt;/span>SHA256&lt;span class="o">]&lt;/span>-----+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">cat /Users/&amp;lt;USERNAME&amp;gt;/.ssh/id_rsa.pub
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ssh-rsa AAAAB3NzaC1y ... &lt;span class="nv">O3JH8w&lt;/span>&lt;span class="o">==&lt;/span> podman+vagrant
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="create-a-vagrant-vm">Create a vagrant VM&lt;/h3>
&lt;p>We will use a Virtual Machine based on &lt;a href="https://getfedora.org/" target="_blank" rel="noopener">Fedora 33&lt;/a>,&lt;/p>
&lt;p>To create the specified Vagrantfile, we need to follow the next steps:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">$ mkdir my-fedora &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> &lt;span class="nb">cd&lt;/span> my-fedora
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">$ &lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;Vagrant.configure(&amp;#34;&lt;/span>2&lt;span class="s2">&amp;#34;) do |config|
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2"> config.vm.box = &amp;#34;&lt;/span>generic/fedora33&lt;span class="s2">&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2"> config.vm.hostname = &amp;#34;&lt;/span>my-fedora&lt;span class="s2">&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2"> config.vm.provider &amp;#34;&lt;/span>virtualbox&lt;span class="s2">&amp;#34; do |v|
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2"> v.memory = 1024
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2"> v.cpus = 1
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2"> end
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2">end&amp;#34;&lt;/span> &amp;gt;&amp;gt; Vagrantfile
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="implementation">Implementation&lt;/h2>
&lt;p>At this moment we have:&lt;/p>
&lt;ul>
&lt;li>Podman installed&lt;/li>
&lt;li>A ssh-key with no password created&lt;/li>
&lt;li>A VM created with vagrant&lt;/li>
&lt;/ul>
&lt;p>Let&amp;rsquo;s start our implementation&lt;/p>
&lt;h3 id="copy-ssh-key-from-macos-to-linux-vm">Copy ssh-key from MacOS to Linux VM&lt;/h3>
&lt;p>We use the &lt;code>ssh-copy-id&lt;/code> command, and it will ask us for the vagrant user password. The default one is: &lt;strong>vagrant&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">$ ssh-copy-id -i id_rsa.pub vagrant@127.0.0.1 -p &lt;span class="m">2222&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">/usr/bin/ssh-copy-id: INFO: Source of key&lt;span class="o">(&lt;/span>s&lt;span class="o">)&lt;/span> to be installed: &lt;span class="s2">&amp;#34;id_rsa.pub&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key&lt;span class="o">(&lt;/span>s&lt;span class="o">)&lt;/span>, to filter out any that are already installed
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">/usr/bin/ssh-copy-id: INFO: &lt;span class="m">1&lt;/span> key&lt;span class="o">(&lt;/span>s&lt;span class="o">)&lt;/span> remain to be installed -- &lt;span class="k">if&lt;/span> you are prompted now it is to install the new keys
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vagrant@127.0.0.1&lt;span class="s1">&amp;#39;s password:
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1">Number of key(s) added: 1
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1">Now try logging into the machine, with: &amp;#34;ssh -p &amp;#39;&lt;/span>2222&lt;span class="s1">&amp;#39; &amp;#39;&lt;/span>vagrant@127.0.0.1&lt;span class="err">&amp;#39;&lt;/span>&lt;span class="s2">&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2">and check to make sure that only the key(s) you wanted were added.
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>You can verify connectivity with the command:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">$ ssh vagrant@127.0.0.1 -p &lt;span class="m">2222&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Last login: Tue Feb &lt;span class="m">23&lt;/span> 07:33:45 &lt;span class="m">2021&lt;/span> from 10.0.2.5
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">[&lt;/span>vagrant@my-fedora ~&lt;span class="o">]&lt;/span>$
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="configure-the-linux-vm">Configure the Linux VM&lt;/h3>
&lt;p>On this step we will:&lt;/p>
&lt;ul>
&lt;li>Install the podman package and dependencies&lt;/li>
&lt;li>Enable the podman service&lt;/li>
&lt;li>Enable the sshd service&lt;/li>
&lt;/ul>
&lt;h4 id="installing-podman">Installing podman&lt;/h4>
&lt;!-- markdownlint-disable commands-show-output -->
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">sudo dnf --enablerepo&lt;span class="o">=&lt;/span>updates-testing install podman libvarlink-util libvarlink
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;!-- markdownlint-restore -->
&lt;h4 id="enableling-the-podman-service">Enableling the podman service&lt;/h4>
&lt;p>We can enable and start the service permanently, using the following commands:&lt;/p>
&lt;!-- markdownlint-disable commands-show-output -->
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">$ systemctl --user &lt;span class="nb">enable&lt;/span> --now podman
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;!-- markdownlint-restore -->
&lt;p>Also, we will need to enable linger for this user in order for the socket to work when the user is not logged in.&lt;/p>
&lt;!-- markdownlint-disable commands-show-output -->
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">sudo loginctl enable-linger &lt;span class="nv">$USER&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;!-- markdownlint-restore -->
&lt;p>You can verify that the socket is listening with a simple Podman command.&lt;/p>
&lt;!-- markdownlint-disable commands-show-output -->
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">$ podman --remote info
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;!-- markdownlint-restore -->
&lt;h4 id="enableling-the-sshd-service">Enableling the sshd service&lt;/h4>
&lt;p>In order for the client to communicate with the server you need to enable and start the SSH daemon on the Linux VM:&lt;/p>
&lt;!-- markdownlint-disable commands-show-output -->
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">$ sudo systemctl &lt;span class="nb">enable&lt;/span> --now sshd
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;!-- markdownlint-restore -->
&lt;h2 id="using-the-client">Using the client&lt;/h2>
&lt;p>The first step in using the Podman remote client is to configure a &lt;strong>connection&lt;/strong>. To do that, we need can add a connection by using the &lt;code>podman system connection add&lt;/code> command.&lt;/p>
&lt;!-- markdownlint-disable commands-show-output -->
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">$ podman system connection add &amp;lt;CONNECTION-NAME&amp;gt; ssh://vagrant@127.0.0.1:2222 --identity &amp;lt;SSH-KEY&amp;gt;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">$ podman system connection add my-fedora ssh://vagrant@127.0.0.1:2222 --identity ~/.ssh/id_rsa.pub
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;!-- markdownlint-restore -->
&lt;p>We can verify that the connection is in place with the command:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">$ podman system connection list
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Name Identity URI
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">my-fedora* ~/.ssh/id_rsa.pub ssh://vagrant@127.0.0.1:2222/run/user/1000/podman/podman.sock
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Now we can test the connection with the command:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">$ podman info
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">host:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> arch: amd64
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> buildahVersion: 1.18.0
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> cgroupManager: systemd
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> cgroupVersion: v2
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> conmon:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> package: conmon-2.0.21-3.fc33.x86_64
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> path: /usr/bin/conmon
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> version: &lt;span class="s1">&amp;#39;conmon version 2.0.21, commit: 0f53fb68333bdead5fe4dc5175703e22cf9882ab&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> cpus: &lt;span class="m">1&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> distribution:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> distribution: fedora
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> version: &lt;span class="s2">&amp;#34;33&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> eventLogger: journald
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> hostname: my-fedora
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ...
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Also, you can start running podman commands as you run them in docker:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">$ podman images
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">REPOSITORY TAG IMAGE ID CREATED SIZE
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="next-steps">Next steps&lt;/h2>
&lt;p>At this point we have installed everything that we need to start using podman on our MacOS, but podman only work if the Linux VM is up &amp;amp; running, otherwise you will receive an error similar to this:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">$ podman images
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Error: Cannot connect to the Podman socket, make sure there is a Podman REST API service running.: failed to create sshClient:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Connection to bastion host &lt;span class="o">(&lt;/span>ssh://vagrant@127.0.0.1:2222/run/user/1000/podman/podman.sock&lt;span class="o">)&lt;/span> failed.: dial tcp 127.0.0.1:2222: connect: connection refused
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>To avoid that behavior, what I implement is an automator workflow, here are the steps:&lt;/p>
&lt;ol>
&lt;li>
&lt;p>Get the vagrant VM id, to do that run:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">$ vagrant global-status
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">id name provider state directory
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">--------------------------------------------------------------------------
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">894d683 my-fedora virtualbox running ~/vms/my-fedora
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">The above shows information about all known Vagrant environments
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">on this machine. This data is cached and may not be completely
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">up-to-date &lt;span class="o">(&lt;/span>use &lt;span class="s2">&amp;#34;vagrant global-status --prune&amp;#34;&lt;/span> to prune invalid
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">entries&lt;span class="o">)&lt;/span>. To interact with any of the machines, you can go to that
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">directory and run Vagrant, or you can use the ID directly with
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Vagrant commands from any directory. For example:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2">&amp;#34;vagrant destroy 1a2b3c4d&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>As you can see we are interested on get the id column, for this example: &lt;strong>894d683&lt;/strong>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Now, we need to open &lt;strong>Automator&lt;/strong>, go to &lt;em>Launchpad -&amp;gt; search -&amp;gt; &lt;strong>type&lt;/strong> automator&lt;/em>, do click on the &lt;strong>Automator&lt;/strong> Application&lt;/p>
&lt;figure id="figure-launchpad-automator">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Launchpad &amp;#43; Automator" srcset="
/media/posts/podman-macos-vagrant/launchpad-automator_hub10fc04977027c8a627d4591d43f2044_117882_472f99b504f26e0be7156c95d5e4e80c.webp 400w,
/media/posts/podman-macos-vagrant/launchpad-automator_hub10fc04977027c8a627d4591d43f2044_117882_f96c2f43695360c40f6572355088b89a.webp 760w,
/media/posts/podman-macos-vagrant/launchpad-automator_hub10fc04977027c8a627d4591d43f2044_117882_1200x1200_fit_q90_h2_lanczos_3.webp 1200w"
src="https://portfolio.devcrumbs.com/media/posts/podman-macos-vagrant/launchpad-automator_hub10fc04977027c8a627d4591d43f2044_117882_472f99b504f26e0be7156c95d5e4e80c.webp"
width="760"
height="192"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption>
Launchpad + Automator
&lt;/figcaption>&lt;/figure>
&lt;/li>
&lt;li>
&lt;p>Then, we need to write an automator application, for this example I choose a workflow that it will run the command &lt;code>vagrant up &amp;lt;VM-ID&amp;gt;&lt;/code>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">$ vagrant up 894d683
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Bringing machine &lt;span class="s1">&amp;#39;my-fedora&amp;#39;&lt;/span> up with &lt;span class="s1">&amp;#39;virtualbox&amp;#39;&lt;/span> provider...
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">==&lt;/span>&amp;gt; default: Checking &lt;span class="k">if&lt;/span> box &lt;span class="s1">&amp;#39;generic/fedora33&amp;#39;&lt;/span> version &lt;span class="s1">&amp;#39;3.2.0&amp;#39;&lt;/span> is up to date...
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">==&lt;/span>&amp;gt; default: A newer version of the box &lt;span class="s1">&amp;#39;generic/fedora33&amp;#39;&lt;/span> &lt;span class="k">for&lt;/span> provider &lt;span class="s1">&amp;#39;virtualbox&amp;#39;&lt;/span> &lt;span class="nv">is&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">==&lt;/span>&amp;gt; default: available! You currently have version &lt;span class="s1">&amp;#39;3.2.0&amp;#39;&lt;/span>. The latest is &lt;span class="nv">version&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">==&lt;/span>&amp;gt; default: &lt;span class="s1">&amp;#39;3.2.6&amp;#39;&lt;/span>. Run &lt;span class="sb">`&lt;/span>vagrant box update&lt;span class="sb">`&lt;/span> to update.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">==&lt;/span>&amp;gt; default: Clearing any previously &lt;span class="nb">set&lt;/span> forwarded ports...
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">==&lt;/span>&amp;gt; default: Clearing any previously &lt;span class="nb">set&lt;/span> network interfaces...
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">==&lt;/span>&amp;gt; default: Preparing network interfaces based on configuration...
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> default: Adapter 1: &lt;span class="nv">nat&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">==&lt;/span>&amp;gt; default: Forwarding ports...
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> default: &lt;span class="m">22&lt;/span> &lt;span class="o">(&lt;/span>guest&lt;span class="o">)&lt;/span> &lt;span class="o">=&lt;/span>&amp;gt; &lt;span class="m">2222&lt;/span> &lt;span class="o">(&lt;/span>host&lt;span class="o">)&lt;/span> &lt;span class="o">(&lt;/span>adapter 1&lt;span class="o">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">==&lt;/span>&amp;gt; default: Running &lt;span class="s1">&amp;#39;pre-boot&amp;#39;&lt;/span> VM customizations...
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">==&lt;/span>&amp;gt; default: Booting VM...
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">==&lt;/span>&amp;gt; default: Waiting &lt;span class="k">for&lt;/span> machine to boot. This may take a few minutes...
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> default: SSH address: 127.0.0.1:2222
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> default: SSH username: vagrant
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> default: SSH auth method: private &lt;span class="nv">key&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">==&lt;/span>&amp;gt; default: Machine booted and ready!
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">==&lt;/span>&amp;gt; default: Checking &lt;span class="k">for&lt;/span> guest additions in VM...
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">==&lt;/span>&amp;gt; default: Setting hostname...
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">==&lt;/span>&amp;gt; default: Machine already provisioned. Run &lt;span class="sb">`&lt;/span>vagrant provision&lt;span class="sb">`&lt;/span> or use the &lt;span class="sb">`&lt;/span>--provision&lt;span class="sb">`&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">==&lt;/span>&amp;gt; default: flag to force provisioning. Provisioners marked to run always will still run.
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;figure id="figure-automator-workflow">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Automator Workflow" srcset="
/media/posts/podman-macos-vagrant/automator-workflow_hu33140a01e2d0efe5b3cf5bd03b1b1e32_62578_671db356fae3c1265815bf2799ad1854.webp 400w,
/media/posts/podman-macos-vagrant/automator-workflow_hu33140a01e2d0efe5b3cf5bd03b1b1e32_62578_e6ac44c59df3f4c80279a56e2b283686.webp 760w,
/media/posts/podman-macos-vagrant/automator-workflow_hu33140a01e2d0efe5b3cf5bd03b1b1e32_62578_1200x1200_fit_q90_h2_lanczos_3.webp 1200w"
src="https://portfolio.devcrumbs.com/media/posts/podman-macos-vagrant/automator-workflow_hu33140a01e2d0efe5b3cf5bd03b1b1e32_62578_671db356fae3c1265815bf2799ad1854.webp"
width="760"
height="656"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption>
Automator Workflow
&lt;/figcaption>&lt;/figure>
&lt;/li>
&lt;li>
&lt;p>Save the Workflow and remember the location where you save it.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>The final step is to add the workflow to our &lt;strong>login items&lt;/strong>. Go to &lt;code>Systems Preferences -&amp;gt; Users &amp;amp; Groups -&amp;gt; Login Items&lt;/code> and add the application that you save on the previous step.&lt;/p>
&lt;figure id="figure-login-items">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Login Items Menu" srcset="
/media/posts/podman-macos-vagrant/login-items_hu93dd3ea80c77a356a834b817262b07a9_45716_97e97a0cb8561eab525154b680b6c691.webp 400w,
/media/posts/podman-macos-vagrant/login-items_hu93dd3ea80c77a356a834b817262b07a9_45716_2bd5042113cdd3dca57352115b6c1390.webp 760w,
/media/posts/podman-macos-vagrant/login-items_hu93dd3ea80c77a356a834b817262b07a9_45716_1200x1200_fit_q90_h2_lanczos_3.webp 1200w"
src="https://portfolio.devcrumbs.com/media/posts/podman-macos-vagrant/login-items_hu93dd3ea80c77a356a834b817262b07a9_45716_97e97a0cb8561eab525154b680b6c691.webp"
width="670"
height="418"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption>
Login Items Menu
&lt;/figcaption>&lt;/figure>
&lt;p>And that is all, you will have a fully working podman command on your MacOS.&lt;/p>
&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>References:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Podman MacOS and windows install &lt;sup id="fnref:1">&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref">1&lt;/a>&lt;/sup>&lt;/li>
&lt;li>Detailed podman installation on MacOS &lt;sup id="fnref:2">&lt;a href="#fn:2" class="footnote-ref" role="doc-noteref">2&lt;/a>&lt;/sup>&lt;/li>
&lt;li>Automator Configuration &lt;sup id="fnref:3">&lt;a href="#fn:3" class="footnote-ref" role="doc-noteref">3&lt;/a>&lt;/sup>&lt;/li>
&lt;/ul>
&lt;div class="footnotes" role="doc-endnotes">
&lt;hr>
&lt;ol>
&lt;li id="fn:1">
&lt;p>&lt;a href="https://github.com/containers/podman/blob/master/docs/tutorials/mac_win_client.md" target="_blank" rel="noopener">Podman Remote clients for macOS and Windows&lt;/a>&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink">&amp;#x21a9;&amp;#xfe0e;&lt;/a>&lt;/p>
&lt;/li>
&lt;li id="fn:2">
&lt;p>&lt;a href="https://vikaspogu.dev/posts/podman-macos/" target="_blank" rel="noopener">Installing Podman remote client on macOS using vagrant&lt;/a>&amp;#160;&lt;a href="#fnref:2" class="footnote-backref" role="doc-backlink">&amp;#x21a9;&amp;#xfe0e;&lt;/a>&lt;/p>
&lt;/li>
&lt;li id="fn:3">
&lt;p>&lt;a href="https://stackoverflow.com/questions/30680861/how-can-i-automatically-do-vagrant-up-every-time-my-osx-machine-boots" target="_blank" rel="noopener">How can I automatically do vagrant up every time my OSX machine boots?&lt;/a>&amp;#160;&lt;a href="#fnref:3" class="footnote-backref" role="doc-backlink">&amp;#x21a9;&amp;#xfe0e;&lt;/a>&lt;/p>
&lt;/li>
&lt;/ol>
&lt;/div></description></item><item><title>Backing Up a Ruckus Switch Config</title><link>https://portfolio.devcrumbs.com/backing-up-ruckus-config/</link><pubDate>Sat, 21 Nov 2020 00:00:00 +0000</pubDate><guid>https://portfolio.devcrumbs.com/backing-up-ruckus-config/</guid><description>&lt;p>I want to do some changes on my home network to improve the performance, so I will implement VLANs on my network.
But before I do that I want to document how to perform a backup of my Ruckus ICX 7150 Switch.&lt;/p>
&lt;p>In a &lt;a href="https://portfolio.devcrumbs.com/configure-ruckus-switch/">past post&lt;/a> I mentioned how to enable ssh and web cofiguration on the Ruckus switch,
so my first attemtp was to download the configuration file from the web interface but unfortunately it is not possible to do it, there is not an option for that.
What I did is go to the &lt;a href="http://docs.ruckuswireless.com/fastiron/hardware/icx7150-installguide/GUID-25306120-376C-44B2-BAE7-3D969EC889A3.html" target="_blank" rel="noopener">documentation&lt;/a>
and found the &lt;code>copy&lt;/code> command but I need a &lt;a href="https://en.wikipedia.org/wiki/Trivial_File_Transfer_Protocol" target="_blank" rel="noopener">TFTP server&lt;/a> to be able to download the backup file.&lt;/p>
&lt;p>Let&amp;rsquo;s start!&lt;/p>
&lt;ol>
&lt;li>
&lt;p>Install a TFTP server - This is easy will depend on your Operative System, for my is an ArchLinux laptop.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">yay -Sy atftp
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The configuration file for atftp is &lt;code>/etc/conf.d/atftpd&lt;/code>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Next step, is login on your Ruckus switch and perform the copy command:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">ssh &amp;lt;USER&amp;gt;@&amp;lt;SWITCH-IP&amp;gt;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">copy running-config tftp &amp;lt;TFTP-SERVER-IP&amp;gt; myconfig.cfg
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#In my case is:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ssh ruckus@192.168.50.5
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">copy running-config tftp 192.168.50.4 myconfig.cfg
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>Verify that the file is on your TFTP server, by default, the configured directory for atftp is &lt;code>/srv/atftp/&lt;/code> so you should go that location and verify that the generated file is created.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> /srv/atftp
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ls -la
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ol>
&lt;p>That&amp;rsquo;s all, you can restore your switch configuration if needed.&lt;/p>
&lt;p>Bye!&lt;/p></description></item><item><title>Docker Login the Right Way</title><link>https://portfolio.devcrumbs.com/docker-login-the-right-way/</link><pubDate>Wed, 15 May 2019 00:00:00 +0000</pubDate><guid>https://portfolio.devcrumbs.com/docker-login-the-right-way/</guid><description>&lt;details class="toc-inpage d-print-none " open>
&lt;summary class="font-weight-bold">Table of Contents&lt;/summary>
&lt;nav id="TableOfContents">
&lt;ul>
&lt;li>&lt;a href="#credential-store">Credential Store&lt;/a>&lt;/li>
&lt;li>&lt;a href="#docker-credential-helpers">Docker Credential Helpers&lt;/a>&lt;/li>
&lt;li>&lt;a href="#docker-credential-secret-service">docker-credential-secret service&lt;/a>&lt;/li>
&lt;/ul>
&lt;/nav>
&lt;/details>
&lt;h1 id="docker-login-the-right-way">Docker Login the right Way&lt;/h1>
&lt;p>Hi again!&lt;/p>
&lt;p>It is been a while since I wrote something here, as always, there is no much time for a hobby.&lt;/p>
&lt;p>I&amp;rsquo;ve been working for a while with docker, not a production level, but for some applications that I use at work.
And since the &lt;a href="https://www.zdnet.com/article/docker-hub-hack-exposed-data-of-190000-users/" target="_blank" rel="noopener">Docker Hub Data breach&lt;/a>
I put more atention on the security of my data/credentials, so I investigate a little about and found this official
repository &lt;a href="https://github.com/docker/docker-credential-helpers/" target="_blank" rel="noopener">https://github.com/docker/docker-credential-helpers/&lt;/a> from Docker where are the supported credential helpers.&lt;/p>
&lt;h2 id="credential-store">Credential Store&lt;/h2>
&lt;p>Docker keeps our credentials saved on a JSON file located on &lt;code>~/.docker/config.json&lt;/code>,
but unfortunatelly credentials are just encrypted on base64,
here is an &lt;a href="https://fosdem.org/2019/schedule/event/base64_not_encryption/" target="_blank" rel="noopener">articule/video&lt;/a> where there is an explanation for the why it is a bad idea to just use base64 encryption.&lt;/p>
&lt;p>The following is a diagram on how a plain text storage works:&lt;/p>
&lt;figure id="figure-docker-plain-text-storage">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Plain Text Storage" srcset="
/media/posts/docker-login-the-right-way/DockerPlainTextCredentials_hu371181661409e61f690ceccfb695d5d5_82530_0db582c8916ffc5cd1b1225c42276838.webp 400w,
/media/posts/docker-login-the-right-way/DockerPlainTextCredentials_hu371181661409e61f690ceccfb695d5d5_82530_b27b4b3bd220158c0d85a61a2d4ae88b.webp 760w,
/media/posts/docker-login-the-right-way/DockerPlainTextCredentials_hu371181661409e61f690ceccfb695d5d5_82530_1200x1200_fit_q90_h2_lanczos_3.webp 1200w"
src="https://portfolio.devcrumbs.com/media/posts/docker-login-the-right-way/DockerPlainTextCredentials_hu371181661409e61f690ceccfb695d5d5_82530_0db582c8916ffc5cd1b1225c42276838.webp"
width="760"
height="570"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption>
Plain Text Storage
&lt;/figcaption>&lt;/figure>
&lt;p>Here is an example on how &lt;code>~/.docker/config.json&lt;/code> looks like when is using plain text credentials:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">cat ~/.docker/config.json
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;auths&amp;#34;&lt;/span>: &lt;span class="o">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;https://index.docker.io/v1/&amp;#34;&lt;/span>: &lt;span class="o">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;auth&amp;#34;&lt;/span>: &lt;span class="s2">&amp;#34;azRjaDA6c3VwZXJzZWNyZXRwYXNzd29yZAo=&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">}&lt;/span>,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;quay.io&amp;#34;&lt;/span>: &lt;span class="o">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;auth&amp;#34;&lt;/span>: &lt;span class="s2">&amp;#34;azRjaDA6c3VwZXJzZWNyZXRwYXNzd29yZAo=&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">}&lt;/span>,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;HttpHeaders&amp;#34;&lt;/span>: &lt;span class="o">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;User-Agent&amp;#34;&lt;/span>: &lt;span class="s2">&amp;#34;Docker-Client/18.09.6 (linux)&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>After a successful &lt;code>docker login&lt;/code> command,
Docker stores a base64 encoded string from the concatenation of the username, a colon, and the password and associates this string to the registry the user is logging into:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">$ &lt;span class="nb">echo&lt;/span> &lt;span class="nv">azRjaDA6c3VwZXJzZWNyZXRwYXNzd29yZAo&lt;/span>&lt;span class="o">=&lt;/span> &lt;span class="p">|&lt;/span> base64 -d -
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">d-cmst:supersecretpassword
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>A &lt;code>docker logout&lt;/code> command removes the entry from the JSON file for the given registry:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">$ docker &lt;span class="nb">logout&lt;/span> quay.io
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Remove login credentials &lt;span class="k">for&lt;/span> quay.io
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">$ cat ~/.docker/config.json
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;auths&amp;#34;&lt;/span>: &lt;span class="o">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;https://index.docker.io/v1/&amp;#34;&lt;/span>: &lt;span class="o">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;auth&amp;#34;&lt;/span>: &lt;span class="s2">&amp;#34;azRjaDA6c3VwZXJzZWNyZXRwYXNzd29yZAo=&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">}&lt;/span>,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;HttpHeaders&amp;#34;&lt;/span>: &lt;span class="o">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;User-Agent&amp;#34;&lt;/span>: &lt;span class="s2">&amp;#34;Docker-Client/18.09.6 (linux)&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="docker-credential-helpers">Docker Credential Helpers&lt;/h2>
&lt;p>Since docker version &lt;code>1.11&lt;/code> implements support from an external credential store for registry authentication.
That means we can use a native keychain of the OS. Using an external store is more secure than storing on a &amp;ldquo;plain text&amp;rdquo; Docker configuration file.&lt;/p>
&lt;figure id="figure-docker-secure-storage">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Secure Storage" srcset="
/media/posts/docker-login-the-right-way/DockerSecureCredentials_huadaed0eecd0771dd576c62f4a77f8685_87803_dfab2c86655b67a2dd7b453f742b7daa.webp 400w,
/media/posts/docker-login-the-right-way/DockerSecureCredentials_huadaed0eecd0771dd576c62f4a77f8685_87803_67d1fdd1b117feb8b3cab43352b4a5be.webp 760w,
/media/posts/docker-login-the-right-way/DockerSecureCredentials_huadaed0eecd0771dd576c62f4a77f8685_87803_1200x1200_fit_q90_h2_lanczos_3.webp 1200w"
src="https://portfolio.devcrumbs.com/media/posts/docker-login-the-right-way/DockerSecureCredentials_huadaed0eecd0771dd576c62f4a77f8685_87803_dfab2c86655b67a2dd7b453f742b7daa.webp"
width="760"
height="543"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption>
Secure Storage
&lt;/figcaption>&lt;/figure>
&lt;p>In order to use a external credential store, we need a program to interact with.&lt;/p>
&lt;p>The actual list of &amp;ldquo;official&amp;rdquo; Docker Credential Helper is:&lt;/p>
&lt;ol>
&lt;li>docker-credential-osxkeychain: Provides a helper to use the OS X keychain as credentials store.&lt;/li>
&lt;li>docker-credential-secretservice: Provides a helper to use the D-Bus secret service as credentials store.&lt;/li>
&lt;li>docker-credential-wincred: Provides a helper to use Windows credentials manager as store.&lt;/li>
&lt;li>docker-credential-pass: Provides a helper to use pass as credentials store.&lt;/li>
&lt;/ol>
&lt;h2 id="docker-credential-secret-service">docker-credential-secret service&lt;/h2>
&lt;p>On this post we will explore the docker-credential-secretservice and how to configure it.&lt;/p>
&lt;ol>
&lt;li>
&lt;p>We need to download and install the helper.
You can find the lastest release on &lt;a href="https://github.com/docker/docker-credential-helpers/releases" target="_blank" rel="noopener">https://github.com/docker/docker-credential-helpers/releases&lt;/a>.
Download it, extract it and make it executable.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">wget https://github.com/docker/docker-credential-helpers/releases/download/v0.6.2/docker-credential-secretservice-v0.6.2-amd64.tar.gz
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">tar -xf docker-credential-secretservice-v0.6.2-amd64.tar.gz
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">chmod +x docker-credential-secretservice
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo mv docker-credential-secretservice /usr/local/bin/
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>Then, we need to specify the credential store in the file &lt;code>~/.docker/config.json&lt;/code> to tell docker to use it.
The value must be the one after the prefix &lt;code>docker-credential-&lt;/code>. In this case:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-json" data-lang="json">&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;credsStore&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;secretservice&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>To facilite the configuration and do not make mistakes, you can run:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">sed -i &lt;span class="s1">&amp;#39;0,/{/s/{/{\n\t&amp;#34;credsStore&amp;#34;: &amp;#34;secretservice&amp;#34;,/&amp;#39;&lt;/span> ~/.docker/config.json
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ol>
&lt;p>From now we are uning an external store, so if you are currently logged in, you must run &lt;code>docker logout&lt;/code> to remove the credentials from the file and run &lt;code>docker login&lt;/code> tostart using the new ones.&lt;/p>
&lt;p>Let me know how this works for you.&lt;/p>
&lt;p>&lt;strong>References:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Docker Credential Helpers repository&lt;sup id="fnref:1">&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref">1&lt;/a>&lt;/sup>&lt;/li>
&lt;li>Docker Credential Store Documentation&lt;sup id="fnref:2">&lt;a href="#fn:2" class="footnote-ref" role="doc-noteref">2&lt;/a>&lt;/sup>&lt;/li>
&lt;li>Slides about this topic &lt;sup id="fnref:3">&lt;a href="#fn:3" class="footnote-ref" role="doc-noteref">3&lt;/a>&lt;/sup>&lt;/li>
&lt;/ul>
&lt;div class="footnotes" role="doc-endnotes">
&lt;hr>
&lt;ol>
&lt;li id="fn:1">
&lt;p>&lt;a href="https://github.com/docker/docker-credential-helpers" target="_blank" rel="noopener">Docker Credential Helpers&lt;/a>&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink">&amp;#x21a9;&amp;#xfe0e;&lt;/a>&lt;/p>
&lt;/li>
&lt;li id="fn:2">
&lt;p>&lt;a href="https://docs.docker.com/engine/reference/commandline/login/#credentials-store" target="_blank" rel="noopener">docker cli documentation&lt;/a>&amp;#160;&lt;a href="#fnref:2" class="footnote-backref" role="doc-backlink">&amp;#x21a9;&amp;#xfe0e;&lt;/a>&lt;/p>
&lt;/li>
&lt;li id="fn:3">
&lt;p>&lt;a href="https://www.slideshare.net/DavidYeung22/can-we-stop-saving-docker-credentials-in-plain-text-now" target="_blank" rel="noopener">Stop saving credential tokens in text files&lt;/a>&amp;#160;&lt;a href="#fnref:3" class="footnote-backref" role="doc-backlink">&amp;#x21a9;&amp;#xfe0e;&lt;/a>&lt;/p>
&lt;/li>
&lt;/ol>
&lt;/div></description></item><item><title>Bulk Delete Rackspace Cloud Files data via API</title><link>https://portfolio.devcrumbs.com/bulk-delete-cloud-files-api/</link><pubDate>Wed, 13 Feb 2019 00:00:00 +0000</pubDate><guid>https://portfolio.devcrumbs.com/bulk-delete-cloud-files-api/</guid><description>&lt;p>Sometimes it is necessary to delete all the content of the Cloud Files containers, however, the API does not have a proper method to delete the data and the containers on the same API call.
Also, accoring to the documentation, you can only delete &lt;strong>empty&lt;/strong> containers.&lt;/p>
&lt;p>So, in cases where you need to delete the &lt;strong>data and the containers&lt;/strong> at the same time, you should follow the next steps:&lt;/p>
&lt;ol>
&lt;li>
&lt;p>Download &lt;a href="https://github.com/cloudnull/turbolift" target="_blank" rel="noopener">Turbolift&lt;/a>, I know it is an old tool.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">git clone https://github.com/cloudnull/turbolift
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> turbolift
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>In order to get and isolated installation, we are going to create a Python Virtual Environment (virtualenv)&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">mkvirtualenv turbolift
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">workon turbolift
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>Install the tool&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">pip install turbolift
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>Now, prior to start to play with the API calls, we need to grab some data to authenticate with the API:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Variable&lt;/th>
&lt;th>Definition&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>USERNAME&lt;/td>
&lt;td>This is the Rackspace Public Cloud username&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>APIKEY&lt;/td>
&lt;td>This is your API-KEY&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>REGION&lt;/td>
&lt;td>This is the Region where the Cloud Files are located (dfw, ord, iad, lon, hkg)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>TOKEN&lt;/td>
&lt;td>The TOKEN is generated after you get authenticated&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>ENDPOINT&lt;/td>
&lt;td>This ENDPOINT is given also after you get authenticated&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/li>
&lt;li>
&lt;p>Next step, we are going to use &lt;a href="https://curl.haxx.se/" target="_blank" rel="noopener">cURL&lt;/a>, to perform all the API calls:&lt;/p>
&lt;ul>
&lt;li>First of all, get the TOKEN:&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">&lt;span class="nv">USERNAME&lt;/span>&lt;span class="o">=&lt;/span>YOUR-USERNAME
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">APIKEY&lt;/span>&lt;span class="o">=&lt;/span>YOUR-APIKEY
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">TOKEN&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="k">$(&lt;/span>curl -s -XPOST https://identity.api.rackspacecloud.com/v2.0/tokens &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -d&lt;span class="s1">&amp;#39;{&amp;#34;auth&amp;#34;:{&amp;#34;RAX-KSKEY:apiKeyCredentials&amp;#34;:{&amp;#34;username&amp;#34;:&amp;#34;&amp;#39;&lt;/span>&lt;span class="nv">$USERNAME&lt;/span>&lt;span class="s1">&amp;#39;&amp;#34;,&amp;#34;apiKey&amp;#34;:&amp;#34;&amp;#39;&lt;/span>&lt;span class="nv">$APIKEY&lt;/span>&lt;span class="s1">&amp;#39;&amp;#34;}}}&amp;#39;&lt;/span> &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -H&lt;span class="s2">&amp;#34;Content-type:application/json&amp;#34;&lt;/span> &lt;span class="p">|&lt;/span> jq &lt;span class="s1">&amp;#39;.access.token.id&amp;#39;&lt;/span> &lt;span class="p">|&lt;/span> tr -d &lt;span class="s2">&amp;#34;\&amp;#34;&amp;#34;&lt;/span>&lt;span class="k">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>Next step, get the ENDPOINT:&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">&lt;span class="nv">ENDPOINT&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="k">$(&lt;/span>curl -s -XPOST https://identity.api.rackspacecloud.com/v2.0/tokens &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -d&lt;span class="s1">&amp;#39;{&amp;#34;auth&amp;#34;:{&amp;#34;RAX-KSKEY:apiKeyCredentials&amp;#34;:{&amp;#34;username&amp;#34;:&amp;#34;&amp;#39;&lt;/span>&lt;span class="nv">$CL_USERNAME&lt;/span>&lt;span class="s1">&amp;#39;&amp;#34;,&amp;#34;apiKey&amp;#34;:&amp;#34;&amp;#39;&lt;/span>&lt;span class="nv">$APIKEY&lt;/span>&lt;span class="s1">&amp;#39;&amp;#34;}}}&amp;#39;&lt;/span> &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -H&lt;span class="s2">&amp;#34;Content-type:application/json&amp;#34;&lt;/span> &lt;span class="p">|&lt;/span> jq &lt;span class="s1">&amp;#39;.access.serviceCatalog[] | select((.name==&amp;#34;cloudFiles&amp;#34;) or (.name==&amp;#34;cloudFilesCDN&amp;#34;)) | {name} + .
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1"> endpoints[] | .publicURL&amp;#39;&lt;/span> &lt;span class="p">|&lt;/span> tr -d &lt;span class="s2">&amp;#34;\&amp;#34;&amp;#34;&lt;/span> &lt;span class="p">|&lt;/span> grep -v cdn &lt;span class="p">|&lt;/span> grep -i &lt;span class="nv">$REGION&lt;/span>&lt;span class="k">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>In this case we are skipping all te CDN endpoints, but you can add them if is necessary.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>With all the collected data, next step is use turbolift to delete the Cloud Files container and their data. To do it, I use a for-loop:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">&lt;span class="k">for&lt;/span> i in &lt;span class="k">$(&lt;/span>curl -s -H &lt;span class="s2">&amp;#34;X-Auth-Token: &lt;/span>&lt;span class="nv">$TOKEN&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span> &lt;span class="nv">$ENDPOINT&lt;/span>&lt;span class="k">)&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="k">do&lt;/span> turbolift -u &lt;span class="nv">$USERNAME&lt;/span> -a &lt;span class="nv">$APIKEY&lt;/span> --os-rax-auth &lt;span class="nv">$REGION&lt;/span> delete -c &lt;span class="nv">$i&lt;/span> &lt;span class="p">;&lt;/span> &lt;span class="k">done&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ol>
&lt;p>Now, you have all the Data and Cloud Files containers deleted on one region.&lt;/p>
&lt;p>😄&lt;/p></description></item><item><title>Configure SSH on a Ruckus Switch</title><link>https://portfolio.devcrumbs.com/configure-ruckus-switch/</link><pubDate>Tue, 20 Nov 2018 00:00:00 +0000</pubDate><guid>https://portfolio.devcrumbs.com/configure-ruckus-switch/</guid><description>&lt;p>I just have a Ruckus ICX 7150 Switch on my home and I&amp;rsquo;m trying to get access under ssh and web, to easy configuration and security instead of use telnet.
So, I logged in using telnet and then run the following commands to configure a username/password and begin to receive petitions over port 22(ssh) and port 443(https).
Let&amp;rsquo;s begin!&lt;/p>
&lt;ol>
&lt;li>
&lt;p>We will connect via telnet to the switch.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">telnet SWITCH_IP
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>Once we are on the Switch CLI as a optional step, we can configure an IP on the switch.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">device&amp;gt; &lt;span class="nb">enable&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">device# configure terminal
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">device&lt;span class="o">(&lt;/span>config&lt;span class="o">)&lt;/span>&lt;span class="c1"># ip address IP_ADDRESS/CIDR&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">device&lt;span class="o">(&lt;/span>config&lt;span class="o">)&lt;/span>&lt;span class="c1"># ip default-gateway IP_GATEWAY&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>Now, the next steps are for generate a SSL certificate, a username/password, activate password to login and enable thw web access and ssh access.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">device&lt;span class="o">(&lt;/span>config&lt;span class="o">)&lt;/span>&lt;span class="c1"># crypto-ssl certificate generate&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">device&lt;span class="o">(&lt;/span>config&lt;span class="o">)&lt;/span>&lt;span class="c1"># username USERNAME password PASSWORD&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">device&lt;span class="o">(&lt;/span>config&lt;span class="o">)&lt;/span>&lt;span class="c1"># aaa authentication login default local&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">device&lt;span class="o">(&lt;/span>config&lt;span class="o">)&lt;/span>&lt;span class="c1"># aaa authentication web-server default local&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>It may take several minutes to generate the certificate key. After that, save the configuration.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">device&lt;span class="o">(&lt;/span>config&lt;span class="o">)&lt;/span>&lt;span class="c1"># write memory&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ol>
&lt;p>Now you are able to login on your switch using ssh or web.&lt;/p>
&lt;p>&lt;strong>References:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Blog with ruckus commands &lt;sup id="fnref:1">&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref">1&lt;/a>&lt;/sup>&lt;/li>
&lt;/ul>
&lt;div class="footnotes" role="doc-endnotes">
&lt;hr>
&lt;ol>
&lt;li id="fn:1">
&lt;p>&lt;a href="https://docs.ruckuswireless.com/fastiron/08.0.50/fastiron-08050-commandref/GUID-E60DB55B-5E68-40EC-A999-73C6C071EFF7.html" target="_blank" rel="noopener">Ruckus ICX7150-C12P – Initial Configuration&lt;/a>&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink">&amp;#x21a9;&amp;#xfe0e;&lt;/a>&lt;/p>
&lt;/li>
&lt;/ol>
&lt;/div></description></item><item><title>Set a hugo blog on Kubernetes</title><link>https://portfolio.devcrumbs.com/blog-hugo-docker-k8s-quay/</link><pubDate>Mon, 18 Jun 2018 00:00:00 +0000</pubDate><guid>https://portfolio.devcrumbs.com/blog-hugo-docker-k8s-quay/</guid><description>&lt;details class="toc-inpage d-print-none " open>
&lt;summary class="font-weight-bold">Table of Contents&lt;/summary>
&lt;nav id="TableOfContents">
&lt;ul>
&lt;li>&lt;a href="#overview">Overview&lt;/a>
&lt;ul>
&lt;li>&lt;a href="#architecture">Architecture&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a href="#containerized">Containerized&lt;/a>
&lt;ul>
&lt;li>&lt;a href="#dockerfile">Dockerfile&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;/nav>
&lt;/details>
&lt;h2 id="overview">Overview&lt;/h2>
&lt;p>Since last year I been trying to become an SRE (Site Reliability Engineer), so I been involved with some emerging technologies, like ansible, docker and on this time with kubernetes.&lt;/p>
&lt;p>This time, I will try to explain how I containerized my blog using:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://gohugo.io/" target="_blank" rel="noopener">Hugo&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.docker.com/" target="_blank" rel="noopener">Docker&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://kubernetes.io/" target="_blank" rel="noopener">Kubernetes&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://quay.io/" target="_blank" rel="noopener">Quay&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com" target="_blank" rel="noopener">Git&lt;/a>&lt;/li>
&lt;/ul>
&lt;h3 id="architecture">Architecture&lt;/h3>
&lt;p>So, I take some ideas from &lt;a href="https://www.civo.com/learn/using-civo-k3s-service-to-host-your-blog-in-hugo-using-github-actions" target="_blank" rel="noopener">here&lt;/a> and I modify them and adapt the architecture described to my options.&lt;/p>
&lt;p>The principal changes that I made are:&lt;/p>
&lt;ul>
&lt;li>My Kubernetes cluster is running on 2 cloud server on Rackspace Public Cloud&lt;/li>
&lt;li>The container registry that I&amp;rsquo;m using is Quay&lt;/li>
&lt;li>Rackspace Public Cloud does not support a Kubernetes LoadBalancer service automatically,
so I simulate that behavior adding a Cloud Load Balancer manually after the Kubernetes service provide me the port.&lt;/li>
&lt;/ul>
&lt;figure id="figure-blog-hugo-architecture">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Architecture" srcset="
/media/posts/blog-hugo-docker-k8s-quay/architecture_hu8b96b5b52b85b051d387a2869880f3ab_113861_90038fb3c81eb33b4ff587d44167dbfc.webp 400w,
/media/posts/blog-hugo-docker-k8s-quay/architecture_hu8b96b5b52b85b051d387a2869880f3ab_113861_422b03095e3febbbd91dbb98eee4f1ca.webp 760w,
/media/posts/blog-hugo-docker-k8s-quay/architecture_hu8b96b5b52b85b051d387a2869880f3ab_113861_1200x1200_fit_q90_h2_lanczos_3.webp 1200w"
src="https://portfolio.devcrumbs.com/media/posts/blog-hugo-docker-k8s-quay/architecture_hu8b96b5b52b85b051d387a2869880f3ab_113861_90038fb3c81eb33b4ff587d44167dbfc.webp"
width="760"
height="486"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption>
Architecture
&lt;/figcaption>&lt;/figure>
&lt;h2 id="containerized">Containerized&lt;/h2>
&lt;p>I use &lt;a href="https://gohugo.io/" target="_blank" rel="noopener">Hugo&lt;/a> to deploy my blog, I used to do it as mentioned on &lt;a href="https://d-cmst.io/deployment-hugo-site-git-hooks/" target="_blank" rel="noopener">this&lt;/a> previous post (In Spanish).&lt;/p>
&lt;p>Now, as a part of containerize the blog it make sense to me to create two stages as described &lt;a href="https://www.civo.com/learn/using-civo-k3s-service-to-host-your-blog-in-hugo-using-github-actions" target="_blank" rel="noopener">here&lt;/a>:&lt;/p>
&lt;ul>
&lt;li>The first stage is a defined build environment containing all required build tools (hugo, pygments) and the source of the website (Git repository).&lt;/li>
&lt;li>The second stage is the build artifact (HTML and assets), from the first stage and a webserver to serve the artifact over HTTP.&lt;/li>
&lt;/ul>
&lt;h3 id="dockerfile">Dockerfile&lt;/h3>
&lt;p>Here is the Dockerfile that containerize the blog:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">FROM ubuntu:latest as STAGEONE
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># install hugo&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ENV &lt;span class="nv">HUGO_VERSION&lt;/span>&lt;span class="o">=&lt;/span>0.41
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ADD https://github.com/gohugoio/hugo/releases/download/v&lt;span class="si">${&lt;/span>&lt;span class="nv">HUGO_VERSION&lt;/span>&lt;span class="si">}&lt;/span>/hugo_&lt;span class="si">${&lt;/span>&lt;span class="nv">HUGO_VERSION&lt;/span>&lt;span class="si">}&lt;/span>_Linux-64bit.tar.gz /tmp/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">RUN tar -xf /tmp/hugo_&lt;span class="si">${&lt;/span>&lt;span class="nv">HUGO_VERSION&lt;/span>&lt;span class="si">}&lt;/span>_Linux-64bit.tar.gz -C /usr/local/bin/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># install syntax highlighting&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">RUN apt-get update
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">RUN apt-get install -y python3-pygments
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># build site&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">COPY &lt;span class="nb">source&lt;/span> /source
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">RUN hugo --source&lt;span class="o">=&lt;/span>/source/ --destination&lt;span class="o">=&lt;/span>/public/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">FROM nginx:stable-alpine
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">RUN apk --update add curl bash
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">RUN rm /etc/nginx/conf.d/default.conf
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">COPY modules/nginx.d-cmst.io.conf /etc/nginx/conf.d/d-cmst.io.conf
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">COPY --from&lt;span class="o">=&lt;/span>STAGEONE /public/ /usr/share/nginx/html/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">EXPOSE &lt;span class="m">80&lt;/span> &lt;span class="m">443&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">MAINTAINER dcmst &amp;lt;dcmst@gmx.com&amp;gt;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="first-stage">First Stage&lt;/h4>
&lt;ul>
&lt;li>Fetch the lastest Ubuntu image and name as &lt;strong>STAGEONE&lt;/strong>&lt;/li>
&lt;li>Install the last available &lt;strong>hugo&lt;/strong> version from source.&lt;/li>
&lt;li>Install &lt;strong>pygments&lt;/strong> library to use it for highlighting.&lt;/li>
&lt;li>Build the site with &lt;strong>hugo&lt;/strong> and the output is set on &lt;strong>/public&lt;/strong> as a build artifact.&lt;/li>
&lt;/ul>
&lt;h4 id="second-stage">Second Stage&lt;/h4>
&lt;ul>
&lt;li>Fetch the lastest stable nginx alpine image.&lt;/li>
&lt;li>Update the image and install some utilities.&lt;/li>
&lt;li>Delete the &lt;strong>default&lt;/strong> nginx configuration file.&lt;/li>
&lt;li>Copy the configuration files needed from the repository root directory.&lt;/li>
&lt;li>Copy the build artifact &lt;strong>/public&lt;/strong> from the previous stage (&lt;strong>STAGEONE&lt;/strong>)&lt;/li>
&lt;/ul></description></item><item><title>WordPress with Let's Encrypt SSL Certificate on a Load Balancer</title><link>https://portfolio.devcrumbs.com/wordpress-lets-encrypt-ssl-certificate-load-balancer/</link><pubDate>Sun, 03 Sep 2017 00:00:00 +0000</pubDate><guid>https://portfolio.devcrumbs.com/wordpress-lets-encrypt-ssl-certificate-load-balancer/</guid><description>&lt;p>Hi again,&lt;/p>
&lt;p>As many of you know a lot of &amp;ldquo;Production&amp;rdquo; applications need to be configured to provide High Availability.
With that in mind, a best practice architecture to your application is to add a Load Balancer as a front end who distribute your traffic between your application nodes,
as you can appreciate on the next image:&lt;/p>
&lt;figure id="figure-ha-load-balancer">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="HA Load Balancer diagram" srcset="
/media/posts/wordpress-lets-encrypt-ssl-certificate-load-balancer/LoadBalancerHA_huebbf17380e8f6fabe11a80fc093dace1_79250_35d1701724397631ee8d755949b6ae4b.webp 400w,
/media/posts/wordpress-lets-encrypt-ssl-certificate-load-balancer/LoadBalancerHA_huebbf17380e8f6fabe11a80fc093dace1_79250_5dad269015cb44aa479976dd0b5659d2.webp 760w,
/media/posts/wordpress-lets-encrypt-ssl-certificate-load-balancer/LoadBalancerHA_huebbf17380e8f6fabe11a80fc093dace1_79250_1200x1200_fit_q90_h2_lanczos_3.webp 1200w"
src="https://portfolio.devcrumbs.com/media/posts/wordpress-lets-encrypt-ssl-certificate-load-balancer/LoadBalancerHA_huebbf17380e8f6fabe11a80fc093dace1_79250_35d1701724397631ee8d755949b6ae4b.webp"
width="760"
height="662"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption>
HA Load Balancer diagram
&lt;/figcaption>&lt;/figure>
&lt;h2 id="ssl-offloading">SSL Offloading&lt;/h2>
&lt;p>In this case, my &amp;ldquo;Production&amp;rdquo; application is my blog, and I will install a SSL Certificate on the Cloud Load Balancer(CLB)
to offloading the encryption/decryption to the CLB instead of doing it on the webserver.
That way your webservers uses port 80 (HTTP), as always, and you serve your content trought port 443(HTTPS).&lt;/p>
&lt;figure id="figure-ssl-offloading">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="SSL-Offloading diagram" srcset="
/media/posts/wordpress-lets-encrypt-ssl-certificate-load-balancer/SSL-Offloading_hu8f744432393ec982cce29c1ca941e414_24258_ff5647092c335f508c65542f46c4bdb0.webp 400w,
/media/posts/wordpress-lets-encrypt-ssl-certificate-load-balancer/SSL-Offloading_hu8f744432393ec982cce29c1ca941e414_24258_b3cb8a94ae9c78f78469d7a1fe4e5f56.webp 760w,
/media/posts/wordpress-lets-encrypt-ssl-certificate-load-balancer/SSL-Offloading_hu8f744432393ec982cce29c1ca941e414_24258_1200x1200_fit_q90_h2_lanczos.webp 1200w"
src="https://portfolio.devcrumbs.com/media/posts/wordpress-lets-encrypt-ssl-certificate-load-balancer/SSL-Offloading_hu8f744432393ec982cce29c1ca941e414_24258_ff5647092c335f508c65542f46c4bdb0.webp"
width="760"
height="238"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption>
SSL-Offloading diagram
&lt;/figcaption>&lt;/figure>
&lt;p>Here are the what I use to configure my WordPress with SSL Certificate:&lt;/p>
&lt;ul>
&lt;li>SSL Certificate issued using Let&amp;rsquo;s Encrypt&lt;/li>
&lt;li>A Client of Let&amp;rsquo;s Encrypt called acme&lt;/li>
&lt;li>A Cloud Load Balancer&lt;/li>
&lt;li>A WordPress installation&lt;/li>
&lt;/ul>
&lt;h3 id="step-1-install-acmesh-client">Step 1: Install acme.sh client&lt;/h3>
&lt;p>There is a lot of &lt;a href="https://letsencrypt.org/docs/client-options/" target="_blank" rel="noopener">ACME clients&lt;/a> supported by Let&amp;rsquo;s Encrypt, the most popular is &lt;a href="https://certbot.eff.org" target="_blank" rel="noopener">Certbot.&lt;/a> However, I prefer to use &lt;a href="https://github.com/Neilpang/acme.sh" target="_blank" rel="noopener">acme.sh&lt;/a>.&lt;/p>
&lt;p>Let&amp;rsquo;s install it:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">git clone https://github.com/Neilpang/acme.sh.git
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> acme.sh
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Create a data home directory&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo mkdir -p /opt/acme/data
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Actual command to install it&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">bash acme.sh --install --home /opt/acme --config-home /opt/acme/data --certhome /opt/acme/data/ssl-certs --accountemail your@email.com
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="step-2-issue-ssl-certificate">Step 2: Issue SSL Certificate&lt;/h3>
&lt;p>Once acme.sh is installed, we proceed to issue our first SSL Certificate:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">/opt/acme/acme.sh --issue -d example.com -w /var/www/vhosts/example.com/public_html
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">[&lt;/span>Mon Aug &lt;span class="m">25&lt;/span> 06:04:07 UTC 2017&lt;span class="o">]&lt;/span> Creating domain key
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">[&lt;/span>Mon Aug &lt;span class="m">25&lt;/span> 06:04:07 UTC 2017&lt;span class="o">]&lt;/span> The domain key is here: /opt/acme/data/ssl-certs/example.com/example.com.key
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">[&lt;/span>Mon Aug &lt;span class="m">25&lt;/span> 06:04:07 UTC 2017&lt;span class="o">]&lt;/span> Single &lt;span class="nv">domain&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;example.com&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">[&lt;/span>Mon Aug &lt;span class="m">25&lt;/span> 06:04:07 UTC 2017&lt;span class="o">]&lt;/span> Getting domain auth token &lt;span class="k">for&lt;/span> each domain
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">[&lt;/span>Mon Aug &lt;span class="m">25&lt;/span> 06:04:07 UTC 2017&lt;span class="o">]&lt;/span> Getting webroot &lt;span class="k">for&lt;/span> &lt;span class="nv">domain&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;example.com&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">[&lt;/span>Mon Aug &lt;span class="m">25&lt;/span> 06:04:07 UTC 2017&lt;span class="o">]&lt;/span> Getting new-authz &lt;span class="k">for&lt;/span> &lt;span class="nv">domain&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;example.com&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">[&lt;/span>Mon Aug &lt;span class="m">25&lt;/span> 06:04:08 UTC 2017&lt;span class="o">]&lt;/span> The new-authz request is ok.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">[&lt;/span>Mon Aug &lt;span class="m">25&lt;/span> 06:04:08 UTC 2017&lt;span class="o">]&lt;/span> Verifying:example.com
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">[&lt;/span>Mon Aug &lt;span class="m">25&lt;/span> 06:04:11 UTC 2017&lt;span class="o">]&lt;/span> Success
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">[&lt;/span>Mon Aug &lt;span class="m">25&lt;/span> 06:04:11 UTC 2017&lt;span class="o">]&lt;/span> Verify finished, start to sign.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">[&lt;/span>Mon Aug &lt;span class="m">25&lt;/span> 06:04:11 UTC 2017&lt;span class="o">]&lt;/span> Cert success.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">-----BEGIN CERTIFICATE-----
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">MIIE/zCCA+egAwIBAgISA2AIs/G8gWjkRkNOUb7zmqh1MA0GCSqGSIb3DQEBCwUA
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">MEoxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MSMwIQYDVQQD
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ExpMZXQncyBFbmNyeXB0IEF1dGhvcml0eSBYMzAeFw0xNzA4MjgwNTA0MDBaFw0x
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">NzExMjYwNTA0MDBaMBkxFzAVBgNVBAMTDmNvb2tpZWxhYnMubmV0MIIBIjANBgkq
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAo8/4fXH0dOHcSlyXpsBoULhwQYkz4m0J
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">MegRHU2mhyy/jfKWM6KHDxHpFWUFajLJ/ORE4uncvjmRYeSVBxgv2R2cYoZyKd6v
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">txT+Cdj3jD9fBfDerfdfsdfsd6Y6mlr6Im61afKsFXIgLsprBpK22JU6HOz+0Fdo
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">lan09aaF8zLPtVzdfJw9MU55K7nzerxO8j4ro2lve0PHExkMIBCrXey50wcuqQRY
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">hwkbbXsm+wTES7TCn3tooSzFq6ore3JrSckxhFQ96EOea0s9CgYnw4d9rU/b3jyK
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">bFCILEJK64vgFHx0qvd0hBJFJG/HUtAXAVrFQjjlZlCmCMbnee1UTQIDAQABo4IC
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">DjCCAgowDgYDVR0pasoasoasogWgMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEF
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">BQcDAjAMBgNVHRMBAf8EAjAAMB0GA1UdDgQWBBR2KRpXKKgTorwfXpo44wgKyFUl
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">QzAfBgNVHSMEGDAWgBSoSmpjBH3duubRObemRWXv86jsoTBvBggrBgEFBQcBAQRj
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">MGEwLgYIKwYBBQUHMAASdTdddHA6Ly9vY3NwLmludC14My5sZXRzZW5jcnlwdC5v
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">cmcwLwYIKwYBBQUHMAKGI2h0dHA6Ly9jZXJ0LmludC14My5sZXRzZW5jcnlwdC5v
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">cmcvMBkGA1UdEQQSMBCCDmNvb2tpZWxhYnMubmV0MIH+BgNVHSAEgfYwgfMwCAYG
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Z4EMAQIBMIHmBgsrBgEEAYLfEwEBATCB1jAmBggrBgEFBQcCARYaaHR0cDovL2Nw
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">cy5sZXRzZW5jcnlwdC5vcmcwgasGCCsGAQUFBwICMIGeDIGbVGhpcyBDZXJ0aWZp
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Y2F0ZSBtYXkgb25seSBiZSByZWxpZWQgdXBvbiBieSBSZWx5aW5nIFBhcnRpZXMg
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">YW5kIG9ubHkgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBDZXJ0aWZpY2F0ZSBQb2xp
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Y3kgZm91bmQgYXQgaHR0cHM6Ly9sZXRzZW5jcnlwdC5vcmcvcmVwb3NpdG9yeS8w
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">DQYJKoZIhvcNAQELBQADggEBAFVGs82tzyVER6U0x7p/Q+6xplDFd6ap/dVX9G6i
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">eRPf4ayGykPSH9J3ewu398LOQd3DE93oWbqc7PfEC40Z5HqvCEY3fl9auep99/IF
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">rwhf36J7PXvEsPrUB6pxNFSBw9WX366Z1MP8qoIzm3XYEpp2D/SPniWY5+eQ42Pj
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">WNxxVksA4kFUF9wgKcrsCNTm0X8GZj5HUXC1OwtlopY2w42QrAMGwz1jM4nxv5Mc
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Jim+nT0zmJUhAdQi8ocDjAl2PvcfdgfmkMr9IWH3al/GJSKy3a9Cq+BaIsIUYi6E
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">8M8Mj+00ONNn1folm9aVn+FW5fVCaxYN32ir8PnoTWkOXK8&lt;span class="o">=&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">-----END CERTIFICATE-----
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">[&lt;/span>Mon Aug &lt;span class="m">25&lt;/span> 06:04:11 UTC 2017&lt;span class="o">]&lt;/span> Your cert is in /opt/acme/data/ssl-certs/example.com/example.com.cer
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">[&lt;/span>Mon Aug &lt;span class="m">25&lt;/span> 06:04:11 UTC 2017&lt;span class="o">]&lt;/span> Your cert key is in /opt/acme/data/ssl-certs/example.com/example.com.key
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">[&lt;/span>Mon Aug &lt;span class="m">25&lt;/span> 06:04:11 UTC 2017&lt;span class="o">]&lt;/span> The intermediate CA cert is in /opt/acme/data/ssl-certs/example.com/ca.cer
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">[&lt;/span>Mon Aug &lt;span class="m">25&lt;/span> 06:04:11 UTC 2017&lt;span class="o">]&lt;/span> And the full chain certs is there: /opt/acme/data/ssl-certs/example.com/fullchain.cer
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Where the explained options are:&lt;/p>
&lt;p>-issue: Issue a new certificate&lt;/p>
&lt;p>-d (-domain) : Specifies a domain, used to issue, renew or revoke, etc.&lt;/p>
&lt;p>-w (-webroot) : Specifies the web root folder for web root mode. This is the DocumentRoot where your site is hosted and it is necessary to verify it by Let&amp;rsquo;s Encrypt.&lt;/p>
&lt;h3 id="step-3-install-ssl-certificate-on-cloud-load-balancer">Step 3: Install SSL Certificate on Cloud Load Balancer&lt;/h3>
&lt;p>So, at this moment we have our SSL Certificate, Private Key, and Intermediate CA Certificate ready to install on our Cloud Load Balancer (CLB)&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">Your cert is in /opt/acme/data/ssl-certs/example.com/example.com.cer
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Your cert key is in /opt/acme/data/ssl-certs/example.com/example.com.key
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">The intermediate CA cert is in /opt/acme/data/ssl-certs/example.com/ca.cer
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>So we should go to &lt;a href="https://login.rackspace.com" target="_blank" rel="noopener">https://login.rackspace.com&lt;/a> -&amp;gt; Rackspace Cloud -&amp;gt; Networking -&amp;gt; Cloud Load Balancers:&lt;/p>
&lt;figure id="figure-clb-01">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Rackspace Portal - Cloud Loud Balancer" srcset="
/media/posts/wordpress-lets-encrypt-ssl-certificate-load-balancer/CLB01_hu0c51bf85f3cc4b2d02a66a66d81aa589_40856_54a3e1d860e47c88df6fb2b14ba443b0.webp 400w,
/media/posts/wordpress-lets-encrypt-ssl-certificate-load-balancer/CLB01_hu0c51bf85f3cc4b2d02a66a66d81aa589_40856_f218066512ada5e455967f465b00b323.webp 760w,
/media/posts/wordpress-lets-encrypt-ssl-certificate-load-balancer/CLB01_hu0c51bf85f3cc4b2d02a66a66d81aa589_40856_1200x1200_fit_q90_h2_lanczos_3.webp 1200w"
src="https://portfolio.devcrumbs.com/media/posts/wordpress-lets-encrypt-ssl-certificate-load-balancer/CLB01_hu0c51bf85f3cc4b2d02a66a66d81aa589_40856_54a3e1d860e47c88df6fb2b14ba443b0.webp"
width="760"
height="242"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption>
Rackspace Portal - Cloud Loud Balancer
&lt;/figcaption>&lt;/figure>
&lt;p>Then, to Optional Features and Enable/Configure on &amp;ldquo;Secure Traffic SSL&amp;rdquo;&lt;/p>
&lt;figure id="figure-clb-02">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Rackspace Portal - Cloud Loud Balancer" srcset="
/media/posts/wordpress-lets-encrypt-ssl-certificate-load-balancer/CLB02_hu7ffc5949d0d179fc2236bf5a390f623a_11064_a2285930ece3ab5f674dbcdacb01b0a4.webp 400w,
/media/posts/wordpress-lets-encrypt-ssl-certificate-load-balancer/CLB02_hu7ffc5949d0d179fc2236bf5a390f623a_11064_f1299d84830e0d3fafe67ea941e04cae.webp 760w,
/media/posts/wordpress-lets-encrypt-ssl-certificate-load-balancer/CLB02_hu7ffc5949d0d179fc2236bf5a390f623a_11064_1200x1200_fit_q90_h2_lanczos_3.webp 1200w"
src="https://portfolio.devcrumbs.com/media/posts/wordpress-lets-encrypt-ssl-certificate-load-balancer/CLB02_hu7ffc5949d0d179fc2236bf5a390f623a_11064_a2285930ece3ab5f674dbcdacb01b0a4.webp"
width="732"
height="356"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption>
Rackspace Portal - Cloud Loud Balancer
&lt;/figcaption>&lt;/figure>
&lt;p>Finally, we add our SSL Certificate, Private Key, and Intermediate CA Certificate to the CLB and save the configuration:&lt;/p>
&lt;figure id="figure-clb-03">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Rackspace Portal - Cloud Loud Balancer" srcset="
/media/posts/wordpress-lets-encrypt-ssl-certificate-load-balancer/CLB03_hu67fb6ffec3d9916d394540c9ded24748_14067_5e34a2dc24277d867dd5c175629aa89a.webp 400w,
/media/posts/wordpress-lets-encrypt-ssl-certificate-load-balancer/CLB03_hu67fb6ffec3d9916d394540c9ded24748_14067_c6786992a49821398553ae41e9200fb7.webp 760w,
/media/posts/wordpress-lets-encrypt-ssl-certificate-load-balancer/CLB03_hu67fb6ffec3d9916d394540c9ded24748_14067_1200x1200_fit_q90_h2_lanczos_3.webp 1200w"
src="https://portfolio.devcrumbs.com/media/posts/wordpress-lets-encrypt-ssl-certificate-load-balancer/CLB03_hu67fb6ffec3d9916d394540c9ded24748_14067_5e34a2dc24277d867dd5c175629aa89a.webp"
width="534"
height="573"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption>
Rackspace Portal - Cloud Loud Balancer
&lt;/figcaption>&lt;/figure>
&lt;h3 id="step-4-configure-wordpress">Step 4: Configure WordPress&lt;/h3>
&lt;p>We are almost done, at this time we already have configured our SSL on the CLB to provide WordPress over HTTPS, however, WordPress is still with HTTP, so we need to reconfigure our WordPress with SSL.&lt;/p>
&lt;h4 id="database-queries">Database queries&lt;/h4>
&lt;p>First of all, we should update the links from http to https; we are going to do it directly on the database doing the following queries:&lt;/p>
&lt;div class="alert alert-warning">
&lt;div>
Change all instances of &lt;code>example.com&lt;/code> to your own. If you have the &lt;code>www&lt;/code> as part of your WordPress Address(URL) in the WordPress Settings, add the &amp;lsquo;www&amp;rsquo;.
&lt;/div>
&lt;/div>
&lt;p>Also, if you have a custom table prefix in the WordPress database, something other than the default &amp;lsquo;wp_&amp;rsquo;, then you must change all the instances of &amp;lsquo;wp_&amp;rsquo; to your own table prefix.&lt;/p>
&lt;ol>
&lt;li>
&lt;p>Update any embedded attachments/img that use http:This one updates the src attributes that use double quotes:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="k">UPDATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">`&lt;/span>&lt;span class="n">wp_posts&lt;/span>&lt;span class="o">`&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SET&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">post_content&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">REPLACE&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">post_content&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;src=\&amp;#34;http://example.com&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="s1">&amp;#39;src=\&amp;#34;https://example.com&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">post_content&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">LIKE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;%src=\&amp;#34;http://example.com%&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>This one takes care of any src attributes that use single quotes:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="k">UPDATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">`&lt;/span>&lt;span class="n">wp_posts&lt;/span>&lt;span class="o">`&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SET&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">post_content&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">REPLACE&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">post_content&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;src=\&amp;#39;&lt;/span>&lt;span class="n">http&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="o">//&lt;/span>&lt;span class="n">example&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">com&lt;/span>&lt;span class="s1">&amp;#39;, \
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1">&amp;#39;&lt;/span>&lt;span class="n">src&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="s1">&amp;#39;https://example.com&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">post_content&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">LIKE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;%src=\&amp;#39;&lt;/span>&lt;span class="n">http&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="o">//&lt;/span>&lt;span class="n">example&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">com&lt;/span>&lt;span class="o">%&lt;/span>&lt;span class="s1">&amp;#39;;
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>Update any hard-coded URLs for links.This one updates the URL for href attributes that use double quotes:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="k">UPDATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">`&lt;/span>&lt;span class="n">wp_posts&lt;/span>&lt;span class="o">`&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SET&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">post_content&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">REPLACE&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">post_content&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;href=\&amp;#34;http://example.com&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="s1">&amp;#39;href=\&amp;#34;https://example.com&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">post_content&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">LIKE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;%href=\&amp;#34;http://example.com%&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>This one updates the URL for href attributes that use single quotes:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="k">UPDATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">`&lt;/span>&lt;span class="n">wp_posts&lt;/span>&lt;span class="o">`&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SET&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">post_content&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">REPLACE&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">post_content&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;href=\&amp;#39;&lt;/span>&lt;span class="n">http&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="o">//&lt;/span>&lt;span class="n">example&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">com&lt;/span>&lt;span class="s1">&amp;#39;, \
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1">&amp;#39;&lt;/span>&lt;span class="n">href&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="s1">&amp;#39;https://example.com&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">post_content&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">LIKE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;%href=\&amp;#39;&lt;/span>&lt;span class="n">http&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="o">//&lt;/span>&lt;span class="n">example&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">com&lt;/span>&lt;span class="o">%&lt;/span>&lt;span class="s1">&amp;#39;;
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>Update any &amp;ldquo;pinged&amp;rdquo; links:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="k">UPDATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">`&lt;/span>&lt;span class="n">wp_posts&lt;/span>&lt;span class="o">`&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SET&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pinged&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">REPLACE&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">pinged&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;http://example.com&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="s1">&amp;#39;https://example.com&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pinged&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">LIKE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;%http://example.com%&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>This step is just a confirmation step to make sure that there are no remaining http URLs for your site in the wp_posts table, except the GUID URLs.&lt;/p>
&lt;p>You must replace WP_DB_NAME, near the beginning of the query, with the name of your database.&lt;/p>
&lt;p>This will confirm that nowhere in the wp_posts table is there a remaining http URL, outside of the GUID column. This ignores URLs in the GUID column.&lt;/p>
&lt;p>This query only searches; it does not replace anything, nor make any changes. So, this is safe to run. It’s a safe and quick way to check the wp_posts table while ignoring the guid column.&lt;/p>
&lt;p>This SQL query should return an empty set. That would mean that it found no http URLs for your site. (This is all just 1 query. It’s 1 very,
very long line.)&lt;/p>
&lt;/li>
&lt;/ol>
&lt;div class="alert alert-warning">
&lt;div>
&lt;pre>&lt;code>Remember to replace WP_DB_NAME, near the beginning of the query, with the name of your database.
&lt;/code>&lt;/pre>
&lt;/div>
&lt;/div>
&lt;pre>&lt;code>```sql
SELECT * FROM `WP_DB_NAME`.`wp_posts` WHERE (CONVERT(`ID` USING utf8) LIKE \
'%%http://example.com%%' OR CONVERT(`post_author` USING utf8) LIKE '%%http://example.com%%' \
OR CONVERT(`post_date` USING utf8) LIKE '%%http://example.com%%' \
OR CONVERT(`post_date_gmt` USING utf8) LIKE '%%http://example.com%%' \
OR CONVERT(`post_content` USING utf8) LIKE '%%http://example.com%%' \
OR CONVERT(`post_title` USING utf8) LIKE '%%http://example.com%%' \
OR CONVERT(`post_excerpt` USING utf8) LIKE '%%http://example.com%%' \
OR CONVERT(`post_status` USING utf8) LIKE '%%http://example.com%%' \
OR CONVERT(`comment_status` USING utf8) LIKE '%%http://example.com%%' \
OR CONVERT(`ping_status` USING utf8) LIKE '%%http://example.com%%' \
OR CONVERT(`post_password` USING utf8) LIKE '%%http://example.com%%' \
OR CONVERT(`post_name` USING utf8) LIKE '%%http://example.com%%' \
OR CONVERT(`to_ping` USING utf8) LIKE '%%http://example.com%%' \
OR CONVERT(`pinged` USING utf8) LIKE '%%http://example.com%%' \
OR CONVERT(`post_modified` USING utf8) LIKE '%%http://example.com%%' \
OR CONVERT(`post_modified_gmt` USING utf8) LIKE '%%http://example.com%%' \
OR CONVERT(`post_content_filtered` USING utf8) LIKE '%%http://example.com%%' \
OR CONVERT(`post_parent` USING utf8) LIKE '%%http://example.com%%' \
OR CONVERT(`menu_order` USING utf8) LIKE '%%http://example.com%%' \
OR CONVERT(`post_type` USING utf8) LIKE '%%http://example.com%%' \
OR CONVERT(`post_mime_type` USING utf8) LIKE '%%http://example.com%%' \
OR CONVERT(`comment_count` USING utf8) LIKE '%%http://example.com%%');
```
&lt;/code>&lt;/pre>
&lt;ol>
&lt;li>
&lt;p>Now, we move to the wp_comments table. This changes any comment author URLs that point to the http version of your site.
This is in case you&amp;rsquo;ve ever replied to a comment while your URL was pointing to http.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="k">UPDATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">`&lt;/span>&lt;span class="n">wp_comments&lt;/span>&lt;span class="o">`&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SET&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">comment_author_url&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">REPLACE&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">comment_author_url&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="s1">&amp;#39;http://example.com&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;https://example.com&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">comment_author_url&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">LIKE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;%http://example.com%&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>This updates the content of the comments on your site. If there are any links in the comments that are linking to an http URL on your site, they will be updated to https.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="k">UPDATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">`&lt;/span>&lt;span class="n">wp_comments&lt;/span>&lt;span class="o">`&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SET&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">comment_content&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">REPLACE&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">comment_content&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;http://example.com&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="s1">&amp;#39;https://example.com&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">comment_content&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">LIKE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;%http://example.com%&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>Now we move to the wp_postmeta table. This takes care of any custom post meta that points to the http version of your site.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="k">UPDATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">`&lt;/span>&lt;span class="n">wp_postmeta&lt;/span>&lt;span class="o">`&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SET&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">`&lt;/span>&lt;span class="n">meta_value&lt;/span>&lt;span class="o">`&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">REPLACE&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">meta_value&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;http://example.com&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="s1">&amp;#39;https://example.com&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">meta_value&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">LIKE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;%http://example.com%&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>Now we move to the wp_options table. Update the &lt;strong>WordPress Address (URL)&lt;/strong> and &lt;strong>Site Address (URL)&lt;/strong>.&lt;/p>
&lt;p>For the WordPress Address URL, you may have to modify example.com.
If you have WordPress installed in some other directory, then modify this according to your own WordPress URL.
For example, some people have WordPress installed in a subdirectory named &amp;ldquo;blog&amp;rdquo;, and so their WordPress Address would be &lt;a href="https://example.com/blog" target="_blank" rel="noopener">https://example.com/blog&lt;/a>.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="k">UPDATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">`&lt;/span>&lt;span class="n">wp_options&lt;/span>&lt;span class="o">`&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SET&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">`&lt;/span>&lt;span class="n">option_value&lt;/span>&lt;span class="o">`&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;https://example.com&amp;#34;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">`&lt;/span>&lt;span class="n">wp_options&lt;/span>&lt;span class="o">`&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="o">`&lt;/span>&lt;span class="n">option_name&lt;/span>&lt;span class="o">`&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;siteurl&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>This one will update the Site Address URL (this is the home page of your site):&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="k">UPDATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">`&lt;/span>&lt;span class="n">wp_options&lt;/span>&lt;span class="o">`&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SET&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">`&lt;/span>&lt;span class="n">option_value&lt;/span>&lt;span class="o">`&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;https://example.com&amp;#34;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">`&lt;/span>&lt;span class="n">wp_options&lt;/span>&lt;span class="o">`&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="o">`&lt;/span>&lt;span class="n">option_name&lt;/span>&lt;span class="o">`&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;home&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ol>
&lt;h4 id="wordpress-control-panel">WordPress Control Panel&lt;/h4>
&lt;p>Besides, with run the queries directly on the database, we can update, or verify, the blog URLs, by going to Settings &amp;gt; General&lt;/p>
&lt;p>And updating your WordPress Address (URL) and Site Address (URL) address fields.&lt;/p>
&lt;figure id="figure-wp-change-url">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="WordPress - Change URL" srcset="
/media/posts/wordpress-lets-encrypt-ssl-certificate-load-balancer/WP-ChangeURL_hu6e2977f116eeda53ba50094ce74f270b_11971_cd086c622daa44e7dfc8388d6c27f831.webp 400w,
/media/posts/wordpress-lets-encrypt-ssl-certificate-load-balancer/WP-ChangeURL_hu6e2977f116eeda53ba50094ce74f270b_11971_a1cee76f695748cc9b27d52f28e41672.webp 760w,
/media/posts/wordpress-lets-encrypt-ssl-certificate-load-balancer/WP-ChangeURL_hu6e2977f116eeda53ba50094ce74f270b_11971_1200x1200_fit_q90_h2_lanczos_3.webp 1200w"
src="https://portfolio.devcrumbs.com/media/posts/wordpress-lets-encrypt-ssl-certificate-load-balancer/WP-ChangeURL_hu6e2977f116eeda53ba50094ce74f270b_11971_cd086c622daa44e7dfc8388d6c27f831.webp"
width="760"
height="262"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption>
WordPress - Change URL
&lt;/figcaption>&lt;/figure>
&lt;h4 id="wordpress-config-file">WordPress Config File&lt;/h4>
&lt;p>Finally, we should add the following line to our &lt;strong>wp_config.php&lt;/strong> file&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$_SERVER&lt;/span>&lt;span class="o">[&lt;/span>&lt;span class="s1">&amp;#39;HTTPS&amp;#39;&lt;/span>&lt;span class="o">]=&lt;/span>&lt;span class="s1">&amp;#39;on&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Now, you have configured WordPress with Let&amp;rsquo;s Encrypt SSL Certificate on a Load Balancer.&lt;/p></description></item><item><title> Build a Dynamic DNS Client with Rackspace API</title><link>https://portfolio.devcrumbs.com/build-a-dynamc-dns-client-with-rackspace-api/</link><pubDate>Mon, 11 Apr 2016 00:00:00 +0000</pubDate><guid>https://portfolio.devcrumbs.com/build-a-dynamc-dns-client-with-rackspace-api/</guid><description>&lt;p>This time I&amp;rsquo;ve want to create a homemade Server with my Raspberry Pi2 and publish it using my own sub-domain,
the main problem is that the ISP provide me an dynamic IP and we should ensure that if my IP address change the sub-domain record should point to the new IP.&lt;/p>
&lt;p>The instructions assume that you:&lt;/p>
&lt;ul>
&lt;li>
&lt;p>Have a domain&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Have already changed your NS records to point to dns1.stabletransit.com and dns2.stabletransit.com.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;ol>
&lt;li>
&lt;p>You should download the latest version of rsdns from github&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> ~/bin/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git clone https://github.com/linickx/rsdns.git
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>Go to your Rackspace portal &lt;a href="https://login.rackspace.com/" target="_blank" rel="noopener">https://login.rackspace.com/&lt;/a> and grab your Username &amp;amp; API key (It&amp;rsquo;s under &amp;ldquo;Your Account&amp;rdquo; -&amp;gt; &amp;ldquo;Account Settings&amp;rdquo; -&amp;gt; &amp;ldquo;API Key&amp;rdquo;)&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Create a configuration file for rsdns (~/.rsdns_config) with your settings.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#!/bin/bash
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>&lt;span class="nv">RSUSER&lt;/span>&lt;span class="o">=&lt;/span>dcmst
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">RSAPIKEY&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">1234567890&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">RSPATH&lt;/span>&lt;span class="o">=&lt;/span>~/bin/rsdns/
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>You need your domain created on Rackspace(It&amp;rsquo;s under &amp;ldquo;Networking&amp;rdquo; -&amp;gt; &amp;ldquo;Cloud DNS&amp;rdquo; -&amp;gt; &amp;ldquo;Create Domain&amp;rdquo;) if you don&amp;rsquo;t have your domain created you are able to created using rsdns:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">./rsdns-domain.sh -d www.d-cmst.io -e dcmst@devcrumbs.com
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>Once you have a domain setup you need to create an A record.
To create the A record you going to need an IP address, you can use &lt;a href="http://icanhazip.com" target="_blank" rel="noopener">http://icanhazip.com&lt;/a> to get your actual current IP.
Again to create a record you are able to do it from Rackspace panel (It&amp;rsquo;s under &amp;ldquo;Networking&amp;rdquo; -&amp;gt; &amp;ldquo;Cloud DNS&amp;rdquo; -&amp;gt; YOUR_DOMAIN -&amp;gt; &amp;ldquo;Add Record&amp;rdquo;) or you can use rsdns:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">./rsdns-a.sh -n dynamic-host.d-cmst.io -i 123.123.123.123 -t &lt;span class="m">3600&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>In the above the TTL is set to 1hr (3600 secs), this is so that DNS caches do not keep the record too long. That&amp;rsquo;s all the pre-work done, now lets get your dynamic host setup!&lt;/p>
&lt;/li>
&lt;li>
&lt;p>The script to update your a record is rsdns-dc.sh, and you run it like this:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">./rsdns-dc.sh -n dynamic-host.d-cmst.io
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The script uses icanhazip to get your current IP, it then update the A record with it.&lt;/p>
&lt;p>I never switch off my router so I have create a created a cronjob to run that script every 2 hours,
plus the 1hr TTL should mean that the record is roughly in sync with my IP without making unnecessary requests&lt;/p>
&lt;/li>
&lt;li>
&lt;p>I use CentOS, so I can simply drop the following file called rsdns-dc into /etc/cron.d/ with this&amp;hellip;&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">vim /etc/cron.d/rsdns-dc
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">* */2 * * * dcmst /home/dcmst/bin/rsdns/rsdns-dc.sh -n dynamic-host.d-cmst.io &lt;span class="p">&amp;amp;&lt;/span>&amp;gt;/dev/null
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ol>
&lt;p>Now we are done! Private Dynamic DNS on your own zone using the Rackspace API.&lt;/p></description></item><item><title>View sources IP's in Apache Logs behind a Load Balancer</title><link>https://portfolio.devcrumbs.com/view-sources-ips-apache-logs-behind-loadbalancer/</link><pubDate>Fri, 13 Feb 2015 00:00:00 +0000</pubDate><guid>https://portfolio.devcrumbs.com/view-sources-ips-apache-logs-behind-loadbalancer/</guid><description>&lt;p>When you use the Rackspace Cloud Load Balancers, it is common that the IP logged in Apache is the Private IP (ServiceNet) from the Cloud Load Balancer, however, we can fix that.&lt;/p>
&lt;p>We can view sources IP&amp;rsquo;s in Apache Logs doing some changes on Apache configuration file and also on the vhosts configuration files.&lt;/p>
&lt;p>On your Apache configuration file, you should to find the line:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">LogFormat &lt;span class="s2">&amp;#34;%h %l %u %t \&amp;#34;%r\&amp;#34; %&amp;amp;gt;s %b \&amp;#34;%{Referer}i\&amp;#34; \&amp;#34;%{User-Agent}i\&amp;#34;&amp;#34;&lt;/span> combined
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Modified to:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">LogFormat &lt;span class="s2">&amp;#34;%{X-Forwarded-For}i %h %l %u %t \&amp;#34;%r\&amp;#34; %&amp;amp;gt;s %O \&amp;#34;%{Referer}i\&amp;#34; \&amp;#34;%{User-Agent}i\&amp;#34;&amp;#34;&lt;/span> combined
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>And also, on your vhosts configuration files you should to change the &amp;ldquo;combined&amp;rdquo; LogFormat definition will then be called in a &amp;ldquo;CustomLog&amp;rdquo; entry specific to your VirtualHost configuration.
Here is an example VirtualHost definition to show you what I&amp;rsquo;m referring to:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">ServerAdmin webmaster@example.com
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">DocumentRoot /var/www/html/example.com
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ServerName example.com
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ErrorLog logs/example.com-error_log
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">CustomLog logs/example.com-access_log combined
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>After adding the X-Forwarded-For definition to the LogFormat definition, you can restart Apache and view the logs to notice the difference.
If all is done properly, you will see an actual public IP in the first field of your logs instead of the Cloud Load Balancer IP.&lt;/p></description></item><item><title>I'm a Racker</title><link>https://portfolio.devcrumbs.com/im-a-racker/</link><pubDate>Mon, 31 Mar 2014 00:00:00 +0000</pubDate><guid>https://portfolio.devcrumbs.com/im-a-racker/</guid><description>&lt;p>Since January 6th I working on &lt;a href="http://www.rackspace.com/" target="_blank" rel="noopener">Rackspace&lt;/a>, the Open Cloud Company, so I&amp;rsquo;m a Racker almost 3 months ago and I&amp;rsquo;m loving every minute of it.&lt;/p>
&lt;figure id="figure-rackspace-kickoff">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Rackspace - Kickoff" srcset="
/media/posts/im-a-racker/Rackspace_2014_hu97f9df69980c815709b56b744b2afe31_1277016_c4223cd27b6efc378912441740b16a45.webp 400w,
/media/posts/im-a-racker/Rackspace_2014_hu97f9df69980c815709b56b744b2afe31_1277016_8a88b10b1d9db7b6f37fbf0b1d1054b5.webp 760w,
/media/posts/im-a-racker/Rackspace_2014_hu97f9df69980c815709b56b744b2afe31_1277016_1200x1200_fit_q90_h2_lanczos.webp 1200w"
src="https://portfolio.devcrumbs.com/media/posts/im-a-racker/Rackspace_2014_hu97f9df69980c815709b56b744b2afe31_1277016_c4223cd27b6efc378912441740b16a45.webp"
width="760"
height="567"
loading="lazy" data-zoomable class=" img-light" />&lt;/div>
&lt;/div>&lt;figcaption>
Rackspace - Kickoff
&lt;/figcaption>&lt;/figure>
&lt;h2 id="previous">Previous&lt;/h2>
&lt;p>Everything stared on November 2013 when a Technical Recruiter contact me and started a proceess with some long tough interviews, ability tests, paperwork, etc;
I have accepted a position as a Linux System Administrator I in the LATAM Team for Rackspace, so, I got to work for one of the most dynamic, fanatic, and fun tech companies in the world!&lt;/p>
&lt;p>So, I was very excited, nervous, happy, all together.&lt;/p>
&lt;h2 id="the-castle">The Castle&lt;/h2>
&lt;p>Since I came to The Castle, everything was wonderful, I have met nice, friendly, smart and fanatical people,
like &lt;a href="https://twitter.com/rackersugarbear" target="_blank" rel="noopener">@SugarBear&lt;/a>, a Rackspace Ambassador of Culture, or &lt;a href="https://twitter.com/gweston" target="_blank" rel="noopener">Graham Weston&lt;/a>, Rackspace&amp;rsquo;s Chairman and Co-Funder.
I met them at the Rookie Orientation (a.k.a Rookie&amp;rsquo;O), where I spend time with other Rookies learning about Rackspace history, culture and future plans.&lt;/p>
&lt;p>On the Rookie&amp;rsquo;O, I was surprised and admired with all the energy that is transmitted between the new Rackers, it was awesome!&lt;/p>
&lt;p>And I was inspired by the Rackspace Core Values:&lt;/p>
&lt;ul>
&lt;li>Fanatical Support® in all we do.&lt;/li>
&lt;li>Results first, substance over flash.&lt;/li>
&lt;li>Committed to Greatness&lt;/li>
&lt;li>Full Disclosure and Transparency&lt;/li>
&lt;li>Passion for our Work&lt;/li>
&lt;li>Treat fellow Rackers like Friends and Family&lt;/li>
&lt;/ul>
&lt;p>Which from my point of view I can applied to my personal life, and having great results.&lt;/p>
&lt;p>Also is very comfortable to have a Coffe Shop, a soda machine or microwaves inside the Castle. It is pretty nice!&lt;/p>
&lt;p>In general the first week in Rackspace, on the Rookie&amp;rsquo;O, I was a great experience, I can say that is one of my best experiences in my life.&lt;/p>
&lt;figure id="figure-rackspace-rookieo">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Rackspace - Rookie O" srcset="
/media/posts/im-a-racker/Rackspace_RookieO_hub2cbc3c35f6b27d4fa638699f196141b_1144827_83441913fe5094c92cc43a4a93d9d62b.webp 400w,
/media/posts/im-a-racker/Rackspace_RookieO_hub2cbc3c35f6b27d4fa638699f196141b_1144827_83e5529f91857c862ba240bbc2cc3f3d.webp 760w,
/media/posts/im-a-racker/Rackspace_RookieO_hub2cbc3c35f6b27d4fa638699f196141b_1144827_1200x1200_fit_q90_h2_lanczos.webp 1200w"
src="https://portfolio.devcrumbs.com/media/posts/im-a-racker/Rackspace_RookieO_hub2cbc3c35f6b27d4fa638699f196141b_1144827_83441913fe5094c92cc43a4a93d9d62b.webp"
width="760"
height="567"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption>
Rackspace - Rookie O
&lt;/figcaption>&lt;/figure>
&lt;figure id="figure-rackspace-fanatical-jacket">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Rackspace - Fanatical Jacket" srcset="
/media/posts/im-a-racker/Rackspace_FanaticalJacket_hudeb9d70ed5efd832c64e119d2afbeec5_1023967_bd8f432fa4ed8d48a10e07964d0d3953.webp 400w,
/media/posts/im-a-racker/Rackspace_FanaticalJacket_hudeb9d70ed5efd832c64e119d2afbeec5_1023967_6952966d7f090d8228b9daeccef9c879.webp 760w,
/media/posts/im-a-racker/Rackspace_FanaticalJacket_hudeb9d70ed5efd832c64e119d2afbeec5_1023967_1200x1200_fit_q90_h2_lanczos.webp 1200w"
src="https://portfolio.devcrumbs.com/media/posts/im-a-racker/Rackspace_FanaticalJacket_hudeb9d70ed5efd832c64e119d2afbeec5_1023967_bd8f432fa4ed8d48a10e07964d0d3953.webp"
width="760"
height="567"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption>
Rackspace - Fanatical Jacket
&lt;/figcaption>&lt;/figure>
&lt;figure id="figure-rackspace-fuel-station">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Rackspace - Fuel station" srcset="
/media/posts/im-a-racker/Rackspace_FuelStation_hu95fdeae0c2a58edd0978a06ff5980105_1202391_2a9d6c0c5227b27d1d6860fbd5158a6a.webp 400w,
/media/posts/im-a-racker/Rackspace_FuelStation_hu95fdeae0c2a58edd0978a06ff5980105_1202391_5845109cc2d61713020f973889b8847a.webp 760w,
/media/posts/im-a-racker/Rackspace_FuelStation_hu95fdeae0c2a58edd0978a06ff5980105_1202391_1200x1200_fit_q90_h2_lanczos.webp 1200w"
src="https://portfolio.devcrumbs.com/media/posts/im-a-racker/Rackspace_FuelStation_hu95fdeae0c2a58edd0978a06ff5980105_1202391_2a9d6c0c5227b27d1d6860fbd5158a6a.webp"
width="760"
height="567"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption>
Rackspace - Fuel station
&lt;/figcaption>&lt;/figure>
&lt;figure id="figure-rackspace-slide">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Rackspace - Slide" srcset="
/media/posts/im-a-racker/Rackspace_Slide_huaf8ccd0b3599f98acb0ed36076f7e8d0_1090662_b29aa89fad82bfc348634750d954650c.webp 400w,
/media/posts/im-a-racker/Rackspace_Slide_huaf8ccd0b3599f98acb0ed36076f7e8d0_1090662_003d657ee6df1c7721b971541395fe83.webp 760w,
/media/posts/im-a-racker/Rackspace_Slide_huaf8ccd0b3599f98acb0ed36076f7e8d0_1090662_1200x1200_fit_q90_h2_lanczos.webp 1200w"
src="https://portfolio.devcrumbs.com/media/posts/im-a-racker/Rackspace_Slide_huaf8ccd0b3599f98acb0ed36076f7e8d0_1090662_b29aa89fad82bfc348634750d954650c.webp"
width="567"
height="760"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption>
Rackspace - Slide
&lt;/figcaption>&lt;/figure>
&lt;figure id="figure-rackspace-groundtown">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Rackspace - Coffee Shop" srcset="
/media/posts/im-a-racker/Rackspace_GroundTown_hud1582ace60fd2f0d9e0195d009292ecd_990215_afa2d6a82ab5f4d476901aefa013c422.webp 400w,
/media/posts/im-a-racker/Rackspace_GroundTown_hud1582ace60fd2f0d9e0195d009292ecd_990215_4ed151ce6b383af8a88dd4a05032b807.webp 760w,
/media/posts/im-a-racker/Rackspace_GroundTown_hud1582ace60fd2f0d9e0195d009292ecd_990215_1200x1200_fit_q90_h2_lanczos.webp 1200w"
src="https://portfolio.devcrumbs.com/media/posts/im-a-racker/Rackspace_GroundTown_hud1582ace60fd2f0d9e0195d009292ecd_990215_afa2d6a82ab5f4d476901aefa013c422.webp"
width="760"
height="567"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption>
Rackspace - Coffee Shop
&lt;/figcaption>&lt;/figure>
&lt;h2 id="my-goals">My Goals&lt;/h2>
&lt;p>This is a new big challenge, because means:&lt;/p>
&lt;ul>
&lt;li>Relocation in other country, specifically in San Antonio, TX, USA.&lt;/li>
&lt;li>Leave my family in Mexico City, that means that I see my parents only for Skype or FaceTime :).&lt;/li>
&lt;li>Know other culture, the &amp;ldquo;American&amp;rdquo; culture, with the Breakfast Tacos or Tex-Mex food
(I really hate the Tex-Mex food yiack!) or the Lunch at noon, people do not always says &amp;ldquo;Good morning&amp;rdquo; and
some details that I don&amp;rsquo;t understand but here is common.&lt;/li>
&lt;li>Improve my skills in other language (English) event though I&amp;rsquo;m in the Rackspace LATAM team all the communications like emails or meetings are in English, so, it is very important for my job.&lt;/li>
&lt;li>And the most important challenge for me is still learn about Linux, get my Red Hat Certifications, do my best at job and take advantage of this great opportunity. All of that to try to be a DevOps Engineer&lt;/li>
&lt;/ul>
&lt;figure id="figure-rackspace-latam">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Rackspace - LATAM Section" srcset="
/media/posts/im-a-racker/Rackspace_LATAM_hu95949b8097d407b309e20f2abb4e91dd_856072_f04077c8aa573be5541aeebf10e7385a.webp 400w,
/media/posts/im-a-racker/Rackspace_LATAM_hu95949b8097d407b309e20f2abb4e91dd_856072_1582c54ea8945af1d9628ad9d5d34921.webp 760w,
/media/posts/im-a-racker/Rackspace_LATAM_hu95949b8097d407b309e20f2abb4e91dd_856072_1200x1200_fit_q90_h2_lanczos.webp 1200w"
src="https://portfolio.devcrumbs.com/media/posts/im-a-racker/Rackspace_LATAM_hu95949b8097d407b309e20f2abb4e91dd_856072_f04077c8aa573be5541aeebf10e7385a.webp"
width="760"
height="567"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption>
Rackspace - LATAM Section
&lt;/figcaption>&lt;/figure>
&lt;figure id="figure-rackspace-desk">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Rackspace - My Desk" srcset="
/media/posts/im-a-racker/Rackspace_MyDesk_hu58e0dbb86868380bf1fe6ae7ac59baa2_1047595_fa1427fe85442c7c2361d116b4dd0c3e.webp 400w,
/media/posts/im-a-racker/Rackspace_MyDesk_hu58e0dbb86868380bf1fe6ae7ac59baa2_1047595_6360e43c5f07718ee67bd1dc73be9a27.webp 760w,
/media/posts/im-a-racker/Rackspace_MyDesk_hu58e0dbb86868380bf1fe6ae7ac59baa2_1047595_1200x1200_fit_q90_h2_lanczos.webp 1200w"
src="https://portfolio.devcrumbs.com/media/posts/im-a-racker/Rackspace_MyDesk_hu58e0dbb86868380bf1fe6ae7ac59baa2_1047595_fa1427fe85442c7c2361d116b4dd0c3e.webp"
width="760"
height="567"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption>
Rackspace - My Desk
&lt;/figcaption>&lt;/figure>
&lt;p>I will be working on, providing Fanatical Support for our customers, resolving LATAM customer issues with Linux and working with remote teams from all around the world.&lt;/p>
&lt;p>Summarizing, I&amp;rsquo;m a happy Racker 🙂&lt;/p></description></item></channel></rss>