<?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: Gianni Carafa</title>
    <description>The latest articles on DEV Community by Gianni Carafa (@shoksuno).</description>
    <link>https://dev.to/shoksuno</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%2F960811%2F95fa6c99-fb7c-42e8-a97f-e0aeee16cf4a.png</url>
      <title>DEV Community: Gianni Carafa</title>
      <link>https://dev.to/shoksuno</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/shoksuno"/>
    <language>en</language>
    <item>
      <title>Kubero vs Coolify</title>
      <dc:creator>Gianni Carafa</dc:creator>
      <pubDate>Mon, 20 Jan 2025 16:08:24 +0000</pubDate>
      <link>https://dev.to/shoksuno/kubero-vs-coolify-3po0</link>
      <guid>https://dev.to/shoksuno/kubero-vs-coolify-3po0</guid>
      <description>&lt;p&gt;In the evolving landscape of Platform as a Service (PaaS) solutions, developers seek platforms that streamline application deployment and management. Coolify and Kubero are both open-source, self-hosted PaaS platforms catering to this need. While both offer robust features, Kubero distinguishes itself with several advanced capabilities that provide a competitive edge.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kubero
&lt;/h2&gt;

&lt;p&gt;Kubero is a PaaS tailored specifically for Kubernetes environments, emphasizing simplicity and scalability for deploying 12-factor applications. It supports multiple languages and frameworks through buildpacks, including PHP, Ruby, Golang, Rust, Node.js, and Deno. Kubero offers seamless GitOps integration with various repositories, built-in CI/CD pipelines, and a comprehensive CLI for cluster management. Notably, it provides features like autoscaling, vulnerability scanning with Trivy, a web console for application maintenance, and customizable notifications.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.kubero.dev" rel="noopener noreferrer"&gt;https://www.kubero.dev&lt;/a&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  Coolify
&lt;/h2&gt;

&lt;p&gt;Coolify positions itself as an open-source alternative to platforms like Heroku, Netlify, and Vercel. It supports a wide range of programming languages and frameworks, enabling developers to deploy static websites, APIs, backends, databases, and various services. Deployment is flexible, accommodating any server with SSH access, including personal servers, VPS, Raspberry Pi, and cloud providers like AWS and DigitalOcean. Key features include push-to-deploy via Git integration, automatic SSL certificate management, real-time terminal access, and monitoring capabilities.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.coolify.io" rel="noopener noreferrer"&gt;https://www.coolify.io&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Differences
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Infrastructure
&lt;/h3&gt;

&lt;p&gt;Kubero is inherently designed for Kubernetes, leveraging its orchestration capabilities for scalability and resilience. In contrast, Coolify currently lacks native Kubernetes support, which limit scalability for enterprise applications.&lt;/p&gt;

&lt;h3&gt;
  
  
  Autoscaling and Resource Management
&lt;/h3&gt;

&lt;p&gt;Kubero's autoscaling features allow applications to scale horizontally and vertically based on demand, optimizing resource utilization. Additionally, it offers "sleeping containers" that pause inactive pods to conserve resources. Coolify does not provide comparable autoscaling capabilities.&lt;/p&gt;

&lt;h3&gt;
  
  
  Metrics and Monitoring
&lt;/h3&gt;

&lt;p&gt;Kubero excels in providing detailed application-level metrics, giving developers real-time insights into the performance and behavior of their deployed apps. This includes data such as response times, request counts, and resource usage specific to applications. In contrast, Coolify limits its monitoring capabilities to system-level metrics, such as server resource utilization (CPU, RAM, and disk). For teams requiring deeper application performance insights to optimize and troubleshoot effectively, Kubero stands out as the superior choice.&lt;/p&gt;

&lt;h3&gt;
  
  
  Security and Compliance
&lt;/h3&gt;

&lt;p&gt;Security Measures: With integrated vulnerability scanning using Trivy, Kubero proactively identifies security issues in images and repositories, enhancing application security. Coolify lacks a built-in vulnerability scanning feature.&lt;/p&gt;

&lt;h3&gt;
  
  
  Enterprise grade Add-ons
&lt;/h3&gt;

&lt;p&gt;Both Coolify and Kubero provide a variety of addons, allowing developers to integrate essential services such as databases and caching systems. However, Kubero goes a step further by deploying these addons as highly available clusters, ensuring redundancy and resilience. For example, services like Redis-Cluster, PostgreSQL, and Elasticsearch can be deployed with built-in high availability, making Kubero a more reliable choice for mission-critical applications. In contrast, Coolify's one-click service deployments are limited to standalone instances, which may not meet the demands of enterprise-level applications.&lt;/p&gt;

&lt;h2&gt;
  
  
  Community and Ecosystem
&lt;/h2&gt;

&lt;p&gt;Coolify boasts a significantly larger and more active community, offering developers access to a wealth of shared knowledge, quick responses to questions, and collaborative support. This vibrant community can be a valuable resource, especially for smaller teams or individual developers.&lt;/p&gt;

&lt;p&gt;However, Kubero leverages the vast and well-established Kubernetes ecosystem, which provides unparalleled flexibility, scalability, and a wealth of tools, plugins, and integrations. By being Kubernetes-native, Kubero allows developers to tap into a broader ecosystem of expertise and innovation that aligns with industry standards for cloud-native development. While Coolify’s community is an advantage, Kubero’s alignment with Kubernetes ensures it benefits from a much larger and continually evolving ecosystem.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Kubero&lt;/th&gt;
&lt;th&gt;Coolify&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;User Interface&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CLI&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;API&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multi user&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Teams&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SSO Oauth2&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Role Based Permissions&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vertical Scaling&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Horizontal Scaling&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Autoscaling&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sleeping Dynos/Pods&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cronjobs&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dark/White Mode&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Environment variables&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Application Metrics&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Basic Auth&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Writable Volumes&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DB-Backups&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Free SSL Issuing&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Web Console Access&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Web Logs Access&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Push to Deploy&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pull-Request-Apps&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Run Container Images&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CI/CD&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Buildpacks&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dockerfiles&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nixpacks&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Runpacks&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Activity Logs (Audit)&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Realtime App Logs&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Historic Metrics&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Webhooks&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Notification&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vulnerability scans&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Templates (16.01.25)&lt;/td&gt;
&lt;td&gt;155&lt;/td&gt;
&lt;td&gt;216&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GitOps with Github&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GitOps with GitLab&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GitOps with Bitbucket&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GitOps with Gitea&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GitOps with Gogs&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Add-On PostgreSQL&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Add-On MySQL&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Add-On RabbitMQ&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Add-On MongoDB&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Add-On ElasticSearch&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Add-On Memcached&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Add-On Kafka&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Add-On CouchDB&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Add-On CockroachDB&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Add-On Clickhouse&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Add-On DragonFly&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Add-On MariaDB&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Add-On KeyDB&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Coolify and Kubero are both similar open-source PaaS solutions. With its seamless Kubernetes integration, robust CI/CD pipelines, advanced autoscaling, enhanced security through vulnerability scanning, and support for highly available clusters, Kubero delivers the scalability, reliability, and flexibility modern developers need. Its ability to provide detailed application metrics and deploy high-availability addons ensures a superior experience for teams handling complex or mission-critical projects. For those seeking a future-proof platform tailored to enterprise-grade needs, Kubero might be the better fit.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>devops</category>
      <category>cloud</category>
      <category>kubernetes</category>
    </item>
    <item>
      <title>How to deploy your App to Kubernetes in 14 seconds</title>
      <dc:creator>Gianni Carafa</dc:creator>
      <pubDate>Mon, 09 Jan 2023 06:47:56 +0000</pubDate>
      <link>https://dev.to/shoksuno/how-to-deploy-your-app-to-kubernetes-in-14-seconds-3986</link>
      <guid>https://dev.to/shoksuno/how-to-deploy-your-app-to-kubernetes-in-14-seconds-3986</guid>
      <description>&lt;p&gt;Sounds crazy, right? At the end of this article, I will prove with a video that this is possible. What we want to achieve is to see our code as fast as possible running in Kubernetes after we've pushed it to our GIT-Repository.&lt;/p&gt;

&lt;p&gt;But let's first have a look at a traditional deployment:&lt;/p&gt;

&lt;p&gt;➡️ Push your changes to the repository to trigger a build job&lt;br&gt;
1) Buildcontainer starts and installs all requirements&lt;br&gt;
2) Fetch the code on the Buildcontainer&lt;br&gt;
3) Build the actual software&lt;br&gt;
4) Build the Docker image&lt;br&gt;
5) Push the Docker image&lt;br&gt;
6) Trigger an update on Kubernetes (ArgoCD or similar)&lt;br&gt;
7) Pull the new build Image&lt;br&gt;
8) Run the new image and wait for the health check to come up.&lt;/p&gt;

&lt;p&gt;Seems like a lot of work. This means a lot of time passing by and a lot of potential failures in this chain.&lt;/p&gt;

&lt;p&gt;How about just keeping the essential steps:&lt;br&gt;
➡️ Push your changes to the repository to trigger a webhook&lt;br&gt;
1) &lt;strong&gt;Fetch&lt;/strong&gt; the Code&lt;br&gt;
2) &lt;strong&gt;Build&lt;/strong&gt; the actual software&lt;br&gt;
3) &lt;strong&gt;Run&lt;/strong&gt; the Code.&lt;/p&gt;

&lt;p&gt;That's exactly how &lt;a href="https://github.com/kubero-dev/kubero" rel="noopener noreferrer"&gt;Kubero&lt;/a&gt; works. &lt;/p&gt;

&lt;p&gt;Kubero is an free and open-source PaaS for Kubernetes. It comes with a UI, API, and CLI and connects directly to your GIT repository. Therefore it is also possible to automatically start a preview instance within 14 seconds. &lt;/p&gt;

&lt;p&gt;But there are even more benefits: Kubero uses official maintainer images to build and run the code. No need to write and maintain a Dockerfile. &lt;/p&gt;

&lt;p&gt;The maintenance of the CI/CD pipeline is also eliminated since all these tasks are performed by Kubero. Kubero itself is automatically maintained as it is an &lt;a href="https://operatorhub.io/operator/kubero-operator" rel="noopener noreferrer"&gt;operator&lt;/a&gt; with a single UI-Container.&lt;/p&gt;

&lt;p&gt;But you might be wondering what happens when there are hundreds of pods running in production. Building the app for every running pod is not efficient. Thats why Kubero supports running pre built images too.&lt;/p&gt;

&lt;p&gt;And finally the proof: &lt;br&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%2Fpwj4mkyevz7r6p1lw2a7.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%2Fpwj4mkyevz7r6p1lw2a7.png" alt="deploy code in 14 seconds" width="761" height="43"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/-_XcC_8cpis"&gt;
&lt;/iframe&gt;
&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%2Fehegjr1h4sl26c3w2tlb.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%2Fehegjr1h4sl26c3w2tlb.png" alt="Kubero Pipelines" width="800" height="528"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>discuss</category>
    </item>
    <item>
      <title>The simplest way to run your own Heroku on Kubernetes</title>
      <dc:creator>Gianni Carafa</dc:creator>
      <pubDate>Mon, 28 Nov 2022 09:06:09 +0000</pubDate>
      <link>https://dev.to/shoksuno/the-simplest-way-to-run-your-own-heroku-on-kubernetes-3l03</link>
      <guid>https://dev.to/shoksuno/the-simplest-way-to-run-your-own-heroku-on-kubernetes-3l03</guid>
      <description>&lt;p&gt;In this tutorial, we will spin up a Kubernetes Kind Cluster and install Kubero on it. &lt;a href="https://kind.sigs.k8s.io/" rel="noopener noreferrer"&gt;Kind&lt;/a&gt; is an easy way to build knowledge in the field of Kubernetes and since it runs on your local machine it does not incur any costs.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/kubero-dev/kubero" rel="noopener noreferrer"&gt;Kubero&lt;/a&gt; is a PaaS for Kubernetes, which claims to have the most similar workflows to Heroku. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It comes with a UI, API, and CLI&lt;/li&gt;
&lt;li&gt;It is 100% open source.&lt;/li&gt;
&lt;li&gt;It has automatic deployments and reviewapps &lt;/li&gt;
&lt;li&gt;Supports any language and framework&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You will find a detailed explanation of Kubero in the first part &lt;a href="https://dev.to/shoksuno/replace-heroku-with-kubero-on-kubernetes-2aoj"&gt;here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fp6abp3ue013m7q9a45mx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp6abp3ue013m7q9a45mx.png" alt="Kubero Pipelines example"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What you will need for this tutorial:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://kubernetes.io/docs/tasks/tools/" rel="noopener noreferrer"&gt;kubectl&lt;/a&gt; installed &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://kind.sigs.k8s.io/docs/user/quick-start/" rel="noopener noreferrer"&gt;kind&lt;/a&gt; installed&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  1) Install the Kubero CLI
&lt;/h2&gt;

&lt;p&gt;Download, unpack and install the Kubero CLI binary from the &lt;a href="https://github.com/kubero-dev/kubero-cli/releases/latest" rel="noopener noreferrer"&gt;Github release Page&lt;/a&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  2) Run the install command
&lt;/h2&gt;

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

kubero &lt;span class="nb"&gt;install&lt;/span&gt;


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

&lt;/div&gt;

&lt;p&gt;You will now be guided thru the installation steps: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Install Kind (or Linode, GKE, DigitalOcean, Scaleway)&lt;/li&gt;
&lt;li&gt;Install OLM&lt;/li&gt;
&lt;li&gt;Install Ingress&lt;/li&gt;
&lt;li&gt;Install Kubero&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If it fails at some point, don't worry. Just restart the installer and skip the first step "Kubernetes Installation" part. &lt;/p&gt;

&lt;p&gt;This is an image of the full installation process.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fx4h3ylto75gnk512kje4.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx4h3ylto75gnk512kje4.jpg" alt="Full Terminal output"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But let's walk thru the single steps. &lt;/p&gt;

&lt;p&gt;The green value is the suggested default. If this fits your needs and preferences, just hit "enter". &lt;/p&gt;

&lt;h3&gt;
  
  
  2.1 Binaries check
&lt;/h3&gt;

&lt;p&gt;The installer will first check if the required binaries are available.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.2 Kind installation
&lt;/h3&gt;

&lt;p&gt;For this tutorial we want to install Kind. So we need to say "y" here. But if you already have a cluster you want to use, just skip this part. Make sure you have selected the right context.&lt;br&gt;
-&amp;gt; select "y"&lt;br&gt;
-&amp;gt; name your cluster&lt;br&gt;
-&amp;gt; select an available HTTP Port&lt;br&gt;
-&amp;gt; select an available HTTPS Port&lt;/p&gt;

&lt;p&gt;The Kind installation may take about a minute or two. The kubectl connection information and credentials are being exported by kind automatically.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.3 Check the Kubernetes Cluster
&lt;/h3&gt;

&lt;p&gt;Just to be sure for the next steps, let's check which Kubernetes context is selected.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.3 Install OLM
&lt;/h3&gt;

&lt;p&gt;OLM &lt;a href="https://olm.operatorframework.io/" rel="noopener noreferrer"&gt;(Operator Lifecyle Manager)&lt;/a&gt; is a component of the Operator Framework, an open source toolkit to manage Kubernetes native applications, called Operators, in a streamlined and scalable way.&lt;br&gt;
-&amp;gt; select the latest release "0.22.0" &lt;/p&gt;

&lt;h3&gt;
  
  
  2.4 Install NginX Ingress
&lt;/h3&gt;

&lt;p&gt;Our new Kind cluster needs Ingress to expose running services in our cluster. We now need to select the provider. For this tutorial, is "kind" the right choice.&lt;br&gt;
-&amp;gt; select "y"&lt;br&gt;
-&amp;gt; select "kind"&lt;/p&gt;

&lt;h3&gt;
  
  
  2.5 Install Kubero Operator
&lt;/h3&gt;

&lt;p&gt;Now we need our Operator. The Operator is required to deploy all Kubero pipelines and apps.&lt;br&gt;
-&amp;gt; select "y"&lt;/p&gt;

&lt;h3&gt;
  
  
  2.6 Install the Kubero UI
&lt;/h3&gt;

&lt;p&gt;We need this since the CLI talks to the API, which is installed with the UI. You don't need the UI Container if you plan to deploy your apps only by kubectl, which is possible, since every pipeline and app is a common Kubernetes Custom Resource Definitions. &lt;br&gt;
-&amp;gt; select "y"&lt;br&gt;
-&amp;gt; add a random string for the webhook secret. This will be used, to make sure only your webhooks are allowed to talk with your Kubero.&lt;br&gt;
-&amp;gt; add a random string for the session key. &lt;br&gt;
-&amp;gt; Add your github personal access token. We ned this create webhooks and add deployment credentials. &lt;/p&gt;

&lt;h2&gt;
  
  
  3) Accessing the UI
&lt;/h2&gt;

&lt;p&gt;You should now be able to access the Kubero UI with the provided URL and credentials. The misspelled lacolhost.com domain points always to your localhost.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fe2g76d9vguisw0yb3hfh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe2g76d9vguisw0yb3hfh.png" alt="Kubero installation final result"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let me know here in the comments if something fails or open issue in the main Kubero repository. &lt;/p&gt;

</description>
      <category>webdev</category>
      <category>tutorial</category>
      <category>beginners</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Comparing selfhosted Heroku alternatives</title>
      <dc:creator>Gianni Carafa</dc:creator>
      <pubDate>Mon, 07 Nov 2022 09:50:02 +0000</pubDate>
      <link>https://dev.to/shoksuno/comparing-selfhosted-heroku-alternatives-249p</link>
      <guid>https://dev.to/shoksuno/comparing-selfhosted-heroku-alternatives-249p</guid>
      <description>&lt;p&gt;First a disclaimer: I have built my own alternative, &lt;a href="https://github.com/kubero-dev/kubero"&gt;Kubero&lt;/a&gt;, which is part of this article.&lt;/p&gt;

&lt;p&gt;Heroku is a well known and solid PaaS provider. It is very easy to deploy a web application and the pricing starts very low (they just canceled the free plan tough). Not so well known are their enterprise and private space plans which can become quite pricy.&lt;/p&gt;

&lt;p&gt;But the good thing is that some open-source projects were launched during the last few years to replace Heroku on a self-managed infrastructure, like Google, AWS, or an even server rack in your basement.&lt;/p&gt;

&lt;p&gt;There are already excellent &lt;a href="https://dev.to/zevir/the-complete-list-of-heroku-alternatives-to-consider-1l8o"&gt;articles&lt;/a&gt; to list and introduce these projects. But they are not comparing them against each other.&lt;/p&gt;

&lt;p&gt;It is important to point out, that a missing feature does not always have to be negative but in many cases, this comes with less complexity. And it is not my intent to rate any of these great projects.&lt;/p&gt;

&lt;p&gt;Not part of this comparison are the hosted PaaS competitors of Heroku like netlify or platform.sh and licenced/closed source projects.&lt;/p&gt;

&lt;p&gt;I did not install all the tools but did my best to look up the docs, issues, and roadmaps. If I misinterpreted something, please let me know in the comments, and point me to where you have found the information.&lt;/p&gt;

&lt;h2&gt;
  
  
  These projects are being compared
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Kubero &lt;a href="https://github.com/kubero-dev/kubero"&gt;https://github.com/kubero-dev/kubero&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Coolify &lt;a href="https://coolify.io/"&gt;https://coolify.io/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Caprover &lt;a href="https://caprover.com/"&gt;https://caprover.com/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Dokku &lt;a href="https://dokku.com/"&gt;https://dokku.com/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Piku &lt;a href="https://github.com/piku/piku"&gt;https://github.com/piku/piku&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Cuber &lt;a href="https://cuber.cloud/"&gt;https://cuber.cloud/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Acorn &lt;a href="https://github.com/acorn-io/acorn"&gt;https://github.com/acorn-io/acorn&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Scroll right to see the full list&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Heroku &lt;br&gt;Private Space&lt;/th&gt;
&lt;th&gt;Kubero&lt;/th&gt;
&lt;th&gt;Coolify&lt;/th&gt;
&lt;th&gt;Dokku&lt;/th&gt;
&lt;th&gt;Caprover&lt;/th&gt;
&lt;th&gt;Piku&lt;/th&gt;
&lt;th&gt;Cuber&lt;/th&gt;
&lt;th&gt;Acorn&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;User Interface&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌ PRO&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multi User&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kubernetes&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multi Kubernetes&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scaling&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;vertically&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Autoscaling&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cronjobs&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CLI&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;API&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌ PRO&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Autodeployment&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pull-Request-Apps&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dataclips&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CI/CD&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Builtin Addons&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;plugin&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Builtin Services&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Any language&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  User interface
&lt;/h3&gt;

&lt;p&gt;The app needs to be easy to use. It should be possible to deploy an app with a view clicks. The user should be able to see the status of the app and the logs.&lt;/p&gt;

&lt;h3&gt;
  
  
  Multi User
&lt;/h3&gt;

&lt;p&gt;The app should be able to handle multiple users. Each user should be able manage applications.&lt;/p&gt;

&lt;h3&gt;
  
  
  Kubernetes
&lt;/h3&gt;

&lt;p&gt;Kubernetes has benefits like metrics, logmanagement, autoscaling and immutable infrastructure (restarts when the app crashes).&lt;/p&gt;

&lt;h3&gt;
  
  
  Multi Kubernetes
&lt;/h3&gt;

&lt;p&gt;It should be possible to deploy its apps to multiple different Kubernetes clusters.&lt;/p&gt;

&lt;h3&gt;
  
  
  Scaling
&lt;/h3&gt;

&lt;p&gt;The app should be able to scale apps horizontally and vertically.&lt;/p&gt;

&lt;h3&gt;
  
  
  Auto scaling
&lt;/h3&gt;

&lt;p&gt;The app should be able to auto scale apps horizontally and vertically based on the load.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cron jobs
&lt;/h3&gt;

&lt;p&gt;The app should be able to run timed cron jobs periodically.&lt;/p&gt;

&lt;h3&gt;
  
  
  CLI
&lt;/h3&gt;

&lt;p&gt;The app should have a CLI to manage the running applications.&lt;/p&gt;

&lt;h3&gt;
  
  
  API
&lt;/h3&gt;

&lt;p&gt;The app should have an API to manage the running applications.&lt;/p&gt;

&lt;h3&gt;
  
  
  CI/CD
&lt;/h3&gt;

&lt;p&gt;The app should be able to deploy apps from git repositories.&lt;/p&gt;

&lt;h3&gt;
  
  
  Autodeployment
&lt;/h3&gt;

&lt;p&gt;The app should listen to git pushes on a branch (webhooks)&lt;/p&gt;

&lt;h3&gt;
  
  
  Pullrequest Apps
&lt;/h3&gt;

&lt;p&gt;Tha app should automaticly start a new app for every pull request.&lt;/p&gt;

&lt;h3&gt;
  
  
  Built in addons
&lt;/h3&gt;

&lt;p&gt;The app should have built in addons like databases, caches, queues, etc.&lt;/p&gt;

&lt;h3&gt;
  
  
  Built in Services
&lt;/h3&gt;

&lt;p&gt;The app should have built in services like Wordpress, Nextcloud, CachetHQ, etc.&lt;/p&gt;

&lt;h3&gt;
  
  
  Any language
&lt;/h3&gt;

&lt;p&gt;The app should be able to build and run any language.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>heroku</category>
      <category>tooling</category>
      <category>devops</category>
    </item>
    <item>
      <title>Replace Heroku with Kubero on Kubernetes (part 1)</title>
      <dc:creator>Gianni Carafa</dc:creator>
      <pubDate>Mon, 31 Oct 2022 12:04:32 +0000</pubDate>
      <link>https://dev.to/shoksuno/replace-heroku-with-kubero-on-kubernetes-2aoj</link>
      <guid>https://dev.to/shoksuno/replace-heroku-with-kubero-on-kubernetes-2aoj</guid>
      <description>&lt;p&gt;Hi my name is Gianni and I built another open source replacement for Heroku.&lt;/p&gt;

&lt;p&gt;As a developer i fell in love with Heroku many years ago (2012). It was always easy to use, flexible, feature complete an had a very low price tag. But in may 2022 they had this major &lt;a href="https://blog.heroku.com/april-2022-incident-review"&gt;incident&lt;/a&gt;, which blocked all dev teams in our company.&lt;/p&gt;

&lt;p&gt;Short after, Bob Wise, &lt;a href="https://blog.heroku.com/next-chapter"&gt;announced&lt;/a&gt; to discontinue the free tier on their platform.&lt;/p&gt;

&lt;p&gt;All this led me, to start my own project and build a Heroku clone for Kubernetes. Yes, I know, there are already a lot other very nice tools in this spot. But I wanted a more developer friendly approach with a nice UI, CLI (Work in progress) and most important Kubernetes native.&lt;/p&gt;

&lt;p&gt;Kubernetes has already everything builtin related to scalability(&lt;a href="https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/"&gt;HPA&lt;/a&gt;) and resilience. The concept of Operators is similar to the Heroku addons. But a new App should be configured and deployed within minutes not days. Writing stable Helm charts requires a deep understanding of Kubernetes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--wtkhaAka--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hnnj86cjj9ib51fsfy3t.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wtkhaAka--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hnnj86cjj9ib51fsfy3t.gif" alt="Application Workflow" width="600" height="526"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Another important part was the workflow: We all want to push our work, wait a moment, and see how our work runs in the cloud. So we want to connect our app with a repository and listen to git pushes and pull-requests.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Kubero
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/kubero-dev/kubero"&gt;https://github.com/kubero-dev/kubero&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Kubero is basically an &lt;a href="https://operatorhub.io/operator/kubero-operator"&gt;operator&lt;/a&gt; with a &lt;a href="https://github.com/kubero-dev/kubero"&gt;UI&lt;/a&gt; and API. There are 2 Custom resources, which are necessary for your app:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pipelines, defines namespaces and git repository connection&lt;/li&gt;
&lt;li&gt;Apps, defines your application and addons&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The Kubero UI is a single container application, storing all data in the Kubernetes API. Therefore it is possible to modify all resources directly with the your kubectl without having any conflicts.&lt;/p&gt;

&lt;p&gt;Kubero is able to deploy prebuilt images, but the bigger benefit comes with the integrated build pipeline. The deployment has 3 stages: fetch -&amp;gt; build -&amp;gt; run. I call them buildpacks, although no images are build, to keep the analogy to Heroku. Every step has a public image maintained by the publisher. These "buildpacks" are easy &lt;a href="https://github.com/kubero-dev/kubero/blob/main/config.yaml#L6-L18"&gt;customizable and extendable&lt;/a&gt; for special requirements. Due to this flexibility it is possible to deploy &lt;em&gt;every&lt;/em&gt; code, framework and language, which runs in a single container.&lt;/p&gt;

&lt;p&gt;We are a Github company, so we had no issue with the fact, that Heroku connects only to Github. But why not connect to other great repositories? So I added Gitea and soon Gitlab, Bitbucket and OneDev.&lt;/p&gt;

&lt;h2&gt;
  
  
  Authentication
&lt;/h2&gt;

&lt;p&gt;Same with authentication: there is built in method for very small teams. But it is also possible to use oAuth2 and Github. &lt;/p&gt;

&lt;h2&gt;
  
  
  Addons
&lt;/h2&gt;

&lt;p&gt;When it comes to Addons, things are getting a bit more complicated: Every Addon has its own complexity when running on a Kubernetes cluster. Some require to deploy several CRD's. Others have finalizers to handle when deleted.&lt;/p&gt;

&lt;p&gt;What about more complex application or missing addons? Since it is plain Kubernetes, it possible to use traditional Helm or Operator deployments within your Kubero managed namespace.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--l1aZbhaz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sm5telzakhgn4mv7863d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--l1aZbhaz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sm5telzakhgn4mv7863d.png" alt="Liste of Addon Operators" width="880" height="573"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Whats next in Kubero
&lt;/h2&gt;

&lt;p&gt;I am currently working on the stability of Kubero. I run it on my local Kind cluster and GKE. &lt;br&gt;
There is a &lt;a href="https://github.com/kubero-dev/kubero/wiki"&gt;documentation&lt;/a&gt;, but far from complete.&lt;br&gt;
A CLI, written in Golang and comparable with Heroku-CLI, is on the way. But this will still take some time.&lt;br&gt;
I will add some more simple addons to the Operator, which are not clustered but easier to handle.&lt;/p&gt;

&lt;p&gt;So if you want to use it, I am more than happy help. Don't hesitate to open issues or discussions. Ideas, feature requests and contributions are very welcome.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;My next posting (Part 2) will guide you through the Kubero Kubernetes installation. Leave in the comments if you prefer GKE oder Digital Ocean&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>heroku</category>
      <category>showdev</category>
      <category>devops</category>
    </item>
  </channel>
</rss>
