<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Morgan Wowk</title>
    <description>The latest articles on DEV Community by Morgan Wowk (@morganw).</description>
    <link>https://dev.to/morganw</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F882357%2Ff8f3140f-7482-4648-9d30-5efe26d55ecd.jpeg</url>
      <title>DEV Community: Morgan Wowk</title>
      <link>https://dev.to/morganw</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/morganw"/>
    <language>en</language>
    <item>
      <title>Deploying an HTTP app using Docker + GKE + Cloudflare</title>
      <dc:creator>Morgan Wowk</dc:creator>
      <pubDate>Thu, 23 Feb 2023 23:26:59 +0000</pubDate>
      <link>https://dev.to/morganw/deploying-an-http-app-using-docker-gke-cloudflare-living-document-4db7</link>
      <guid>https://dev.to/morganw/deploying-an-http-app-using-docker-gke-cloudflare-living-document-4db7</guid>
      <description>&lt;h2&gt;
  
  
  Table of contents
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Recap&lt;/li&gt;
&lt;li&gt;Living document intention&lt;/li&gt;
&lt;li&gt;
Serving an HTTP app using Docker, GKE and Cloudflare

&lt;ul&gt;
&lt;li&gt;1. Write an HTTP app&lt;/li&gt;
&lt;li&gt;2. Build the app into an image&lt;/li&gt;
&lt;li&gt;3. Register and onboard with Google Cloud&lt;/li&gt;
&lt;li&gt;4. Setup a Google Artifacts Registry project&lt;/li&gt;
&lt;li&gt;5. Tag the Docker image based on Google's Artifact Registry&lt;/li&gt;
&lt;li&gt;6. Install the &lt;code&gt;gcloud&lt;/code&gt; command on your machine&lt;/li&gt;
&lt;li&gt;7. Configure and authenticate gcloud&lt;/li&gt;
&lt;li&gt;8. Push the Docker image to Artifact Registry&lt;/li&gt;
&lt;li&gt;9. Set up a Shared VPC project&lt;/li&gt;
&lt;li&gt;10. Set up a shared GKE cluster project&lt;/li&gt;
&lt;li&gt;11. Set up Cloud SQL instances&lt;/li&gt;
&lt;li&gt;12. Create a Kubernetes cluster&lt;/li&gt;
&lt;li&gt;13. Prepare secrets for staging and production&lt;/li&gt;
&lt;li&gt;14. Create your first GKE workload&lt;/li&gt;
&lt;li&gt;15. Apply secrets to GKE workloads&lt;/li&gt;
&lt;li&gt;16. Prepare Cloudflare for Total SSL&lt;/li&gt;
&lt;li&gt;17. Expose your application using Cloudflare Tunnel&lt;/li&gt;
&lt;li&gt;18. See your application live 🎉&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Where does our trip take us next? 🚀&lt;/li&gt;

&lt;li&gt;Changelog&lt;/li&gt;

&lt;li&gt;Stay connected 💬&lt;/li&gt;

&lt;/ul&gt;




&lt;h2&gt;
  
  
  Recap
&lt;/h2&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/morganw" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F882357%2Ff8f3140f-7482-4648-9d30-5efe26d55ecd.jpeg" alt="morganw"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/morganw/software-engineering-entrepreneurship-issue-5-up-and-running-with-google-cloud-2o9c" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Software Engineering Entrepreneurship » Issue 5 » Up and running with Google Cloud&lt;/h2&gt;
      &lt;h3&gt;Morgan Wowk ・ Feb 18 '23&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#computerscience&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#learning&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#vibecoding&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


&lt;p&gt;In issue 4-5 of my series &lt;strong&gt;&lt;em&gt;Software Engineering Entrepreneurship&lt;/em&gt;&lt;/strong&gt; we covered the technology stack serving the foundation of our future apps as a Software Engineer-by-day turned Entrepreneur.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0qhnkp74y0h65koit500.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0qhnkp74y0h65koit500.png" alt="Logos for docker, cloudflare, GCP and Kong" width="515" height="336"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Living document intention
&lt;/h2&gt;

&lt;p&gt;At the start of this series I disclosed that I would not give a step-by-step tutorial at any point. This document, however, will serve as the most important log and perhaps the one exception for myself and others to avoid hurdles building this stack in the future.&lt;/p&gt;

&lt;p&gt;Find below an ordered, roughly detailed guide to setting up this technology stack. I will update this document as new discoveries are made or as new steps are introduced. See the bottom of this document for a changelog documenting such edits. Use this document only as an assistant to setting up infrastructure based on your distinct use case and requirements.&lt;/p&gt;




&lt;h2&gt;
  
  
  Serving an HTTP app using Docker, GKE and Cloudflare
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Subject to change (see changelog)&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Write an HTTP app
&lt;/h3&gt;

&lt;p&gt;In your language of choice write an HTTP app that when ran, serves on a specified port. &lt;/p&gt;

&lt;p&gt;In an ideal world, use Docker for both your development and your production build. You may have a different Dockerfile for development and production. Your production Dockerfile should run an executable (using the &lt;code&gt;CMD&lt;/code&gt; keyword) that serves a long running process on a port you specify. For example, in Go you might have a &lt;code&gt;Dockerfile.dev&lt;/code&gt; that runs an &lt;a href="https://github.com/cosmtrek/air" rel="noopener noreferrer"&gt;air command&lt;/a&gt; and a separate production &lt;code&gt;Dockerfile&lt;/code&gt; that runs a &lt;code&gt;go build&lt;/code&gt; and then &lt;code&gt;CMD ["yourapp"]&lt;/code&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  2. Build the app into an image
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker build &lt;span class="nt"&gt;-t&lt;/span&gt; example-api-build-&amp;lt;build-version&amp;gt; &lt;span class="nt"&gt;-f&lt;/span&gt; ./deployment/docker/api/Dockerfile &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Replacing the name appropriately and &lt;code&gt;&amp;lt;build-version&amp;gt;&lt;/code&gt; with a versioning mechanism you have decided on (or &lt;code&gt;test&lt;/code&gt; if you wish to defer that task for later). See &lt;a href="https://container-registry.com/posts/container-image-versioning/" rel="noopener noreferrer"&gt;Container Image Versioning by Rahul Sharma&lt;/a&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  3. Register and onboard with Google Cloud
&lt;/h3&gt;

&lt;p&gt;This step is likely the most time consuming.&lt;/p&gt;

&lt;h4&gt;
  
  
  Budget decision
&lt;/h4&gt;

&lt;p&gt;First, make sure you're in a position with enough available budget to commit to using Google Cloud. Deploying Google Cloud VMs and services could easily exceed $100 / month and this may come as a surprise to some. You should be careful with the resources you create as you can unintentionally rack up costs. Google will strive for minimum costs in many cases and provide estimates as much as possible. I would still recommend getting into the habit of looking up "[Insert GCP Product] Pricing" and at least doing a rough estimate of your own.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://cloud.google.com/free" rel="noopener noreferrer"&gt;Check out Google's free tier as well.&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Registering with Google Cloud
&lt;/h4&gt;

&lt;p&gt;If you're comfortable moving forward you can roughly follow the steps below:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;If you haven't already, register a domain and setup an email with the domain you're going to use to administrate Google Cloud.&lt;/li&gt;
&lt;li&gt;Register with Google Cloud.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Warning:&lt;/strong&gt; Be cautious following Google's on-screen onboarding flow. Its purpose is to scaffold Google products for you based on your needs and answers to prompts. While I went through it and learned from it I ended up re-doing all the work it did on my own and actually removed most of the scaffolding it had done on my behalf. The reason was that over time I learned more about what "projects" are and how I wanted resources to be organized within GCP. I also discovered that some of the resources Google scaffolded for me actually immediately started incurring costs which consumed all of my initial GCP credits. After speaking with Google's support I was able to confirm there is no cost or credit forgiveness policy at Google either.&lt;/li&gt;
&lt;li&gt;As part of onboarding, set up a billing account you will attach to all the projects you later create.&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  Example project structure
&lt;/h4&gt;

&lt;p&gt;For your inspiration, below is the project structure I have implemented:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyzzmvonwofcs8o7w2f7c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyzzmvonwofcs8o7w2f7c.png" alt="Example GCP project structure" width="800" height="670"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Some notes on this structure:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Element&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Common folder&lt;/td&gt;
&lt;td&gt;Folder containing projects that will hold resources pertaining to both staging and production environments.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Production folder&lt;/td&gt;
&lt;td&gt;Folder containing projects that will hold resources only pertaining to production.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Staging folder&lt;/td&gt;
&lt;td&gt;Folder containing projects that will hold resources only pertaining to staging.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;apps-artifacts&lt;/td&gt;
&lt;td&gt;Project which will contain a resource of Google's Artifact Registry. The registry will be available to staging and production.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;apps-shared-cluster&lt;/td&gt;
&lt;td&gt;Project which will contain a Google Kubernetes Cluster (GKE) that is shared between staging and production. This is only to be used prior to launch and will be deprecated in favor of a more fault tolerant system closer to launch.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;apps-shared-sql&lt;/td&gt;
&lt;td&gt;Project which will contain a Cloud SQL instance that will be shared between staging and production. This is only to be used prior to launch and will be deprecated in favor of a more fault tolerant system closer to launch.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;apps-shared-vpc&lt;/td&gt;
&lt;td&gt;This important project should be setup first. It contains a Shared VPC that will allow resources (Cloud SQL, GKE, etc.) to communicate with each other across projects via private IP.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;production-resources&lt;/td&gt;
&lt;td&gt;Project that is empty to start off. It will later be used to contain a production-specific GKE cluster, replacing the existing shared cluster.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;staging-resources&lt;/td&gt;
&lt;td&gt;Project that is empty to start off. It will later be used to contain a staging-specific GKE cluster, replacing the existing shared cluster.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  4. Setup a Google Artifacts Registry project
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Create a project &lt;code&gt;apps-artifacts&lt;/code&gt; or &lt;code&gt;apps-docker-artifacts&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Open the project.&lt;/li&gt;
&lt;li&gt;In the left navigation select &lt;strong&gt;Artifact Registry&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Enable the Artifact Registry API.&lt;/li&gt;
&lt;li&gt;Create a registry to hold Docker images following the prompts in the UI to your liking.&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  5. Tag the Docker image based on Google's Artifact Registry
&lt;/h3&gt;

&lt;p&gt;The format to use for tagging Artifact Registry images is &lt;code&gt;LOCATION-docker.pkg.dev/PROJECT-ID/REPOSITORY/IMAGE&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Command synopsis:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker tag &amp;lt;image-to-tag-from-earlier-step&amp;gt; &amp;lt;tag&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Example command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker tag example-api-build-test northamerica-northeast2-docker.pkg.dev/apps-artifacts/docker-images/example-api-build-test:latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  6. Install the &lt;code&gt;gcloud&lt;/code&gt; command on your machine
&lt;/h3&gt;

&lt;p&gt;On your local machine you're going to be using the &lt;code&gt;gcloud&lt;/code&gt; CLI every day soon enough. Now's a good time to install it. &lt;a href="https://cloud.google.com/sdk/docs/install" rel="noopener noreferrer"&gt;Follow Google's instructions to install gcloud CLI&lt;/a&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  7. Configure and authenticate gcloud
&lt;/h3&gt;

&lt;p&gt;The first exciting thing to do with your new &lt;code&gt;gcloud&lt;/code&gt; command is to setup your configuration.&lt;/p&gt;

&lt;p&gt;See your existing configurations:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gcloud config configurations list
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Create a new configuration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gcloud config configurations create config-example-company
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Set the &lt;strong&gt;google&lt;/strong&gt; account on your currently active configuration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gcloud config &lt;span class="nb"&gt;set &lt;/span&gt;account yourname@exampleapps.net
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Authenticate gcloud with your Google account:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;gcloud auth login
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Other useful commands:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;gcloud projects list&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;gcloud config set project &amp;lt;project-name&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  8. Push the Docker image to Artifact Registry
&lt;/h3&gt;

&lt;p&gt;Configure Docker for pushing to Artifact Registry&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gcloud auth configure-docker LOCATION-docker.pkg.dev

&lt;span class="c"&gt;# Example: gcloud auth configure-docker northamerica-northeast2-docker.pkg.dev&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Push the Docker image to Artifact Registry&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker push &amp;lt;tag-from-earlier-step&amp;gt;

&lt;span class="c"&gt;# Example: docker push northamerica-northeast2-docker.pkg.dev/apps-artifacts/docker-images/example-api-build-test:latest&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  9. Set up a Shared VPC project
&lt;/h3&gt;

&lt;p&gt;If you're following the same structure of projects as I have then you're going to want to setup a Shared VPC project; A project that will serve as your networking "host" for resources spread across multiple projects. This will allow your resources across projects to communicate over private IP, reducing latency and improving security compared to public IP without the Shared VPC.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create a project &lt;code&gt;apps-shared-vpc&lt;/code&gt; in the directory &lt;code&gt;Apps/Common&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Within the project navigate to VPC Network -&amp;gt; Shared VPC.&lt;/li&gt;
&lt;li&gt;Create a Shared VPC. Reference the section &lt;strong&gt;Create a network and two subnets&lt;/strong&gt; from Google's &lt;a href="https://cloud.google.com/kubernetes-engine/docs/how-to/cluster-shared-vpc#creating_a_network_and_two_subnets" rel="noopener noreferrer"&gt;Setting up clusters with Shared VPC article&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Navigate to Kubernetes Engine -&amp;gt; Clusters.&lt;/li&gt;
&lt;li&gt;Enable the Kubernetes Engine API. It will remain unused but is required for the Shared VPC to later work with GKE.&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  10. Set up a shared GKE cluster project
&lt;/h3&gt;

&lt;p&gt;From &lt;a href="https://dev.to/morganw/software-engineering-entrepreneurship-issue-5-up-and-running-with-google-cloud-2o9c"&gt;issue 5 of my series Software Engineering Entrepreneurship&lt;/a&gt; you would have heard my recommendation to use a shared GKE cluster while you are in a pre-seed / development phase of building your own apps. You can repeat the steps below for one or many GKE projects you create depending on your use case.&lt;/p&gt;

&lt;h4&gt;
  
  
  Create the project
&lt;/h4&gt;

&lt;p&gt;Create a project &lt;code&gt;apps-shared-cluster&lt;/code&gt; in the directory &lt;code&gt;Apps/Common&lt;/code&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Grant permissions to Artifact Registry
&lt;/h4&gt;

&lt;p&gt;Because the Artifact Registry is in a separate project you need to explicitly allow the &lt;code&gt;apps-shared-cluster&lt;/code&gt; project to read images from the &lt;code&gt;apps-artifacts&lt;/code&gt; project. Without doing so, your Kubernetes deployments will fail with an image pull error.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Within the &lt;code&gt;apps-shared-cluster&lt;/code&gt; project navigate to IAM &amp;amp; Admin.&lt;/li&gt;
&lt;li&gt;Copy the Principal email for the name &lt;code&gt;Google APIs Service Agent&lt;/code&gt;, &lt;code&gt;Compute Engine default service account&lt;/code&gt; - as well as the email that resembles &lt;code&gt;&amp;lt;id&amp;gt;@cloudbuild.gserviceaccount.com&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;For each Principal email, navigate to the &lt;code&gt;apps-artifacts&lt;/code&gt; project.&lt;/li&gt;
&lt;li&gt;Navigate to IAM &amp;amp; Admin for the artifacts project.&lt;/li&gt;
&lt;li&gt;Select "Grant access" and assign the role &lt;code&gt;Artifact Registry Reader&lt;/code&gt; and &lt;code&gt;Compute Image User&lt;/code&gt; to each Principal copied from the previous step.&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  Grant permissions to networking within the Shared VPC
&lt;/h4&gt;

&lt;p&gt;In later steps you will deploy a Kubernetes cluster and relevant workloads. As part of this process GKE will attempt to automatically create firewall rules for you based on what services are available to the outside world. In order for GKE to do this it needs access in the &lt;code&gt;apps-shared-cluster&lt;/code&gt; project to control networking in the &lt;code&gt;apps-shared-vpc&lt;/code&gt; project that is the networking host. Follow the steps below to configure necessary permissions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open the project &lt;code&gt;apps-shared-cluster&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Navigate to IAM &amp;amp; Admin.&lt;/li&gt;
&lt;li&gt;For both the Principals named &lt;code&gt;Google APIs Service Agent&lt;/code&gt; and &lt;code&gt;Compute Engine default service account&lt;/code&gt; select "Grant access" and assign the principals (by email) the following roles:

&lt;ul&gt;
&lt;li&gt;Compute Network Admin&lt;/li&gt;
&lt;li&gt;Service Networking Service Agent&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  11. Set up Cloud SQL instances
&lt;/h3&gt;

&lt;p&gt;If your app is using Cloud SQL similar to my use case then you may follow the steps below to get setup.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create a project &lt;code&gt;apps-shared-sql&lt;/code&gt; if you plan on using a single shared VM for both your staging and production databases during initial development. Otherwise, create or select the project of your choosing to host your Cloud SQL instance (e.g. &lt;code&gt;staging-resources&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Within the chosen project navigate to SQL.&lt;/li&gt;
&lt;li&gt;Continue to create a Cloud SQL instance.

&lt;ol&gt;
&lt;li&gt;Ensure the instance is created on the Shared VPC you put together earlier.&lt;/li&gt;
&lt;li&gt;If prompted and you do are not familiar enough with writing your own IP ranges, choose to let Google automatically allocate an IP range (still within the Shared VPC network).&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;li&gt;With the instance created you can use Google's UI to create databases if you like. I recommend creating databases such as &lt;code&gt;example_app_staging&lt;/code&gt;, &lt;code&gt;example_app_production&lt;/code&gt;. Including the environment in the database name is helpful when you are using a shared instance or migrate to a shared instance in the future - you will avoid conflicts with database names.&lt;/li&gt;

&lt;li&gt;You can also use Google's UI to create users. I recommend creating users such as &lt;code&gt;&amp;lt;lastname&amp;gt;&amp;lt;firstinitial&amp;gt;_RW&lt;/code&gt;, &lt;code&gt;code_example_app_staging&lt;/code&gt; and &lt;code&gt;code_example_app_production&lt;/code&gt;. Following best practices of ensuring app environment have separate users from those that your team members connect to on their own clients.&lt;/li&gt;

&lt;li&gt;Securely store the username, passwords and connection details for each user created.&lt;/li&gt;

&lt;/ol&gt;




&lt;h3&gt;
  
  
  12. Create a Kubernetes cluster
&lt;/h3&gt;

&lt;p&gt;A kubernetes cluster represents an instruction to Google to reserve a node pool (physical VMs) that will later host GKE workflows. When creating GKE clusters you will have the option to self manage nodes or use Google's recommended GKE Autopilot cluster - Autopilot will automatically allocate the minimum resources (CPU, RAM and storage) to meet the needs of your workloads.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open your previously created GKE project (e.g. &lt;code&gt;apps-shared-cluster&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Navigate to Kubernetes Engine -&amp;gt; Clusters.&lt;/li&gt;
&lt;li&gt;Continue to create an Autopilot cluster (recommended) or manually manage a cluster. &lt;a href="https://cloud.google.com/kubernetes-engine/pricing" rel="noopener noreferrer"&gt;See GKE pricing&lt;/a&gt;.

&lt;ul&gt;
&lt;li&gt;If you are going to be using a shared cluster for staging and production to save costs then use a name such as &lt;code&gt;apps-shared&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Ensure the GKE cluster is created within the Shared VPC network created earlier.&lt;/li&gt;
&lt;li&gt;Here is an example configuration for my own cluster based on the Shared VPC we created earlier.
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkfyrh9nltpzvtgobe8va.png" alt="Example GKE cluster networking" width="800" height="321"&gt;
&lt;/li&gt;
&lt;li&gt;If you're unsure, choose to make the cluster public instead of private for now.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  13. Prepare secrets for staging and production
&lt;/h3&gt;

&lt;p&gt;One task you will need to endeavour is having a secrets strategy for your local, staging and production environments. In this section of the document I will share with you the secrets strategy I am personally using. This is before setting up any sort of continuous delivery approach.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Setup a Gitlab/Github organization to version control applications and secrets.&lt;/li&gt;
&lt;li&gt;Setup an isolated group and projects to store secrets for applications. For example:
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1yb04ejitkzl2dlfb9ji.png" alt="Structure of secrets groups and projects in Gitlab" width="800" height="367"&gt;
&lt;/li&gt;
&lt;li&gt;Have a folder for each environment within your secrets project. E.g &lt;code&gt;staging&lt;/code&gt; and &lt;code&gt;production&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Store files within those folders that will be pushed to Kubernetes as &lt;code&gt;secrets&lt;/code&gt; later on. Here is an example secrets yml file:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;DB&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;Connections&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;Primary&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;Host&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;11.22.70.4&lt;/span&gt;
      &lt;span class="na"&gt;Port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;3306&lt;/span&gt;
      &lt;span class="na"&gt;Username&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;code_example_app_production&lt;/span&gt;
      &lt;span class="na"&gt;Password&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;A5odaPLjBo[o#f}A$TBQ&lt;/span&gt;
      &lt;span class="na"&gt;Database&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;example_app_production&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Commit these files to your repository. We will come back to this later on when we are ready to push secrets to your Kubernetes namespaces.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  14. Create your first GKE workload
&lt;/h3&gt;

&lt;p&gt;You're now getting really close to having a running, accessible application. Now's the time to create your GKE workload. Here you will deploy your previously created artifact (HTTP application). Disclaimer though, if your application relies on secrets to establish a database connection then your workload will fail to spin up pods until those secrets are applied. Regardless though, Google's UI will only let you deploy the workload first and then apply secrets after. Follow the steps below:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Create your workload&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open your GKE project in Google's console.&lt;/li&gt;
&lt;li&gt;Navigate to Kubernetes Engine -&amp;gt; Workloads.&lt;/li&gt;
&lt;li&gt;Select "Deploy".

&lt;ol&gt;
&lt;li&gt;Select "Existing container image".&lt;/li&gt;
&lt;li&gt;Change the artifact registry source project to the project you created earlier to host your Artifact Registry (e.g. &lt;code&gt;apps-artifacts&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Select the image tag/sha you wish you deploy (e.g. &lt;code&gt;example-api-build-test:latest&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;li&gt;Continue.&lt;/li&gt;

&lt;li&gt;Configure your workload

&lt;ol&gt;
&lt;li&gt;For the deployment name, think about what you are serving. For example, if it's an HTTP API use &lt;code&gt;api&lt;/code&gt; or &lt;code&gt;backend&lt;/code&gt;. &lt;strong&gt;Note:&lt;/strong&gt; I recommend having separate namespaces for each environment. E.g. The namespace &lt;code&gt;example-app-staging&lt;/code&gt;. If you do this, you don't need to include the environment &lt;code&gt;staging&lt;/code&gt; or &lt;code&gt;production&lt;/code&gt; in your deployment name. You can simply use &lt;code&gt;api&lt;/code&gt; instead of &lt;code&gt;api-staging&lt;/code&gt;. There are other scoping benefits later on such as the name of Kubernetes secrets.&lt;/li&gt;
&lt;li&gt;For the labels I suggest the format &lt;code&gt;app: example-app-staging&lt;/code&gt; to control workload scheduling based on app and environment.&lt;/li&gt;
&lt;li&gt;For the GKE cluster select the one you created in the previous steps.&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;li&gt;Select "Continue".&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;Select "Expose deployment as a new service" to allow Google to expose a public endpoint (IP) for your created service / HTTP app.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Port 1" should be the port that will be publicly accessible.&lt;/li&gt;
&lt;li&gt;"Target port" should be the port your HTTP app is told to run on within the codebase and/or Dockerfile.&lt;/li&gt;
&lt;li&gt;"Load balancer" is the appropriate service type if you wish to expose the application to the internet directly from the Kubernetes workload.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Important:&lt;/strong&gt; Exposing your services at this level circumvents future layers of your infrastructure such as rate limiting, caching and API gateways. For the remainder of this article we will choose "Cluster IP" instead and expose the service through private IP and Cloudflare instead.&lt;/p&gt;


&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Select "Deploy"&lt;/p&gt;&lt;/li&gt;

&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Heads up&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Your Workload will attempt to start running based on the Docker image pushed to Artifact Registry. However, if that application depends on a database connection or other secret information then it is likely going to fail to start and that is completely normal for now.&lt;/p&gt;




&lt;h3&gt;
  
  
  15. Apply secrets to GKE workloads
&lt;/h3&gt;

&lt;p&gt;This step covers how you can apply secrets to your GKE namespaces in order for your dependent workloads to successfully run.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Connect to your cluster&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Navigate to Kubernetes Engine -&amp;gt; Clusters.&lt;/li&gt;
&lt;li&gt;Next to the relevant cluster select "Connect".&lt;/li&gt;
&lt;li&gt;Choose to connect through your own command line. &lt;strong&gt;Tip:&lt;/strong&gt; I recommend having the &lt;code&gt;kubectx&lt;/code&gt; command on your machine to always have visibility on which K8 context you are in.&lt;/li&gt;
&lt;li&gt;Once you are connected to the correct context you can now run through the following steps to apply secrets.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Navigate to your secret directory&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Based on the environment you are applying secrets, navigate in terminal to the directory of your CI resources / secrets repository holding the relevant file(s).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Check your namespaces&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl get namespace
# Work within the relevant namespace for all the following commands using the '-n &amp;lt;namespace&amp;gt;' flag
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Create the secret&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here is an example of applying a yml file as a secret to a staging application.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl -n &amp;lt;namespace&amp;gt; create secret generic &amp;lt;secret-name&amp;gt;-&amp;lt;secret-environment&amp;gt; --from-file=./&amp;lt;secret-file&amp;gt;

# Example: kubectl -n example-app-staging create secret generic app-config-example-app-staging --from-file=./config.yml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Take notice that even though it's applied within the specific &lt;code&gt;staging&lt;/code&gt; namespace we're still including the environment &lt;code&gt;staging&lt;/code&gt; in the name of the secret. This is a future-proof incase our team decided to move multiple environments into a single namespace at any point (not recommended.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update your deployment to mount the secret&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Even though the secret is created, it's only holding a place in Kubernetes data store without actually being used in any particular workload / deployment. We now need to edit your failing workload to (1) register a volume derived from a secret and then (2) mount a volume within the created pods.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open your GKE workload in Google Cloud.&lt;/li&gt;
&lt;li&gt;Select "Edit".&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Make the following &lt;strong&gt;additions&lt;/strong&gt; to the deployment yml. Use this as a structural and naming reference.&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;template&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;containers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;lt;do-not-edit&amp;gt;&lt;/span&gt;
        &lt;span class="na"&gt;volumeMounts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;mountPath&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/secrets"&lt;/span&gt;
            &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;app-config-example-app-staging&lt;/span&gt;
            &lt;span class="na"&gt;readOnly&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
      &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;app-config-example-app-staging&lt;/span&gt;
          &lt;span class="na"&gt;secret&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;secretName&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;app-config-example-app-staging&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;Note that correct indentation / placement is important here.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select "Save". &lt;strong&gt;Heads up:&lt;/strong&gt; Because Kubernetes and your Autopilot cluster is always managing your deployment and making changes, you may be asked to "Forcefully apply" the new deployment. This is okay to select.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;With the secret now mounted into the workload at the location &lt;code&gt;/secrets/config.yml&lt;/code&gt; the workload will now refresh, generate new pods (allow some time) and should succeed. If you continue to encounter errors you can always look at the "Logs" section of your Google Cloud workload or the "Logs Explorer" product itself in your navigation.&lt;/p&gt;




&lt;h3&gt;
  
  
  16. Prepare Cloudflare for Total SSL
&lt;/h3&gt;

&lt;p&gt;As part of our technology stack we are going to use Cloudflare as an edge DNS, SSL, Cacheing and Tunnel provider. Below are my recommendations for setting up Cloudflare:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://developers.cloudflare.com/fundamentals/get-started/setup/add-site/" rel="noopener noreferrer"&gt;Add your domain to Cloudflare.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Open your Cloudflare Dashboard.&lt;/li&gt;
&lt;li&gt;Navigate to SSL/TLS -&amp;gt; Edge Certificates.&lt;/li&gt;
&lt;li&gt;Enable "Total TLS" and opt-in to the paid add-on "Advanced Certificate Manager" ($10 / month at time of writing).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;By enabling Total TLS, Cloudflare will automatically issue SSL certificates for new DNS records whether they're created manually or through a Tunnel. This serves as a huge convenience for live applications and local development.&lt;/p&gt;




&lt;h3&gt;
  
  
  17. Expose your application using Cloudflare Tunnel
&lt;/h3&gt;

&lt;p&gt;Earlier we made the decision to expose our GKE Workload using "Cluster IP". This means the application itself is only served internally so we can add additional layers before it is exposed to the internet. In this case we are interested in placing Cloudflare between our application and the internet.&lt;/p&gt;

&lt;p&gt;We will deploy a sibling GKE Workload that leverages Cloudflare Tunnel to expose our Cluster IP to the internet via custom domain.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://developers.cloudflare.com/cloudflare-one/connections/connect-apps/install-and-setup/installation/" rel="noopener noreferrer"&gt;Install the &lt;code&gt;cloudflared&lt;/code&gt; CLI on your local machine.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;cloudflared tunnel login&lt;/code&gt; to authenticate your CLI with Cloudflare. Select the appropriate domain you will be creating tunnels for.&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;cloudflared tunnel create example-app-staging&lt;/code&gt; replacing &lt;code&gt;example-app-staging&lt;/code&gt; with your desired tunnel name.&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;cloudflared tunnel route dns example-app-staging tunnel.example.com&lt;/code&gt; again replacing the tunnel name appropriately.&lt;/li&gt;
&lt;li&gt;Copy the created credential json file into your secrets storage (i.e. Gitlab repository) for tracking. Use a name such as &lt;code&gt;cloudflare-tunnel-credential-example-app-staging.json&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;kubectl -n example-app-staging create secret generic cloudflare-tunnel-credential-example-app-staging --from-file=credentials.json=/&amp;lt;path-from-earlier-output&amp;gt;/&amp;lt;tunnel-id&amp;gt;.json&lt;/code&gt; replacing the namespace, secret name and tunnel credential path appropriately.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Now create your Cloudflare Tunnel config using a name such as &lt;code&gt;cloudflare-tunnel-config-example-app-staging.yml&lt;/code&gt;. Reference the following template or &lt;a href="https://raw.githubusercontent.com/cloudflare/argo-tunnel-examples/master/named-tunnel-k8s/cloudflared.yaml" rel="noopener noreferrer"&gt;see the bottom of Cloudflare's K8 example yaml&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;tunnel&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;example-app-staging&lt;/span&gt;
&lt;span class="na"&gt;credentials-file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/etc/cloudflared/creds/credentials.json&lt;/span&gt;
&lt;span class="c1"&gt;# Serves the metrics server under /metrics and the readiness server under /ready&lt;/span&gt;
&lt;span class="na"&gt;metrics&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;0.0.0.0:2000&lt;/span&gt;
&lt;span class="c1"&gt;# Autoupdates applied in a k8s pod will be lost when the pod is removed or restarted, so&lt;/span&gt;
&lt;span class="c1"&gt;# autoupdate doesn't make sense in Kubernetes. However, outside of Kubernetes, we strongly&lt;/span&gt;
&lt;span class="c1"&gt;# recommend using autoupdate.&lt;/span&gt;
&lt;span class="na"&gt;no-autoupdate&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="c1"&gt;# The `ingress` block tells cloudflared which local service to route incoming&lt;/span&gt;
&lt;span class="c1"&gt;# requests to. For more about ingress rules, see&lt;/span&gt;
&lt;span class="c1"&gt;# https://developers.cloudflare.com/cloudflare-one/connections/connect-apps/configuration/ingress&lt;/span&gt;
&lt;span class="c1"&gt;#&lt;/span&gt;
&lt;span class="c1"&gt;# Remember, these rules route traffic from cloudflared to a local service. To route traffic&lt;/span&gt;
&lt;span class="c1"&gt;# from the internet to cloudflared, run `cloudflared tunnel route dns &amp;lt;tunnel&amp;gt; &amp;lt;hostname&amp;gt;`.&lt;/span&gt;
&lt;span class="c1"&gt;# E.g. `cloudflared tunnel route dns example-tunnel tunnel.example.com`.&lt;/span&gt;
&lt;span class="na"&gt;ingress&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="c1"&gt;# The first rule proxies traffic to the httpbin sample Service defined in app.yaml&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;hostname&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;example-app.staging.exampleapps.net&lt;/span&gt;
    &lt;span class="na"&gt;service&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;http://api-service:80&lt;/span&gt;
  &lt;span class="c1"&gt;# This rule matches any traffic which didn't match a previous rule, and responds with HTTP 404.&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;service&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;http_status:404&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Create a secret for the config within the same namespace as the service you're exposing.&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl &lt;span class="nt"&gt;-n&lt;/span&gt; example-app-staging create secret generic cloudflare-tunnel-config-example-app-staging &lt;span class="nt"&gt;--from-file&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;config.yaml&lt;span class="o"&gt;=&lt;/span&gt;./cloudflare-tunnel-config-example-app-staging.yml
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Construct a Kubernetes deployment (i.e. &lt;code&gt;api-cloudflare-tunnel.yml&lt;/code&gt;) based on &lt;a href="https://github.com/cloudflare/argo-tunnel-examples/blob/master/named-tunnel-k8s/cloudflared.yaml" rel="noopener noreferrer"&gt;Cloudflare's example yml here&lt;/a&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use a deployment name of your choosing. One suggestion is &lt;code&gt;cloudflare-tunnel-&amp;lt;deployment-to-expose&amp;gt;&lt;/code&gt; (e.g. &lt;code&gt;cloudflare-tunnel-api&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Make the following &lt;strong&gt;edits&lt;/strong&gt; to the deployment yml. Use this as a structural and naming reference.&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;template&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;containers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;lt;do-not-edit&amp;gt;&lt;/span&gt;
        &lt;span class="na"&gt;volumeMounts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;mountPath&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/etc/cloudflared/creds"&lt;/span&gt;
            &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;cloudflare-tunnel-credential-example-app-staging&lt;/span&gt;
            &lt;span class="na"&gt;readOnly&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;mountPath&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/etc/cloudflared/config"&lt;/span&gt;
            &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;cloudflare-tunnel-config-example-app-staging&lt;/span&gt;
            &lt;span class="na"&gt;readOnly&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
      &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;cloudflare-tunnel-credential-example-app-staging&lt;/span&gt;
          &lt;span class="na"&gt;secret&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;secretName&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;cloudflare-tunnel-credential-example-app-staging&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;cloudflare-tunnel-config-example-app-staging&lt;/span&gt;
          &lt;span class="na"&gt;secret&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;secretName&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;cloudflare-tunnel-config-example-app-staging&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;Note that correct indentation / placement is important here.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Apply the new deployment under the same Kubernetes context and namespace as the service you're trying to expose. With our staging example app as an example, that would be:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl &lt;span class="nt"&gt;-n&lt;/span&gt; example-app-staging apply &lt;span class="nt"&gt;-f&lt;/span&gt; api-cloudflare-tunnel.yml
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Your GKE Workload pods will recognize the new changes and should now succeed in starting the tunnel.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Important:&lt;/strong&gt; Be sure to set the maximum number of replicas for your Cloudflare GKE Workload to 1. This is to support only having 1 tunnel running as duplicates will fail.&lt;/p&gt;




&lt;h3&gt;
  
  
  18. See your application live 🎉
&lt;/h3&gt;

&lt;p&gt;This is where all of your hard work pays off. While there are still many improvements to make to the current infrastructure you should see that your application is now available through your custom domain using private IP and a secure Tunnel to Cloudflare!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ferx291tx3sv6oq34qvh6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ferx291tx3sv6oq34qvh6.png" alt="Example health check endpoint" width="800" height="142"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You now have an application available to the internet with a database and auto-scaling capabilities.&lt;/p&gt;




&lt;h2&gt;
  
  
  Where does our trip take us next? 🚀
&lt;/h2&gt;

&lt;p&gt;The fun doesn't stop here. Continue visiting this page and following the &lt;a href="https://dev.to/morganw/series/22021"&gt;Software Engineering Entrepreneurship series&lt;/a&gt;. I will take you along the journey as we work on improved security measures, building out CI/CD and more.&lt;/p&gt;




&lt;h2&gt;
  
  
  Changelog
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;February 24, 2023&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Removed the previous use of exposing our GKE Workload using a public IP load balancer. This document now covers securing your application behind a private IP and establishing a Tunnel directly to Cloudflare and your custom domain.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Stay connected 💬
&lt;/h2&gt;

&lt;p&gt;I would love to connect with you and follow journeys of your own in life. Connect with me on &lt;a href="https://www.linkedin.com/in/morganwowk/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;, &lt;a href="https://twitter.com/game_of_morgan" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt; or our home at DEV.&lt;/p&gt;

</description>
      <category>memes</category>
    </item>
    <item>
      <title>Software Engineering Entrepreneurship » Issue 5 » Up and running with Google Cloud</title>
      <dc:creator>Morgan Wowk</dc:creator>
      <pubDate>Sat, 18 Feb 2023 06:12:13 +0000</pubDate>
      <link>https://dev.to/morganw/software-engineering-entrepreneurship-issue-5-up-and-running-with-google-cloud-2o9c</link>
      <guid>https://dev.to/morganw/software-engineering-entrepreneurship-issue-5-up-and-running-with-google-cloud-2o9c</guid>
      <description>&lt;h2&gt;
  
  
  Recap
&lt;/h2&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/morganw" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F882357%2Ff8f3140f-7482-4648-9d30-5efe26d55ecd.jpeg" alt="morganw"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/morganw/software-engineering-entrepreneurship-issue-4-our-tech-stack-of-choice-3ado" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Software Engineering Entrepreneurship » Issue 4 » Our tech. stack of choice&lt;/h2&gt;
      &lt;h3&gt;Morgan Wowk ・ Feb 9 '23&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#productivity&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#architecture&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#startup&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#career&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


&lt;blockquote&gt;
&lt;p&gt;...[&lt;strong&gt;your leading cloud provider&lt;/strong&gt;] combined with other edge technologies (DNS, API gateways, etc.) are constantly evolving and have steep learning curves. The payoff of having a resilient, scalable system that promotes fail-fast business is entirely what this series will focus on.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Terms on this page
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Term&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;GCP&lt;/td&gt;
&lt;td&gt;GCP stands for Google Cloud Platform.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GKE&lt;/td&gt;
&lt;td&gt;GKE stands for Google Kubernetes Engine.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GKE Cluster&lt;/td&gt;
&lt;td&gt;A Kubernetes cluster managed by Google.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GKE Workload&lt;/td&gt;
&lt;td&gt;Kubernetes services, deployments and pods managed by Google.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;VM&lt;/td&gt;
&lt;td&gt;Virtual Machine. AKA "server".&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Our blind approach to getting started (bittersweet)
&lt;/h2&gt;

&lt;p&gt;Learning Google Cloud has been and continues to be a long journey spanning over many months. The technology evolves quickly; Along with it thousands of supporting documents and resources have spread across the web and Google's domain. The sheer amount of content available to help you doubles as the largest factor capable of holding you back.&lt;/p&gt;

&lt;p&gt;To counter this massive task of deciphering Google Cloud docs, you can take the approach of immersing yourself in the technology first and then optimizing later. This means having an understanding of which products you know you will use, and then literally going in and interacting with those products.&lt;/p&gt;




&lt;h2&gt;
  
  
  System design visualizations
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Option A: Many VMs for high fault tolerance
&lt;/h3&gt;

&lt;p&gt;When taking the head-first approach to learning GCP it was easy for me to strive to build the system that I figured would be the most performant and fault tolerant. There would be a staging environment isolated entirely to its own machines which would scale separately from production. Moreover, if any single component failed, be it staging, production, database or application, the rest of the network would have a good chance of still being available.&lt;/p&gt;

&lt;p&gt;Where this mentality of striving for the optimal system falters itself however is the cost and unused resources. For each extra VM you operate you're paying $40-100+/month. During your initial stages of development this is not practical for individuals. The exception here is if you are working with a fast moving team and your launch phase is not far into the future.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7aqbgtzn5m9mz7vjq05a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7aqbgtzn5m9mz7vjq05a.png" alt="Diagram showing multiple GKE clusters and Cloud SQL instances" width="800" height="528"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Option B: Shared VMs for reduced costs
&lt;/h3&gt;

&lt;p&gt;Below you can see an alternate infrastructure that demonstrates how you can achieve the same outcome while operating on fewer resources. One of many drawbacks here is that you have a single point of failure shared between staging and production for both your GKE cluster and database. If one goes, they both go. The huge benefit here is that you're saving heavily on VM costs while initially building your application.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp8zgowl0y9nddqfyot1g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp8zgowl0y9nddqfyot1g.png" alt="Diagram showing single GKE cluster and Cloud SQL instance" width="800" height="353"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Recommendation 📌
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Use shared VMs then migrate to many VMs before launch.&lt;/strong&gt; This approach requires that you maintain strong documentation for setting up your infrastructure. You will need to recall your experience working with cloud products to minimize the time you spend migrating closer to launching applications. By taking this approach you can save yourself hundreds of dollars each month during your pre-seed/development phase.&lt;/p&gt;




&lt;h2&gt;
  
  
  Further improvements
&lt;/h2&gt;

&lt;p&gt;Our article above explains how to engineer a system that allows for shared VM vs per-environment VMs. The flaw of the above systems is that the Kubernetes systems are directly exposed to the internet using an external endpoint / public IP. The con of this approach is that your traffic is going directly to your workloads without additional layers such as an API gateway or Cloud provider to route and secure traffic through.&lt;/p&gt;

&lt;p&gt;Find below an example of a more secure system design using Cloudflare Tunnels to secure traffic within the cluster:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fymsp339n0jyn14ebae9w.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fymsp339n0jyn14ebae9w.jpg" alt="Diagram showing Cloudflare Tunnel within GKE" width="800" height="308"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Benefits of routing through a Cloud platform such as Cloudflare include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Caching&lt;/li&gt;
&lt;li&gt;Cyber attack detection, prevention, and more advanced edge protection&lt;/li&gt;
&lt;li&gt;Automatic domain assignment and SSL rotation&lt;/li&gt;
&lt;li&gt;Reduced latency using private IP and direct communicate to Cloudflare&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Bonus issue (Continue reading)
&lt;/h2&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/morganw" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F882357%2Ff8f3140f-7482-4648-9d30-5efe26d55ecd.jpeg" alt="morganw"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/morganw/deploying-an-http-app-using-docker-gke-cloudflare-living-document-4db7" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Deploying an HTTP app using Docker + GKE + Cloudflare&lt;/h2&gt;
      &lt;h3&gt;Morgan Wowk ・ Feb 23 '23&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#googlecloud&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#kubernetes&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#docker&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#startup&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
      <category>computerscience</category>
      <category>learning</category>
      <category>vibecoding</category>
    </item>
    <item>
      <title>Software Engineering Entrepreneurship » Issue 4 » Our tech. stack of choice</title>
      <dc:creator>Morgan Wowk</dc:creator>
      <pubDate>Thu, 09 Feb 2023 04:25:55 +0000</pubDate>
      <link>https://dev.to/morganw/software-engineering-entrepreneurship-issue-4-our-tech-stack-of-choice-3ado</link>
      <guid>https://dev.to/morganw/software-engineering-entrepreneurship-issue-4-our-tech-stack-of-choice-3ado</guid>
      <description>&lt;h2&gt;
  
  
  Recap
&lt;/h2&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/morganw" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dA3F1YnW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://res.cloudinary.com/practicaldev/image/fetch/s--v3istl1F--/c_fill%2Cf_auto%2Cfl_progressive%2Ch_150%2Cq_auto%2Cw_150/https://dev-to-uploads.s3.amazonaws.com/uploads/user/profile_image/882357/f8f3140f-7482-4648-9d30-5efe26d55ecd.jpeg" alt="morganw"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/morganw/software-engineering-entrepreneurship-issue-3-investing-in-cloud-technology-1l26" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Software Engineering Entrepreneurship » Issue 3 » Investing in cloud technology&lt;/h2&gt;
      &lt;h3&gt;Morgan Wowk ・ Feb 7&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#productivity&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#architecture&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#startup&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#career&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


&lt;blockquote&gt;
&lt;p&gt;Technology can be your greatest ally or your greatest threat.&lt;br&gt;
...&lt;br&gt;
Serious about your dream to start a company? Don't rush it.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Cutting edge vs. familiar tech. stacks
&lt;/h2&gt;

&lt;p&gt;Let's go through an exercise.&lt;/p&gt;

&lt;p&gt;One decision you could make for your startup is adopting serverless technology (e.g. Cloud Functions). There are cost, performance and time saving benefits. Yet, nearly everything you can achieve serverless can still be done in traditional, hosted applications that you're likely used to.&lt;/p&gt;

&lt;p&gt;So the question is, do you spend your time learning a whole new technology or stick to what you're good at?&lt;/p&gt;

&lt;p&gt;For this series we're going to go with the answer of: &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For writing applications, stick to what you know. For your infrastructure however, choose a leading Cloud Service Provider.&lt;/strong&gt; At time of writing that is a top 3 of AWS, Microsoft Azure or GCP. These providers, combined with other edge technologies (DNS, API gateways, etc.) are constantly evolving and have steep learning curves. The payoff of having a resilient, scalable system that promotes fail-fast business is entirely what this series will focus on.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tip:&lt;/strong&gt; If you're working on excelling in your day job in parallel, consider going with a provider that will make you more valuable to that team as well.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Disclaimer:&lt;/strong&gt; The learning curve for a cloud provider giant is steep. Give yourself and your team several months to learn the technology and build a sample app if it is your first go at it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Our tech. stack for the rest of this series
&lt;/h2&gt;

&lt;p&gt;Below is the tech. stack we will piece together throughout this series along with a pricing estimate for each.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--q5YBXgAf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/uqzxyxqqlfbx6xwg5adk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--q5YBXgAf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/uqzxyxqqlfbx6xwg5adk.png" alt="Image description" width="515" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Edge / DNS provider
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Service:&lt;/strong&gt; Cloudflare&lt;br&gt;
&lt;strong&gt;Products:&lt;/strong&gt; Tunnel, Advanced Certificate Manager&lt;br&gt;
&lt;strong&gt;Price:&lt;/strong&gt; $10.00 USD / month&lt;/p&gt;
&lt;h3&gt;
  
  
  API gateway
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Service:&lt;/strong&gt; Kong&lt;br&gt;
&lt;strong&gt;Products:&lt;/strong&gt; Routing, Authentication, Dev Portal&lt;br&gt;
&lt;strong&gt;Price:&lt;/strong&gt; $0 - $250 / month&lt;/p&gt;
&lt;h3&gt;
  
  
  Cloud Service Provider
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Service:&lt;/strong&gt; Google Cloud Platform&lt;br&gt;
&lt;strong&gt;Products:&lt;/strong&gt; IAM, Cloud SQL, Artifact Registry, Kubernetes Engine&lt;br&gt;
&lt;strong&gt;Price:&lt;/strong&gt; Usage based&lt;/p&gt;
&lt;h3&gt;
  
  
  Version Control System
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Service:&lt;/strong&gt; Gitlab&lt;br&gt;
&lt;strong&gt;Products:&lt;/strong&gt; Version control&lt;br&gt;
&lt;strong&gt;Price:&lt;/strong&gt; Free&lt;/p&gt;
&lt;h3&gt;
  
  
  CI/CD
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Service:&lt;/strong&gt; Gitlab&lt;br&gt;
&lt;strong&gt;Products:&lt;/strong&gt; Gitlab CI, Advanced VCS&lt;br&gt;
&lt;strong&gt;Price:&lt;/strong&gt; $228 USD / year&lt;/p&gt;
&lt;h3&gt;
  
  
  Containerization
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Service:&lt;/strong&gt; Docker&lt;br&gt;
&lt;strong&gt;Products:&lt;/strong&gt; Images, Containers, Compose&lt;br&gt;
&lt;strong&gt;Price:&lt;/strong&gt; Free&lt;/p&gt;
&lt;h3&gt;
  
  
  Development
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Language:&lt;/strong&gt; Go&lt;br&gt;
&lt;strong&gt;Editor:&lt;/strong&gt; GoLand&lt;br&gt;
&lt;strong&gt;Editor price:&lt;/strong&gt; $150 - $250 USD / year&lt;br&gt;
&lt;strong&gt;Free alternative:&lt;/strong&gt; VS Code&lt;br&gt;
&lt;strong&gt;Context:&lt;/strong&gt; APIs&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Language:&lt;/strong&gt; JavaScript, Node.js&lt;br&gt;
&lt;strong&gt;Editor:&lt;/strong&gt; VS Code&lt;br&gt;
&lt;strong&gt;Editor price:&lt;/strong&gt; Free&lt;br&gt;
&lt;strong&gt;Context:&lt;/strong&gt; Web apps, mobile apps&lt;/p&gt;
&lt;h3&gt;
  
  
  Total cost estimate
&lt;/h3&gt;

&lt;p&gt;~$348 USD / year + usage based fees (GCP)&lt;/p&gt;

&lt;p&gt;The figure above is assuming we use the most probable plan for all the mentioned services and excludes paid editors. While starting out there's a good chance the free plan for Kong will suffice. Nonetheless it's best to be prepared for the paid tiers and explore competitors as generally business will lead you in that direction as requirements or limitations arise. &lt;/p&gt;
&lt;h3&gt;
  
  
  A note on saving costs
&lt;/h3&gt;

&lt;p&gt;You can find substitute services or choose not to use some services. This depends on the problems you're concerned about solving and your budget. For example, manually implementing authentication, rate limiting, etc. and dodging the API gateway - Or managing your own SSL certificates and dodging Cloudflare's Total TLS. I would only caution that these services exist for your ultimate convenience, security and beyond. The more you choose to do on your own, the less you can focus on the innovative ideas and development that will allow you to grow.&lt;/p&gt;


&lt;h2&gt;
  
  
  Continue reading
&lt;/h2&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/morganw" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dA3F1YnW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://res.cloudinary.com/practicaldev/image/fetch/s--v3istl1F--/c_fill%2Cf_auto%2Cfl_progressive%2Ch_150%2Cq_auto%2Cw_150/https://dev-to-uploads.s3.amazonaws.com/uploads/user/profile_image/882357/f8f3140f-7482-4648-9d30-5efe26d55ecd.jpeg" alt="morganw"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/morganw/software-engineering-entrepreneurship-issue-5-up-and-running-with-google-cloud-2o9c" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Software Engineering Entrepreneurship » Issue 5 » Up and running with Google Cloud&lt;/h2&gt;
      &lt;h3&gt;Morgan Wowk ・ Feb 18&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#googlecloud&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#architecture&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#startup&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#career&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;





&lt;h4&gt;
  
  
  Sources
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://www.c-sharpcorner.com/article/top-10-cloud-service-providers/"&gt;https://www.c-sharpcorner.com/article/top-10-cloud-service-providers/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>architecture</category>
      <category>startup</category>
      <category>career</category>
    </item>
    <item>
      <title>Software Engineering Entrepreneurship » Issue 3 » Investing in cloud technology</title>
      <dc:creator>Morgan Wowk</dc:creator>
      <pubDate>Tue, 07 Feb 2023 00:42:16 +0000</pubDate>
      <link>https://dev.to/morganw/software-engineering-entrepreneurship-issue-3-investing-in-cloud-technology-1l26</link>
      <guid>https://dev.to/morganw/software-engineering-entrepreneurship-issue-3-investing-in-cloud-technology-1l26</guid>
      <description>&lt;h2&gt;
  
  
  Recap
&lt;/h2&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/morganw" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F882357%2Ff8f3140f-7482-4648-9d30-5efe26d55ecd.jpeg" alt="morganw"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/morganw/software-engineering-entrepreneurship-issue-2-resilient-people-and-systems-11a3" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Software Engineering Entrepreneurship » Issue 2 » Resilient people and systems&lt;/h2&gt;
      &lt;h3&gt;Morgan Wowk ・ Feb 5 '23&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#devrel&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#devto&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#announcement&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#community&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;





&lt;h2&gt;
  
  
  Invest big now and save when it matters most
&lt;/h2&gt;

&lt;p&gt;Technology can be your greatest ally or your greatest threat. &lt;/p&gt;

&lt;p&gt;Growing your company fast in the future doesn't equate to working fast now. If you're willing to settle on the technology you invest in today then you have to understand that technology will demand your attention again in the future. Investing in a limited foundation early means the growth of your company in its most critical time of growth will stall significantly.&lt;/p&gt;

&lt;p&gt;Let's paint a scenario.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;January 2024 💡&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I'm going to build a mobile app. I'll develop it entirely on my Windows machine. After each change I will commit my code to git, &lt;code&gt;ssh&lt;/code&gt; into a Digital Ocean droplet and then pull the latest &lt;code&gt;main&lt;/code&gt; branch. If I work hard enough I can make this app in a couple months, get it out there and start getting my first users.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;April 2024 (3 months later) 📈&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This is awesome. I now have 60 installs of my app, a few 5 star reviews and a couple 2 stars I am working on addressing.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;June 2024 (2 months later) 😨&lt;/strong&gt; &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;We have 300 installs. However, users are complaining about page loads up to 60 seconds. I now have more negative reviews than positive. I got a new laptop last month and it's going to take me a couple weeks to get everything working again on my machine. I'm afraid of losing all my users!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;July 2024 (1 month later) 😭&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I've received advice to invest in a larger server, implement rate limiting and switch to AWS or Google Cloud for advanced security controls to prevent attacks. I'm afraid all of this is going to take several months and I'll need to worry about transferring all my existing data. I've lost over half my users. This is a nightmare.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Give it time. Put in the time.
&lt;/h2&gt;

&lt;p&gt;Serious about your dream to start a company? Don't rush it. Investing your time and money in a smart technology stack can be scary when you're only in a seed stage. Yet, I will guarantee that if you're confident in your ability to learn new tech. then making this investment will only set you up for success when it's time to go-to-market and grow fast. Launch your product and let it thrive.&lt;/p&gt;




&lt;h2&gt;
  
  
  Rinse-and-repeat mentality. Fail-fast always.
&lt;/h2&gt;

&lt;p&gt;Throughout your journey you should always be prepared to go further, faster. In business in general you have to let innovation fuel your growth. Whether an idea has failed entirely or you're looking publish your &lt;code&gt;nth&lt;/code&gt; new app, you should have a rinse-and-repeat mentality the whole way through.&lt;/p&gt;

&lt;p&gt;The best case scenario is that every piece of a system your app depends on (servers, databases, permissions, pipelines, etc.) can be recreated faster the second time around. Always &lt;strong&gt;track your steps&lt;/strong&gt; (document) and &lt;strong&gt;find a balance of automating tasks&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Concrete advice
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Think about developing your company in years rather than months.&lt;/li&gt;
&lt;li&gt;Embrace big infrastructure for your small startup.&lt;/li&gt;
&lt;li&gt;Let your tech. stack solve common problems (e.g. SSL, firewalls, rate limiting, etc.) for you.&lt;/li&gt;
&lt;li&gt;Build a prototype / sample app using big infrastructure.&lt;/li&gt;
&lt;li&gt;Be obsessed with tracking your steps.&lt;/li&gt;
&lt;li&gt;If you can anticipate repeating a task again in the future, leverage documentation or automation to save time.&lt;/li&gt;
&lt;li&gt;Imagine hiring team members to do the jobs you're doing. Make your actions reproducible and your responsibilities transferable.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Continue reading
&lt;/h2&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/morganw" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F882357%2Ff8f3140f-7482-4648-9d30-5efe26d55ecd.jpeg" alt="morganw"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/morganw/software-engineering-entrepreneurship-issue-4-our-tech-stack-of-choice-3ado" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Software Engineering Entrepreneurship » Issue 4 » Our tech. stack of choice&lt;/h2&gt;
      &lt;h3&gt;Morgan Wowk ・ Feb 9 '23&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#productivity&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#architecture&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#startup&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#career&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
      <category>announcement</category>
      <category>devto</category>
      <category>web3</category>
      <category>blockchain</category>
    </item>
    <item>
      <title>Software Engineering Entrepreneurship » Issue 2 » Resilient people and systems</title>
      <dc:creator>Morgan Wowk</dc:creator>
      <pubDate>Sun, 05 Feb 2023 19:53:32 +0000</pubDate>
      <link>https://dev.to/morganw/software-engineering-entrepreneurship-issue-2-resilient-people-and-systems-11a3</link>
      <guid>https://dev.to/morganw/software-engineering-entrepreneurship-issue-2-resilient-people-and-systems-11a3</guid>
      <description>&lt;h2&gt;
  
  
  Recap
&lt;/h2&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/morganw" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F882357%2Ff8f3140f-7482-4648-9d30-5efe26d55ecd.jpeg" alt="morganw"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/morganw/software-engineering-entrepreneurship-day-1-ice-breaker-ik5" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Software Engineering Entrepreneurship » Issue 1 » Ice breaker&lt;/h2&gt;
      &lt;h3&gt;Morgan Wowk ・ Feb 2 '23&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#crypto&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#blockchain&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#web3&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#offers&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


&lt;blockquote&gt;
&lt;p&gt;In this first edition of Software Engineering Entrepreneurship I will take you through the journey of laying the groundwork for an ambiguous future as a technology leader.&lt;/p&gt;
&lt;/blockquote&gt;






&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;Edition&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Feb. &lt;/span&gt;&lt;span class="m"&gt;2023&lt;/span&gt;
&lt;span class="na"&gt;Issue&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;
&lt;span class="na"&gt;Dates covered&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Feb. 2-5&lt;/span&gt;
&lt;span class="na"&gt;Subject&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Resilient people and systems&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  Why &lt;strong&gt;now&lt;/strong&gt; and not &lt;strong&gt;yesterday&lt;/strong&gt; or &lt;strong&gt;tomorrow&lt;/strong&gt;?
&lt;/h2&gt;

&lt;p&gt;I'll admit that in earlier stages of my life I would not be ready to take on the challenge we're about to endeavour. In fact, it was only an epiphany in the last year where I realized everything is lined up to not just start a business, but start executing a strategy that is resilient to failure. A combination of experience building Bold in the e-commerce space and developing skills over several years has enabled me to have a clear vision on starting a tech. company of my own. &lt;/p&gt;


&lt;h2&gt;
  
  
  Backstory: Waiting for just the right idea
&lt;/h2&gt;

&lt;p&gt;Consistently since being young I have said to myself and those around me "I'm going to start a company one day." Meanwhile, all around we see talented people of all ages successfully starting up companies or failing to. For me however, it was always about waiting for the big idea that would come when the stars perfectly aligned; it would be a sure success.&lt;/p&gt;


&lt;h2&gt;
  
  
  Realization: The "big idea" is a fallacy
&lt;/h2&gt;

&lt;p&gt;I have grown to realize over the years the idea of there being a "big idea" is a distraction from reality. That's not to say dreaming of a crystal clear business idea hasn't help me personally - but it doesn't paint the right picture to how successful companies come into existence.&lt;/p&gt;

&lt;p&gt;If you listen close enough to successful companies and individuals you'll always hear a common theme: The first idea is never what got them where they are today; it's not even who they are today. They've had highs and lows, been defeated in the market and in many cases pivoted business altogether.&lt;/p&gt;


&lt;h2&gt;
  
  
  Our mission: Fail-fast with big infrastructure
&lt;/h2&gt;

&lt;p&gt;Throughout this series we will dive deep into constructing a fail-fast infrastructure. The infrastructure will support a culture of continuous innovation and shorten the path to go-to-market on new ideas. It will support all the following requirements:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Launching a new app or API in days. Including:

&lt;ol&gt;
&lt;li&gt;A containerized development environment.&lt;/li&gt;
&lt;li&gt;A staging and production environment.&lt;/li&gt;
&lt;li&gt;A CI/CD pipeline with support for JS and Go applications.&lt;/li&gt;
&lt;li&gt;Auto-scaling to meet new demands.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Deploying mobile apps, web apps and APIs.&lt;/li&gt;
&lt;li&gt;An API gateway to reduce the network complexity (rate limiting, authentication, middleware, etc.) of individual apps or APIs.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;With this infrastructure we have accepted the fact that there is no silver bullet to successful startups. Rather, we are preparing ourselves to hit the ground running on any given app idea. Further, we are preparing ourselves to be able to quickly develop and deploy multiple branches of the same business (e.g. multiple related apps) in short succession.&lt;/p&gt;


&lt;h2&gt;
  
  
  Continue reading
&lt;/h2&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/morganw" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F882357%2Ff8f3140f-7482-4648-9d30-5efe26d55ecd.jpeg" alt="morganw"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/morganw/software-engineering-entrepreneurship-issue-3-investing-in-cloud-technology-1l26" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Software Engineering Entrepreneurship » Issue 3 » Investing in cloud technology&lt;/h2&gt;
      &lt;h3&gt;Morgan Wowk ・ Feb 7 '23&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#productivity&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#architecture&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#startup&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#career&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;



</description>
      <category>devrel</category>
      <category>devto</category>
      <category>announcement</category>
      <category>community</category>
    </item>
    <item>
      <title>Software Engineering Entrepreneurship » Issue 1 » Ice breaker</title>
      <dc:creator>Morgan Wowk</dc:creator>
      <pubDate>Thu, 02 Feb 2023 04:28:22 +0000</pubDate>
      <link>https://dev.to/morganw/software-engineering-entrepreneurship-day-1-ice-breaker-ik5</link>
      <guid>https://dev.to/morganw/software-engineering-entrepreneurship-day-1-ice-breaker-ik5</guid>
      <description>&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;Edition&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Feb. &lt;/span&gt;&lt;span class="m"&gt;2023&lt;/span&gt;
&lt;span class="na"&gt;Issue&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
&lt;span class="na"&gt;Dates covered&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Feb. &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
&lt;span class="na"&gt;Subject&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Ice breaker&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  What you're probably feeling right now
&lt;/h2&gt;

&lt;p&gt;I'd like to answer 2 questions that are probably going through your mind:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;"Will reading this help me personally?"&lt;/li&gt;
&lt;li&gt;"If yes, who are you?"&lt;/li&gt;
&lt;/ol&gt;


&lt;h2&gt;
  
  
  What I can offer you
&lt;/h2&gt;

&lt;p&gt;In this first edition of Software Engineering Entrepreneurship I will take you through the journey of laying the groundwork for an ambiguous future as a technology leader. I will define and implement the infrastructure and sample app of a company that's built to scale, fail fast (iterate) and provide a secure, reliable product to thousands of users.&lt;/p&gt;


&lt;h2&gt;
  
  
  Who is this targeted to?
&lt;/h2&gt;

&lt;p&gt;Continue reading if this is you: &lt;/p&gt;

&lt;p&gt;"I will start a tech. company of my own one day!"&lt;/p&gt;

&lt;p&gt;With that, the important note here is that I will be speaking in the shoes of a Software Engineer-by-day. Yet, the topics covered would be considered advanced for any Engineer. At larger companies, part of what I'll cover would even fall under separate teams such as IT or DevOps.&lt;/p&gt;


&lt;h2&gt;
  
  
  "Okay, I'm sold. Now who are you?"
&lt;/h2&gt;

&lt;p&gt;Hey that's super awesome! If you're seriously up for following along, I would love to hear your takeaways along the way. Please comment or reach out at any time.&lt;/p&gt;

&lt;p&gt;I am happy to introduce myself. I am Morgan Wowk from the giant multi-biome land of Canada 🇨🇦. Originally from the fields of endless wheat and now on the West Coast taking a bath. I have worked in e-commerce for nearly 7 years and have been at a company &lt;strong&gt;&lt;a href="https://www.linkedin.com/company/boldcommerce/" rel="noopener noreferrer"&gt;Bold Commerce&lt;/a&gt;&lt;/strong&gt; the whole way through - proudly cutting the taboo about staying at one place too long 😏.&lt;/p&gt;


&lt;h2&gt;
  
  
  Format and schedule
&lt;/h2&gt;

&lt;p&gt;I won't promise a detailed tutorial as we take this journey.&lt;/p&gt;

&lt;p&gt;Instead, I will promise learning advice, decisions, discoveries, successes and an inspirational perspective on how you can do more to unlock a life as the founder of your dream technology company.&lt;/p&gt;

&lt;p&gt;I am so excited to share updates with you &lt;strong&gt;every Thursday&lt;/strong&gt; throughout February 2023 with the occasional bonus days.&lt;/p&gt;


&lt;h2&gt;
  
  
  Continue reading
&lt;/h2&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/morganw" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F882357%2Ff8f3140f-7482-4648-9d30-5efe26d55ecd.jpeg" alt="morganw"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/morganw/software-engineering-entrepreneurship-issue-2-resilient-people-and-systems-11a3" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Software Engineering Entrepreneurship » Issue 2 » Resilient people and systems&lt;/h2&gt;
      &lt;h3&gt;Morgan Wowk ・ Feb 5 '23&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#productivity&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#architecture&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#startup&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#career&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;



</description>
      <category>crypto</category>
      <category>blockchain</category>
      <category>web3</category>
      <category>offers</category>
    </item>
  </channel>
</rss>
