<?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: Surender Gupta</title>
    <description>The latest articles on DEV Community by Surender Gupta (@surendergupta).</description>
    <link>https://dev.to/surendergupta</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%2F2962674%2Ff3e20ae8-8dc0-4f96-afcf-3516b2538575.jpg</url>
      <title>DEV Community: Surender Gupta</title>
      <link>https://dev.to/surendergupta</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/surendergupta"/>
    <language>en</language>
    <item>
      <title>🚀 Building a Production-Ready PHP Todo App with Clean Architecture &amp; Security</title>
      <dc:creator>Surender Gupta</dc:creator>
      <pubDate>Mon, 25 Aug 2025 12:46:05 +0000</pubDate>
      <link>https://dev.to/surendergupta/building-a-production-ready-php-todo-app-with-clean-architecture-security-16m8</link>
      <guid>https://dev.to/surendergupta/building-a-production-ready-php-todo-app-with-clean-architecture-security-16m8</guid>
      <description>&lt;p&gt;As someone who has spent the last 7+ years working with PHP and modern backend architectures, I often see the same problem: most PHP tutorials and sample apps stop at CRUD.&lt;/p&gt;

&lt;p&gt;That works for beginners — but when you’re building real-world software that needs to scale, handle authentication, and remain secure, you need more than just index.php and some SQL queries.&lt;/p&gt;

&lt;p&gt;That’s why I decided to build a Modern PHP Todo App — not as a toy project, but as a blueprint for production-grade applications with advanced architecture, middleware-driven security, and testability at its core.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Why This Project Matters&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Too many developers underestimate how powerful PHP can be when written with the right practices. This project demonstrates how you can use native PHP 8.3+ (no heavy frameworks) to design an application that’s:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Scalable → modular, layered, and testable&lt;/li&gt;
&lt;li&gt;Secure → SQL injection–proof, JWT authentication, rate-limiting&lt;/li&gt;
&lt;li&gt;Maintainable → clean separation of concerns with Controllers, Services, and Repositories&lt;/li&gt;
&lt;li&gt;CI/CD Ready → with unit tests and dependency injection baked in&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Core Features&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Clean OOP architecture with Controllers, Services &amp;amp; Repositories&lt;/li&gt;
&lt;li&gt;Custom Router for structured API endpoints&lt;/li&gt;
&lt;li&gt;JWT Authentication Middleware (login &amp;amp; secure APIs)&lt;/li&gt;
&lt;li&gt;Advanced Middlewares:
  - CORS handling
  - Rate Limiting
  - Validation
  - Logging&lt;/li&gt;
&lt;li&gt;Security-first approach → PDO + parameter binding (SQLi safe)&lt;/li&gt;
&lt;li&gt;Unit Tests with PHPUnit 12 → maintain reliability with every commit&lt;/li&gt;
&lt;li&gt;Modular APIs for Todos &amp;amp; Users&lt;/li&gt;
&lt;li&gt;Best Practices: Dependency Injection, Traits, Centralized Error Handling&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Tech Stack&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;PHP 8.3+&lt;/li&gt;
&lt;li&gt;PHPUnit 12 (unit &amp;amp; functional tests)&lt;/li&gt;
&lt;li&gt;PDO (database access with parameter binding)&lt;/li&gt;
&lt;li&gt;Middleware-driven security model&lt;/li&gt;
&lt;li&gt;CI-friendly modular structure&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Architecture at a Glance&lt;/strong&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;Request&lt;/span&gt; 
   &lt;span class="err"&gt;↓&lt;/span&gt;
&lt;span class="nt"&gt;Router&lt;/span&gt; 
   &lt;span class="err"&gt;↓&lt;/span&gt;
&lt;span class="nt"&gt;Middleware&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;CORS&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nt"&gt;RateLimit&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nt"&gt;Auth&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nt"&gt;Logging&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
   &lt;span class="err"&gt;↓&lt;/span&gt;
&lt;span class="nt"&gt;Controller&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;business&lt;/span&gt; &lt;span class="nt"&gt;entry&lt;/span&gt; &lt;span class="nt"&gt;point&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
   &lt;span class="err"&gt;↓&lt;/span&gt;
&lt;span class="nt"&gt;Service&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;application&lt;/span&gt; &lt;span class="nt"&gt;logic&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
   &lt;span class="err"&gt;↓&lt;/span&gt;
&lt;span class="nt"&gt;Repository&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;DB&lt;/span&gt; &lt;span class="nt"&gt;layer&lt;/span&gt; &lt;span class="nt"&gt;with&lt;/span&gt; &lt;span class="nt"&gt;PDO&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
   &lt;span class="err"&gt;↓&lt;/span&gt;
&lt;span class="nt"&gt;Database&lt;/span&gt;

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

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;This layered structure ensures the app is easy to extend, debug, and secure — the same principles I follow when architecting production services for clients.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Repository&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;👉 Full source code here: GitHub – &lt;a href="https://github.com/surendergupta/php-todo-app" rel="noopener noreferrer"&gt;PHP Todo App&lt;/a&gt;&lt;br&gt;
The repo is structured for readability, contributions, and future extensions (Docker, CI/CD pipelines, frontend integration).&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;What’s Next?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;I see this as a foundation, not just a Todo app. Possible extensions include:&lt;br&gt;
🚀 Docker &amp;amp; Kubernetes deployment&lt;br&gt;
🔄 CI/CD pipelines with GitHub Actions or Jenkins&lt;br&gt;
🌐 Frontend integration with React / Next.js&lt;br&gt;
🔐 OAuth2 / Social Login&lt;br&gt;
📊 Monitoring with Prometheus + Grafana&lt;br&gt;
💡 Closing Thoughts&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;This project is a reminder that modern PHP is alive and thriving when combined with clean architecture and engineering discipline. Even a “simple Todo app” can become a playground for enterprise practices when built the right way.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If you’re a PHP developer (or exploring backend design principles), I’d love your feedback:&lt;br&gt;
⭐ Star the repo&lt;br&gt;
🛠️ Contribute ideas/features&lt;br&gt;
💬 Share how you’d extend it&lt;br&gt;
👉 GitHub: &lt;a href="https://github.com/surendergupta/php-todo-app" rel="noopener noreferrer"&gt;PHP Todo App&lt;/a&gt;&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;Happy Coding. Love Coding. Explore more.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>webdev</category>
      <category>php</category>
      <category>productivity</category>
      <category>api</category>
    </item>
    <item>
      <title>Secure Your Kubernetes Cluster — A Hands-On Mini Project with RBAC, Secrets &amp; Network Policies</title>
      <dc:creator>Surender Gupta</dc:creator>
      <pubDate>Thu, 19 Jun 2025 12:31:07 +0000</pubDate>
      <link>https://dev.to/surendergupta/secure-your-kubernetes-cluster-a-hands-on-mini-project-with-rbac-secrets-network-policies-1h8f</link>
      <guid>https://dev.to/surendergupta/secure-your-kubernetes-cluster-a-hands-on-mini-project-with-rbac-secrets-network-policies-1h8f</guid>
      <description>&lt;p&gt;Kubernetes is powerful — but with great power comes a &lt;strong&gt;giant security surface area&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In this hands-on mini project, I walk you through how to &lt;strong&gt;secure your Kubernetes cluster&lt;/strong&gt; using &lt;strong&gt;built-in tools&lt;/strong&gt; and &lt;strong&gt;real YAML examples&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;✅ Role-Based Access Control (RBAC)&lt;br&gt;&lt;br&gt;
✅ Kubernetes Secrets (with proper injection into pods)&lt;br&gt;&lt;br&gt;
✅ Network Policies (to restrict lateral movement)&lt;/p&gt;




&lt;h2&gt;
  
  
  🧱 What You'll Learn
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;How to create least-privilege &lt;strong&gt;ServiceAccounts&lt;/strong&gt; with RBAC&lt;/li&gt;
&lt;li&gt;How to &lt;strong&gt;inject Secrets securely&lt;/strong&gt; into your pods&lt;/li&gt;
&lt;li&gt;How to use &lt;strong&gt;Network Policies&lt;/strong&gt; to lock down internal pod communication&lt;/li&gt;
&lt;li&gt;How to test and verify all of the above using &lt;code&gt;kubectl&lt;/code&gt;, &lt;code&gt;curl&lt;/code&gt;, and &lt;code&gt;auth can-i&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  📖 Full Guide
&lt;/h2&gt;

&lt;p&gt;📘 Read the complete breakdown with code and context on Medium:&lt;br&gt;&lt;br&gt;
👉 &lt;a href="https://medium.com/@gupta.surender.1990/project-secure-your-kubernetes-cluster-a-hands-on-mini-project-ae226173a21e" rel="noopener noreferrer"&gt;Medium Article&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  💻 GitHub Project Repository
&lt;/h2&gt;

&lt;p&gt;All manifests and test YAMLs are available on GitHub for you to clone, run, and learn:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://github.com/surendergupta/Project-Secure-Your-Kubernetes-Cluster---A-Hands-On-Mini-Project" rel="noopener noreferrer"&gt;GitHub Repo&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  ☕ Why I Built This
&lt;/h2&gt;

&lt;p&gt;Too many Kubernetes environments start secure... and then permissions spiral out of control. Secrets are exposed. Pods talk to everything. And suddenly, your cluster is wide open.&lt;/p&gt;

&lt;p&gt;This project aims to make &lt;strong&gt;security practical&lt;/strong&gt;, not theoretical. You don’t need fancy tools or expensive platforms — just the Kubernetes features you already have.&lt;/p&gt;




&lt;h2&gt;
  
  
  🚀 Next Steps
&lt;/h2&gt;

&lt;p&gt;If this helped you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Leave a ❤️ or 🦄 on Dev.to&lt;/li&gt;
&lt;li&gt;Drop a comment with your thoughts or struggles&lt;/li&gt;
&lt;li&gt;Share it with your DevOps or SRE team&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let's build secure by default. 🔐&lt;/p&gt;




</description>
      <category>kubernetes</category>
      <category>devops</category>
      <category>security</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Master GitOps with ArgoCD: Automate Your Kubernetes Deployments Like a Pro</title>
      <dc:creator>Surender Gupta</dc:creator>
      <pubDate>Tue, 10 Jun 2025 18:15:35 +0000</pubDate>
      <link>https://dev.to/surendergupta/master-gitops-with-argocd-automate-your-kubernetes-deployments-like-a-pro-3f9c</link>
      <guid>https://dev.to/surendergupta/master-gitops-with-argocd-automate-your-kubernetes-deployments-like-a-pro-3f9c</guid>
      <description>&lt;h2&gt;
  
  
  &lt;strong&gt;Introduction:&lt;/strong&gt; Why GitOps + ArgoCD Is the Future of Kubernetes Automation
&lt;/h2&gt;

&lt;p&gt;Managing Kubernetes deployments manually or via scripts is &lt;strong&gt;error-prone&lt;/strong&gt;, &lt;strong&gt;inconsistent&lt;/strong&gt;, and &lt;strong&gt;hard to scale&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Enter &lt;strong&gt;GitOps&lt;/strong&gt; — a methodology that uses Git as the single source of truth for your infrastructure and applications. And at the heart of GitOps for Kubernetes lies &lt;strong&gt;ArgoCD&lt;/strong&gt;, the most popular continuous delivery tool purpose-built for GitOps.&lt;/p&gt;

&lt;p&gt;In this practical guide, you’ll learn:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What GitOps is and how ArgoCD enables it&lt;/li&gt;
&lt;li&gt;How to set up ArgoCD step-by-step&lt;/li&gt;
&lt;li&gt;Best practices for automating and securing your Kubernetes workflows&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By the end, you’ll be able to &lt;strong&gt;deploy apps to Kubernetes like a pro — with full auditability, rollback, and zero manual steps.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Section 1:&lt;/strong&gt; What Is GitOps and Why It Works So Well with Kubernetes
&lt;/h2&gt;

&lt;p&gt;GitOps isn’t just a buzzword — it’s a paradigm shift.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is GitOps?
&lt;/h3&gt;

&lt;p&gt;GitOps is the practice of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Declaring infrastructure and app configs in Git&lt;/li&gt;
&lt;li&gt;Automatically syncing Git changes to your cluster&lt;/li&gt;
&lt;li&gt;Auditing every change via pull requests&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It uses &lt;strong&gt;pull-based automation&lt;/strong&gt;, which is more secure and auditable than traditional CI/CD.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why GitOps + Kubernetes = ❤️
&lt;/h3&gt;

&lt;p&gt;Kubernetes is declarative by design — so it’s a natural fit.&lt;br&gt;
Git becomes your &lt;strong&gt;source of truth&lt;/strong&gt; → ArgoCD syncs changes → Kubernetes executes them.&lt;/p&gt;

&lt;p&gt;Benefits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Instant rollback with &lt;code&gt;git revert&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Strong audit trail (Git history)&lt;/li&gt;
&lt;li&gt;Zero-downtime deployments&lt;/li&gt;
&lt;li&gt;No manual &lt;code&gt;kubectl apply&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  &lt;strong&gt;Section 2:&lt;/strong&gt; Getting Started with ArgoCD — Step-by-Step
&lt;/h2&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;Step 1:&lt;/strong&gt; Install ArgoCD
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl create namespace argocd

kubectl apply &lt;span class="nt"&gt;-n&lt;/span&gt; argocd &lt;span class="nt"&gt;-f&lt;/span&gt; https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Access the UI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl port-forward svc/argocd-server &lt;span class="nt"&gt;-n&lt;/span&gt; argocd 8080:443
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Default username: &lt;code&gt;admin&lt;/code&gt;&lt;br&gt;
Get password:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl get secret argocd-initial-admin-secret &lt;span class="nt"&gt;-n&lt;/span&gt; argocd &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="nv"&gt;jsonpath&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"{.data.password}"&lt;/span&gt; | &lt;span class="nb"&gt;base64&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;Step 2:&lt;/strong&gt; Create a Git Repo for Your Kubernetes Manifests
&lt;/h3&gt;

&lt;p&gt;Structure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.
├── dev/
│   ├── frontend.yaml
│   └── backend.yaml
├── staging/
└── production/

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

&lt;/div&gt;



&lt;p&gt;Store Kubernetes YAMLs, Kustomize bases, or Helm charts in Git.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Step 3:&lt;/strong&gt; Connect Git Repo to ArgoCD
&lt;/h3&gt;

&lt;p&gt;Create an &lt;code&gt;Application&lt;/code&gt; resource:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;argoproj.io/v1alpha1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Application&lt;/span&gt;
&lt;span class="na"&gt;metadata&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;my-app&lt;/span&gt;
  &lt;span class="na"&gt;namespace&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;argocd&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;project&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;default&lt;/span&gt;
  &lt;span class="na"&gt;source&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;repoURL&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;https://github.com/your-org/your-app&lt;/span&gt;
    &lt;span class="na"&gt;targetRevision&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;main&lt;/span&gt;
    &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;dev&lt;/span&gt;
  &lt;span class="na"&gt;destination&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;server&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;https://kubernetes.default.svc&lt;/span&gt;
    &lt;span class="na"&gt;namespace&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;default&lt;/span&gt;
  &lt;span class="na"&gt;syncPolicy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;automated&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;prune&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;selfHeal&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Apply it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl apply &lt;span class="nt"&gt;-f&lt;/span&gt; app.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, &lt;strong&gt;ArgoCD auto-syncs&lt;/strong&gt; your &lt;strong&gt;cluster&lt;/strong&gt; to match your Git repo.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Section 3:&lt;/strong&gt; ArgoCD Best Practices for Production
&lt;/h2&gt;

&lt;p&gt;GitOps is powerful — but only if you follow strong operational patterns. Here’s how to productionize it:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Use RBAC and SSO
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Integrate with GitHub, GitLab, or OIDC providers&lt;/li&gt;
&lt;li&gt;Limit access by role and environment (e.g., dev vs prod)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Separate Repos by Environment
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Avoid mixing prod and dev in the same repo&lt;/li&gt;
&lt;li&gt;Use different ArgoCD Application objects per env&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Use Health Checks and Sync Hooks
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Customize sync steps with syncWave, preSync, postSync&lt;/li&gt;
&lt;li&gt;Add health checks to catch failing states before rollback&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. Monitor and Alert with ArgoCD Metrics
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Export ArgoCD Prometheus metrics&lt;/li&gt;
&lt;li&gt;Use Grafana dashboards and alerting for failed syncs&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5. Secure ArgoCD Itself
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Run behind an ingress with HTTPS&lt;/li&gt;
&lt;li&gt;Regularly rotate admin secrets&lt;/li&gt;
&lt;li&gt;Avoid direct access from the internet unless via VPN or identity-aware proxy&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Conclusion:&lt;/strong&gt; Automate Everything with GitOps and ArgoCD&lt;br&gt;
ArgoCD and GitOps are revolutionizing Kubernetes deployments.&lt;/p&gt;

&lt;p&gt;No more fragile shell scripts. No more mystery configs.&lt;br&gt;
Just reliable, trackable, and secure deployments, every time you git push.&lt;/p&gt;

&lt;p&gt;If you’re managing Kubernetes at scale in 2025 and still deploying manually — you’re already behind.&lt;/p&gt;




&lt;h3&gt;
  
  
  Bonus Resources
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://argo-cd.readthedocs.io/" rel="noopener noreferrer"&gt;Official ArgoCD Docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://opengitops.dev/" rel="noopener noreferrer"&gt;GitOps Principles&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/argoproj/argocd-example-apps" rel="noopener noreferrer"&gt;ArgoCD Example Apps&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  🙏 &lt;strong&gt;Support My Work&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;If this guide helped you understand GitOps or ArgoCD a little better, consider supporting me with a coffee.&lt;br&gt;&lt;br&gt;
It helps me keep writing honest, practical DevOps content that simplifies complex tools for engineers like you.&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://buymeacoffee.com/surendergupta" rel="noopener noreferrer"&gt;buymeacoffee.com/surendergupta&lt;/a&gt;&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>gitops</category>
      <category>argocd</category>
      <category>automation</category>
    </item>
    <item>
      <title>How to Download Any YouTube Video Using One Terminal Command (No Ads, No Bloat)</title>
      <dc:creator>Surender Gupta</dc:creator>
      <pubDate>Tue, 10 Jun 2025 15:18:51 +0000</pubDate>
      <link>https://dev.to/surendergupta/how-to-download-any-youtube-video-using-one-terminal-command-no-ads-no-bloat-43ca</link>
      <guid>https://dev.to/surendergupta/how-to-download-any-youtube-video-using-one-terminal-command-no-ads-no-bloat-43ca</guid>
      <description>&lt;h3&gt;
  
  
  Introduction
&lt;/h3&gt;

&lt;p&gt;Tired of dodgy online downloaders filled with popups and trackers? Let’s go clean, fast, and powerful — using the terminal. Whether you’re a content creator, researcher, or just offline-first, &lt;code&gt;yt-dlp&lt;/code&gt; is your best tool.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Install yt-dlp
&lt;/h3&gt;

&lt;p&gt;If you’re on Windows, use the built-in package manager:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;winget &lt;span class="nb"&gt;install &lt;/span&gt;yt-dlp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That’s it. If you don’t have winget, ensure you’re on Windows 10+ with the latest App Installer.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Download a YouTube Video
&lt;/h3&gt;

&lt;p&gt;Just grab the link of the video you want and paste it into this command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;yt-dlp https://www.youtube.com/watch?v&lt;span class="o"&gt;=&lt;/span&gt;dQw4w9WgXcQ
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This downloads the highest quality version by default.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Advanced Usage
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Audio only:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;yt-dlp &lt;span class="nt"&gt;-f&lt;/span&gt; bestaudio URL
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Playlist download:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;yt-dlp &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="nt"&gt;--yes-playlist&lt;/span&gt; URL
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Custom output name:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;yt-dlp &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="s2"&gt;"%(title)s.%(ext)s"&lt;/span&gt; URL
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Why Use yt-dlp Over Other Tools?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Open-source and regularly updated&lt;/li&gt;
&lt;li&gt;Handles age-restricted &amp;amp; geo-blocked videos better than youtube-dl&lt;/li&gt;
&lt;li&gt;No ads or shady redirects&lt;/li&gt;
&lt;li&gt;Batch download support&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Final Thoughts
&lt;/h3&gt;

&lt;p&gt;With one command, you unlock full control over video downloads. Whether it’s for personal viewing, remixing content, or offline archiving, yt-dlp is the fastest and safest method available.&lt;/p&gt;

&lt;p&gt;💬 Have questions or favorite use cases? Drop them in the comments!&lt;/p&gt;

</description>
      <category>youtube</category>
      <category>winget</category>
      <category>terminal</category>
      <category>productivity</category>
    </item>
    <item>
      <title>💻 Building DApps with PHP and Web3: A Full-Stack Dev’s Guide to Smart Contract Integration</title>
      <dc:creator>Surender Gupta</dc:creator>
      <pubDate>Sat, 07 Jun 2025 10:05:21 +0000</pubDate>
      <link>https://dev.to/surendergupta/building-dapps-with-php-and-web3-a-full-stack-devs-guide-to-smart-contract-integration-4g1n</link>
      <guid>https://dev.to/surendergupta/building-dapps-with-php-and-web3-a-full-stack-devs-guide-to-smart-contract-integration-4g1n</guid>
      <description>&lt;p&gt;&lt;strong&gt;Excerpt:&lt;/strong&gt;&lt;br&gt;
Most Web3 devs stick to Node.js or use front-end only DApps. But I’ve found huge success combining Web3.js with Laravel (PHP) to create secure, full-featured decentralized apps.&lt;/p&gt;

&lt;p&gt;Here’s my stack:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;PHP (Laravel) as backend&lt;/li&gt;
&lt;li&gt;Web3.js frontend&lt;/li&gt;
&lt;li&gt;Smart contract interaction (read/write)&lt;/li&gt;
&lt;li&gt;MetaMask or WalletConnect for auth&lt;/li&gt;
&lt;li&gt;JSON-RPC or Infura for blockchain communication&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This setup is perfect for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Startup MVPs&lt;/li&gt;
&lt;li&gt;✅ NFT portals&lt;/li&gt;
&lt;li&gt;✅ DeFi dashboards&lt;/li&gt;
&lt;li&gt;✅ Token analytics tools&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Want me to build yours?&lt;br&gt;
🎯 Check out my Fiverr gig: &lt;a href="https://www.fiverr.com/s/DBXAxDV" rel="noopener noreferrer"&gt;https://www.fiverr.com/s/DBXAxDV&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let’s push Web3 development forward — one secure backend at a time 💪&lt;/p&gt;

</description>
      <category>web3</category>
      <category>php</category>
      <category>smartcontract</category>
      <category>ethereum</category>
    </item>
    <item>
      <title>🚀 Full-Stack PHP, MERN, and DApp Development – Let’s Build Something Awesome</title>
      <dc:creator>Surender Gupta</dc:creator>
      <pubDate>Tue, 03 Jun 2025 10:27:41 +0000</pubDate>
      <link>https://dev.to/surendergupta/full-stack-php-mern-and-dapp-dev-services-by-surender-gupta-44c8</link>
      <guid>https://dev.to/surendergupta/full-stack-php-mern-and-dapp-dev-services-by-surender-gupta-44c8</guid>
      <description>&lt;h2&gt;
  
  
  Hey devs and founders!
&lt;/h2&gt;

&lt;p&gt;I’m &lt;strong&gt;Surender Gupta&lt;/strong&gt;, a full-stack engineer with &lt;strong&gt;7+ years&lt;/strong&gt; of experience across modern and decentralized web stacks.&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%2Fflt41kt88ix8p6dbk72t.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%2Fflt41kt88ix8p6dbk72t.png" alt="Image description" width="800" height="381"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  💡 &lt;strong&gt;Tech Stack Highlights:&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Backend:&lt;/strong&gt; PHP (Laravel, CodeIgniter), Node.js (Express) &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Frontend:&lt;/strong&gt; React.js, Vue.js, Tailwind, MUI
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Blockchain:&lt;/strong&gt; Solidity, Web3, DApp integration
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DevOps:&lt;/strong&gt; Docker, Jenkins, Kubernetes, AWS
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DBs:&lt;/strong&gt; MySQL, MongoDB, PostgreSQL&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let’s build something amazing together.&lt;/p&gt;

&lt;p&gt;🔗 Connect with me:&lt;br&gt;&lt;br&gt;
&lt;a href="https://www.linkedin.com/in/surender-gupta/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://github.com/surendergupta" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.fiverr.com/surendergupt338/" rel="noopener noreferrer"&gt;Fiverr&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.freelancer.in/u/Surender1990" rel="noopener noreferrer"&gt;Freelancer&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.upwork.com/freelancers/~0118f52e83e18443ec" rel="noopener noreferrer"&gt;Upwork&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.facebook.com/DailyDevOps" rel="noopener noreferrer"&gt;Facebook&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💬 &lt;strong&gt;DM me if you need a reliable tech partner to launch your idea!&lt;/strong&gt; 🚀&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>php</category>
      <category>react</category>
      <category>laravel</category>
      <category>web3</category>
    </item>
    <item>
      <title>How I Built a DApp Using PHP, Solidity, and JavaScript on Binance Smart Chain (With Dockerized Deployment)</title>
      <dc:creator>Surender Gupta</dc:creator>
      <pubDate>Sat, 31 May 2025 16:38:33 +0000</pubDate>
      <link>https://dev.to/surendergupta/how-i-built-a-dapp-using-php-solidity-and-javascript-on-binance-smart-chain-with-dockerized-4537</link>
      <guid>https://dev.to/surendergupta/how-i-built-a-dapp-using-php-solidity-and-javascript-on-binance-smart-chain-with-dockerized-4537</guid>
      <description>&lt;h2&gt;
  
  
  🚀 Project Overview
&lt;/h2&gt;

&lt;p&gt;I've recently built a full-stack &lt;strong&gt;Decentralized Application (DApp)&lt;/strong&gt; using:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🐘 &lt;strong&gt;PHP&lt;/strong&gt; for backend logic and APIs
&lt;/li&gt;
&lt;li&gt;💻 &lt;strong&gt;JavaScript&lt;/strong&gt; for the frontend UI
&lt;/li&gt;
&lt;li&gt;🧠 &lt;strong&gt;Solidity&lt;/strong&gt; for smart contracts
&lt;/li&gt;
&lt;li&gt;🔗 &lt;strong&gt;Binance Smart Chain&lt;/strong&gt; as the blockchain layer
&lt;/li&gt;
&lt;li&gt;🐳 &lt;strong&gt;Docker &amp;amp; Docker Compose&lt;/strong&gt; for deployment&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This project was an exciting mix of traditional backend skills and modern Web3 architecture. Here's how I did it 👇&lt;/p&gt;




&lt;h2&gt;
  
  
  🧱 Tech Stack
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;Technology&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Smart Contracts&lt;/td&gt;
&lt;td&gt;Solidity on BSC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Backend&lt;/td&gt;
&lt;td&gt;PHP (vanilla or Laravel)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Frontend&lt;/td&gt;
&lt;td&gt;JavaScript (with Web3.js)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Containerization&lt;/td&gt;
&lt;td&gt;Docker &amp;amp; Docker Compose&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🔐 Smart Contracts on Binance Smart Chain
&lt;/h2&gt;

&lt;p&gt;The smart contracts were developed in &lt;strong&gt;Solidity&lt;/strong&gt;, tested with &lt;strong&gt;Hardhat&lt;/strong&gt;, and deployed to the &lt;strong&gt;Binance Smart Chain Testnet&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Example contract snippet:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.6.12;

library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c &amp;gt;= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b &amp;lt;= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b &amp;gt; 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

interface IBEP20 {
  function totalSupply() external view returns (uint256);

  function decimals() external view returns (uint8);

  function symbol() external view returns (string memory);

  function name() external view returns (string memory);

  function getOwner() external view returns (address);

  function balanceOf(address account) external view returns (uint256);

  function transfer(address recipient, uint256 amount) external returns (bool);

  function allowance(address _owner, address spender) external view returns (uint256);

  function approve(address spender, uint256 amount) external returns (bool);

  function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

  event Transfer(address indexed from, address indexed to, uint256 value);

  event Approval(address indexed owner, address indexed spender, uint256 value);
}

contract FIZZYFY  {
    using SafeMath for uint256; 
    IBEP20 public busd;
    address public contractOwner;
    modifier onlyContractOwner() { 
        require(msg.sender == contractOwner, "onlyOwner"); 
        _; 
    }
    uint256 private constant baseDivider = 10000;
    uint256 private constant feePercents = 200; 
    uint256 private constant minDeposit = 50e18;
    uint256 private constant maxDeposit = 2000e18;
    uint256 private constant freezeIncomePercents = 3000;
    uint256 private constant timeStep = 1 days;
    uint256 private constant dayPerCycle = 10 days; 
    uint256 private constant dayRewardPercents = 160;
    uint256 private constant maxAddFreeze = 45 days;
    uint256 private constant referDepth = 20;

    uint256 private constant directPercents = 500;
    uint256[4] private level4Percents = [100, 200, 300, 100];
    uint256[15] private level5Percents = [200, 100, 100, 100, 100, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50];

    uint256 private constant luckPoolPercents = 50;
    uint256 private constant starPoolPercents = 30;
    uint256 private constant topPoolPercents = 20;

    uint256[5] private balDown = [10e10, 30e10, 100e10, 500e10, 1000e10];
    uint256[5] private balDownRate = [1000, 1500, 2000, 5000, 6000]; 
    uint256[5] private balRecover = [15e18, 50e10, 150e10, 500e10, 1000e10];
    mapping(uint256=&amp;gt;bool) public balStatus; // bal=&amp;gt;status

    address[2] public feeReceivers;

    address public defaultRefer;
    uint256 public startTime;
    uint256 public lastDistribute;
    uint256 public totalUser; 
    uint256 public luckPool;
    uint256 public starPool;
    uint256 public topPool;

    mapping(uint256=&amp;gt;address[]) public dayLuckUsers;
    mapping(uint256=&amp;gt;uint256[]) public dayLuckUsersDeposit;
    mapping(uint256=&amp;gt;address[3]) public dayTopUsers;

    address[] public level4Users;

    struct OrderInfo {
        uint256 amount; 
        uint256 start;
        uint256 unfreeze; 
        bool isUnfreezed;
    }

    mapping(address =&amp;gt; OrderInfo[]) public orderInfos;

    address[] public depositors;

    struct UserInfo {
        address referrer;
        uint256 start;
        uint256 level;
        uint256 maxDeposit;
        uint256 totalDeposit;
        uint256 teamNum;
        uint256 maxDirectDeposit;
        uint256 teamTotalDeposit;
        uint256 totalFreezed;
        uint256 totalRevenue;
    }

    mapping(address=&amp;gt;UserInfo) public userInfo;
    mapping(uint256 =&amp;gt; mapping(address =&amp;gt; uint256)) public userLayer1DayDeposit;
    mapping(address =&amp;gt; mapping(uint256 =&amp;gt; address[])) public teamUsers;

    struct RewardInfo{
        uint256 capitals;
        uint256 statics;
        uint256 directs;
        uint256 level4Freezed;
        uint256 level4Released;
        uint256 level5Left;
        uint256 level5Freezed;
        uint256 level5Released;
        uint256 star;
        uint256 luck;
        uint256 top;
        uint256 split;
        uint256 splitDebt;
    }

    mapping(address=&amp;gt;RewardInfo) public rewardInfo;

    bool public isFreezeReward;

    event Register(address user, address referral);
    event Deposit(address user, uint256 amount);
    event DepositBySplit(address user, uint256 amount);
    event TransferBySplit(address user, address receiver, uint256 amount);
    event Withdraw(address user, uint256 withdrawable);

    constructor(IBEP20 _busdAddr, address _defaultRefer, address[2] memory _feeReceivers) public {
        busd = _busdAddr;
        feeReceivers = _feeReceivers;
        startTime = block.timestamp;
        lastDistribute = block.timestamp;
        defaultRefer = _defaultRefer;
    }

    function register(address _referral) external {
        require(userInfo[_referral].totalDeposit &amp;gt; 0 || _referral == defaultRefer, "invalid refer");
        UserInfo storage user = userInfo[msg.sender];
        require(user.referrer == address(0), "referrer bonded");
        user.referrer = _referral;
        user.start = block.timestamp;
        _updateTeamNum(msg.sender);
        totalUser = totalUser.add(1);
        emit Register(msg.sender, _referral);
    }

    function deposit(uint256 _amount) external {        
        busd.transferFrom(msg.sender, address(this), _amount);
        _deposit(msg.sender, _amount);
        emit Deposit(msg.sender, _amount);
    }

    function depositBySplit(uint256 _amount) external {
        require(_amount &amp;gt;= minDeposit &amp;amp;&amp;amp; _amount.mod(minDeposit) == 0, "amount err");
        require(userInfo[msg.sender].totalDeposit == 0, "actived");
        uint256 splitLeft = getCurSplit(msg.sender);
        require(splitLeft &amp;gt;= _amount, "insufficient split");
        rewardInfo[msg.sender].splitDebt = rewardInfo[msg.sender].splitDebt.add(_amount);
        _deposit(msg.sender, _amount);
        emit DepositBySplit(msg.sender, _amount);
    }

    function transferBySplit(address _receiver, uint256 _amount) external {
        require(_amount &amp;gt;= minDeposit &amp;amp;&amp;amp; _amount.mod(minDeposit) == 0, "amount err");
        uint256 splitLeft = getCurSplit(msg.sender);
        require(splitLeft &amp;gt;= _amount, "insufficient income");
        rewardInfo[msg.sender].splitDebt = rewardInfo[msg.sender].splitDebt.add(_amount);
        rewardInfo[_receiver].split = rewardInfo[_receiver].split.add(_amount);
        emit TransferBySplit(msg.sender, _receiver, _amount);
    }

    function distributePoolRewards() public {
        if(block.timestamp &amp;gt; lastDistribute.add(timeStep)){
            uint256 dayNow = getCurDay();
            _distributeStarPool();

            _distributeLuckPool(dayNow);

            _distributeTopPool(dayNow);
            lastDistribute = block.timestamp;
        }
    }

    function withdraw() external {
        distributePoolRewards();
        (uint256 staticReward, uint256 staticSplit) = _calCurStaticRewards(msg.sender);
        uint256 splitAmt = staticSplit;
        uint256 withdrawable = staticReward;

        (uint256 dynamicReward, uint256 dynamicSplit) = _calCurDynamicRewards(msg.sender);
        withdrawable = withdrawable.add(dynamicReward);
        splitAmt = splitAmt.add(dynamicSplit);

        RewardInfo storage userRewards = rewardInfo[msg.sender];
        userRewards.split = userRewards.split.add(splitAmt);

        userRewards.statics = 0;

        userRewards.directs = 0;
        userRewards.level4Released = 0;
        userRewards.level5Released = 0;

        userRewards.luck = 0;
        userRewards.star = 0;
        userRewards.top = 0;

        withdrawable = withdrawable.add(userRewards.capitals);
        userRewards.capitals = 0;

        busd.transfer(msg.sender, withdrawable);
        uint256 bal = busd.balanceOf(address(this));
        _setFreezeReward(bal);

        emit Withdraw(msg.sender, withdrawable);
    }

    function getCurDay() public view returns(uint256) {
        return (block.timestamp.sub(startTime)).div(timeStep);
    }

    function getDayLuckLength(uint256 _day) external view returns(uint256) {
        return dayLuckUsers[_day].length;
    }

    function getTeamUsersLength(address _user, uint256 _layer) external view returns(uint256) {
        return teamUsers[_user][_layer].length;
    }

    function getOrderLength(address _user) external view returns(uint256) {
        return orderInfos[_user].length;
    }

    function getDepositorsLength() external view returns(uint256) {
        return depositors.length;
    }

    function getMaxFreezing(address _user) public view returns(uint256) {
        uint256 maxFreezing;
        for(uint256 i = orderInfos[_user].length; i &amp;gt; 0; i--){
            OrderInfo storage order = orderInfos[_user][i - 1];
            if(order.unfreeze &amp;gt; block.timestamp){
                if(order.amount &amp;gt; maxFreezing){
                    maxFreezing = order.amount;
                }
            }else{
                break;
            }
        }
        return maxFreezing;
    }

    function getTeamDeposit(address _user) public view returns(uint256, uint256, uint256){
        uint256 totalTeam;
        uint256 maxTeam;
        uint256 otherTeam;
        for(uint256 i = 0; i &amp;lt; teamUsers[_user][0].length; i++){
            uint256 userTotalTeam = userInfo[teamUsers[_user][0][i]].teamTotalDeposit.add(userInfo[teamUsers[_user][0][i]].totalDeposit);
            totalTeam = totalTeam.add(userTotalTeam);
            if(userTotalTeam &amp;gt; maxTeam){
                maxTeam = userTotalTeam;
            }
        }
        otherTeam = totalTeam.sub(maxTeam);
        return(maxTeam, otherTeam, totalTeam);
    }

    function getCurSplit(address _user) public view returns(uint256){
        (, uint256 staticSplit) = _calCurStaticRewards(_user);
        (, uint256 dynamicSplit) = _calCurDynamicRewards(_user);
        return rewardInfo[_user].split.add(staticSplit).add(dynamicSplit).sub(rewardInfo[_user].splitDebt);
    }

    function _calCurStaticRewards(address _user) private view returns(uint256, uint256) {
        RewardInfo storage userRewards = rewardInfo[_user];
        uint256 totalRewards = userRewards.statics;
        uint256 splitAmt = totalRewards.mul(freezeIncomePercents).div(baseDivider);
        uint256 withdrawable = totalRewards.sub(splitAmt);
        return(withdrawable, splitAmt);
    }

    function _calCurDynamicRewards(address _user) private view returns(uint256, uint256) {
        RewardInfo storage userRewards = rewardInfo[_user];
        uint256 totalRewards = userRewards.directs.add(userRewards.level4Released).add(userRewards.level5Released);
        totalRewards = totalRewards.add(userRewards.luck.add(userRewards.star).add(userRewards.top));
        uint256 splitAmt = totalRewards.mul(freezeIncomePercents).div(baseDivider);
        uint256 withdrawable = totalRewards.sub(splitAmt);
        return(withdrawable, splitAmt);
    }

    function _updateTeamNum(address _user) private {
        UserInfo storage user = userInfo[_user];
        address upline = user.referrer;
        for(uint256 i = 0; i &amp;lt; referDepth; i++){
            if(upline != address(0)){
                userInfo[upline].teamNum = userInfo[upline].teamNum.add(1);
                teamUsers[upline][i].push(_user);
                _updateLevel(upline);
                if(upline == defaultRefer) break;
                upline = userInfo[upline].referrer;
            }else{
                break;
            }
        }
    }

    function _updateTopUser(address _user, uint256 _amount, uint256 _dayNow) private {
        userLayer1DayDeposit[_dayNow][_user] = userLayer1DayDeposit[_dayNow][_user].add(_amount);
        bool updated;
        for(uint256 i = 0; i &amp;lt; 3; i++){
            address topUser = dayTopUsers[_dayNow][i];
            if(topUser == _user){
                _reOrderTop(_dayNow);
                updated = true;
                break;
            }
        }
        if(!updated){
            address lastUser = dayTopUsers[_dayNow][2];
            if(userLayer1DayDeposit[_dayNow][lastUser] &amp;lt; userLayer1DayDeposit[_dayNow][_user]){
                dayTopUsers[_dayNow][2] = _user;
                _reOrderTop(_dayNow);
            }
        }
    }

    function _reOrderTop(uint256 _dayNow) private {
        for(uint256 i = 3; i &amp;gt; 1; i--){
            address topUser1 = dayTopUsers[_dayNow][i - 1];
            address topUser2 = dayTopUsers[_dayNow][i - 2];
            uint256 amount1 = userLayer1DayDeposit[_dayNow][topUser1];
            uint256 amount2 = userLayer1DayDeposit[_dayNow][topUser2];
            if(amount1 &amp;gt; amount2){
                dayTopUsers[_dayNow][i - 1] = topUser2;
                dayTopUsers[_dayNow][i - 2] = topUser1;
            }
        }
    }

    function _removeInvalidDeposit(address _user, uint256 _amount) private {
        UserInfo storage user = userInfo[_user];
        address upline = user.referrer;
        for(uint256 i = 0; i &amp;lt; referDepth; i++){
            if(upline != address(0)){
                if(userInfo[upline].teamTotalDeposit &amp;gt; _amount){
                    userInfo[upline].teamTotalDeposit = userInfo[upline].teamTotalDeposit.sub(_amount);
                }else{
                    userInfo[upline].teamTotalDeposit = 0;
                }
                if(upline == defaultRefer) break;
                upline = userInfo[upline].referrer;
            }else{
                break;
            }
        }
    }

    function _updateReferInfo(address _user, uint256 _amount) private {
        UserInfo storage user = userInfo[_user];
        address upline = user.referrer;
        for(uint256 i = 0; i &amp;lt; referDepth; i++){
            if(upline != address(0)){
                userInfo[upline].teamTotalDeposit = userInfo[upline].teamTotalDeposit.add(_amount);
                _updateLevel(upline);
                if(upline == defaultRefer) break;
                upline = userInfo[upline].referrer;
            }else{
                break;
            }
        }
    }

    function _updateLevel(address _user) private {
        UserInfo storage user = userInfo[_user];
        uint256 levelNow = _calLevelNow(_user);
        if(levelNow &amp;gt; user.level){
            user.level = levelNow;
            if(levelNow == 4){
                level4Users.push(_user);
            }
        }
    }

    function _calLevelNow(address _user) private view returns(uint256) {
        UserInfo storage user = userInfo[_user];
        uint256 total = user.totalDeposit;
        uint256 levelNow;
        if(total &amp;gt;= 1000e18){
            (uint256 maxTeam, uint256 otherTeam, ) = getTeamDeposit(_user);
            if(total &amp;gt;= 2000e18 &amp;amp;&amp;amp; user.teamNum &amp;gt;= 200 &amp;amp;&amp;amp; maxTeam &amp;gt;= 50000e18 &amp;amp;&amp;amp; otherTeam &amp;gt;= 50000e18){
                levelNow = 5;
            }else if(user.teamNum &amp;gt;= 50 &amp;amp;&amp;amp; maxTeam &amp;gt;= 10000e18 &amp;amp;&amp;amp; otherTeam &amp;gt;= 10000e18){
                levelNow = 4;
            }else{
                levelNow = 3;
            }
        }else if(total &amp;gt;= 500e18){
            levelNow = 2;
        }else if(total &amp;gt;= 50e18){
            levelNow = 1;
        }

        return levelNow;
    }

    function _deposit(address _user, uint256 _amount) private {
        UserInfo storage user = userInfo[_user];
        require(user.referrer != address(0), "register first");
        require(_amount &amp;gt;= minDeposit, "less than min");
        require(_amount.mod(minDeposit) == 0 &amp;amp;&amp;amp; _amount &amp;gt;= minDeposit, "mod err");
        require(user.maxDeposit == 0 || _amount &amp;gt;= user.maxDeposit, "less before");

        if(user.maxDeposit == 0){
            user.maxDeposit = _amount;
        }else if(user.maxDeposit &amp;lt; _amount){
            user.maxDeposit = _amount;
        }

        _distributeDeposit(_amount);

        if(user.totalDeposit == 0){
            uint256 dayNow = getCurDay();
            dayLuckUsers[dayNow].push(_user);
            dayLuckUsersDeposit[dayNow].push(_amount);

            _updateTopUser(user.referrer, _amount, dayNow);
        }

        depositors.push(_user);

        user.totalDeposit = user.totalDeposit.add(_amount);
        user.totalFreezed = user.totalFreezed.add(_amount);

        _updateLevel(msg.sender);

        uint256 addFreeze = (orderInfos[_user].length.div(2)).mul(timeStep);
        if(addFreeze &amp;gt; maxAddFreeze){
            addFreeze = maxAddFreeze;
        }
        uint256 unfreezeTime = block.timestamp.add(dayPerCycle).add(addFreeze);
        orderInfos[_user].push(OrderInfo(
            _amount, 
            block.timestamp, 
            unfreezeTime,
            false
        ));

        _unfreezeFundAndUpdateReward(msg.sender, _amount);

        distributePoolRewards();

        _updateReferInfo(msg.sender, _amount);

        _updateReward(msg.sender, _amount);

        _releaseUpRewards(msg.sender, _amount);

        uint256 bal = busd.balanceOf(address(this));
        _balActived(bal);
        if(isFreezeReward){
            _setFreezeReward(bal);
        }
    }

    function _unfreezeFundAndUpdateReward(address _user, uint256 _amount) private {
        UserInfo storage user = userInfo[_user];
        bool isUnfreezeCapital;
        for(uint256 i = 0; i &amp;lt; orderInfos[_user].length; i++){
            OrderInfo storage order = orderInfos[_user][i];
            if(block.timestamp &amp;gt; order.unfreeze  &amp;amp;&amp;amp; order.isUnfreezed == false &amp;amp;&amp;amp; _amount &amp;gt;= order.amount){
                order.isUnfreezed = true;
                isUnfreezeCapital = true;

                if(user.totalFreezed &amp;gt; order.amount){
                    user.totalFreezed = user.totalFreezed.sub(order.amount);
                }else{
                    user.totalFreezed = 0;
                }

                _removeInvalidDeposit(_user, order.amount);

                uint256 staticReward = order.amount.mul(dayRewardPercents).mul(dayPerCycle).div(timeStep).div(baseDivider);
                if(isFreezeReward){
                    if(user.totalFreezed &amp;gt; user.totalRevenue){
                        uint256 leftCapital = user.totalFreezed.sub(user.totalRevenue);
                        if(staticReward &amp;gt; leftCapital){
                            staticReward = leftCapital;
                        }
                    }else{
                        staticReward = 0;
                    }
                }
                rewardInfo[_user].capitals = rewardInfo[_user].capitals.add(order.amount);

                rewardInfo[_user].statics = rewardInfo[_user].statics.add(staticReward);

                user.totalRevenue = user.totalRevenue.add(staticReward);

                break;
            }
        }

        if(!isUnfreezeCapital){ 
            RewardInfo storage userReward = rewardInfo[_user];
            if(userReward.level5Freezed &amp;gt; 0){
                uint256 release = _amount;
                if(_amount &amp;gt;= userReward.level5Freezed){
                    release = userReward.level5Freezed;
                }
                userReward.level5Freezed = userReward.level5Freezed.sub(release);
                userReward.level5Released = userReward.level5Released.add(release);
                user.totalRevenue = user.totalRevenue.add(release);
            }
        }
    }

    function _distributeStarPool() private {
        uint256 level4Count;
        for(uint256 i = 0; i &amp;lt; level4Users.length; i++){
            if(userInfo[level4Users[i]].level == 4){
                level4Count = level4Count.add(1);
            }
        }
        if(level4Count &amp;gt; 0){
            uint256 reward = starPool.div(level4Count);
            uint256 totalReward;
            for(uint256 i = 0; i &amp;lt; level4Users.length; i++){
                if(userInfo[level4Users[i]].level == 4){
                    rewardInfo[level4Users[i]].star = rewardInfo[level4Users[i]].star.add(reward);
                    userInfo[level4Users[i]].totalRevenue = userInfo[level4Users[i]].totalRevenue.add(reward);
                    totalReward = totalReward.add(reward);
                }
            }
            if(starPool &amp;gt; totalReward){
                starPool = starPool.sub(totalReward);
            }else{
                starPool = 0;
            }
        }
    }

    function _distributeLuckPool(uint256 _dayNow) private {
        uint256 dayDepositCount = dayLuckUsers[_dayNow - 1].length;
        if(dayDepositCount &amp;gt; 0){
            uint256 checkCount = 10;
            if(dayDepositCount &amp;lt; 10){
                checkCount = dayDepositCount;
            }
            uint256 totalDeposit;
            uint256 totalReward;
            for(uint256 i = dayDepositCount; i &amp;gt; dayDepositCount.sub(checkCount); i--){
                totalDeposit = totalDeposit.add(dayLuckUsersDeposit[_dayNow - 1][i - 1]);
            }

            for(uint256 i = dayDepositCount; i &amp;gt; dayDepositCount.sub(checkCount); i--){
                address userAddr = dayLuckUsers[_dayNow - 1][i - 1];
                if(userAddr != address(0)){
                    uint256 reward = luckPool.mul(dayLuckUsersDeposit[_dayNow - 1][i - 1]).div(totalDeposit);
                    totalReward = totalReward.add(reward);
                    rewardInfo[userAddr].luck = rewardInfo[userAddr].luck.add(reward);
                    userInfo[userAddr].totalRevenue = userInfo[userAddr].totalRevenue.add(reward);
                }
            }
            if(luckPool &amp;gt; totalReward){
                luckPool = luckPool.sub(totalReward);
            }else{
                luckPool = 0;
            }
        }
    }

    function _distributeTopPool(uint256 _dayNow) private {
        uint16[3] memory rates = [5000, 3000, 2000];
        uint72[3] memory maxReward = [2000e18, 1000e18, 500e18];
        uint256 totalReward;
        for(uint256 i = 0; i &amp;lt; 3; i++){
            address userAddr = dayTopUsers[_dayNow - 1][i];
            if(userAddr != address(0)){
                uint256 reward = topPool.mul(rates[i]).div(baseDivider);
                if(reward &amp;gt; maxReward[i]){
                    reward = maxReward[i];
                }
                rewardInfo[userAddr].top = rewardInfo[userAddr].top.add(reward);
                userInfo[userAddr].totalRevenue = userInfo[userAddr].totalRevenue.add(reward);
                totalReward = totalReward.add(reward);
            }
        }
        if(topPool &amp;gt; totalReward){
            topPool = topPool.sub(totalReward);
        }else{
            topPool = 0;
        }
    }

    function _distributeDeposit(uint256 _amount) private {
        uint256 fee = _amount.mul(feePercents).div(baseDivider);
        busd.transfer(feeReceivers[0], fee.div(2));
        busd.transfer(feeReceivers[1], fee.div(2));
        uint256 luck = _amount.mul(luckPoolPercents).div(baseDivider);
        luckPool = luckPool.add(luck);
        uint256 star = _amount.mul(starPoolPercents).div(baseDivider);
        starPool = starPool.add(star);
        uint256 top = _amount.mul(topPoolPercents).div(baseDivider);
        topPool = topPool.add(top);
    }

    function _updateReward(address _user, uint256 _amount) private {
        UserInfo storage user = userInfo[_user];
        address upline = user.referrer;
        for(uint256 i = 0; i &amp;lt; referDepth; i++){
            if(upline != address(0)){
                uint256 newAmount = _amount;
                if(upline != defaultRefer){
                    uint256 maxFreezing = getMaxFreezing(upline);
                    if(maxFreezing &amp;lt; _amount){
                        newAmount = maxFreezing;
                    }
                }
                RewardInfo storage upRewards = rewardInfo[upline];
                uint256 reward;
                if(i &amp;gt; 4){
                    if(userInfo[upline].level &amp;gt; 4){
                        reward = newAmount.mul(level5Percents[i - 5]).div(baseDivider);
                        upRewards.level5Freezed = upRewards.level5Freezed.add(reward);
                    }
                }else if(i &amp;gt; 0){
                    if( userInfo[upline].level &amp;gt; 3){
                        reward = newAmount.mul(level4Percents[i - 1]).div(baseDivider);
                        upRewards.level4Freezed = upRewards.level4Freezed.add(reward);
                    }
                }else{
                    reward = newAmount.mul(directPercents).div(baseDivider);
                    upRewards.directs = upRewards.directs.add(reward);
                    userInfo[upline].totalRevenue = userInfo[upline].totalRevenue.add(reward);
                }
                if(upline == defaultRefer) break;
                upline = userInfo[upline].referrer;
            }else{
                break;
            }
        }
    }

    function _releaseUpRewards(address _user, uint256 _amount) private {
        UserInfo storage user = userInfo[_user];
        address upline = user.referrer;
        for(uint256 i = 0; i &amp;lt; referDepth; i++){
            if(upline != address(0)){
                uint256 newAmount = _amount;
                if(upline != defaultRefer){
                    uint256 maxFreezing = getMaxFreezing(upline);
                    if(maxFreezing &amp;lt; _amount){
                        newAmount = maxFreezing;
                    }
                }

                RewardInfo storage upRewards = rewardInfo[upline];
                if(i &amp;gt; 0 &amp;amp;&amp;amp; i &amp;lt; 5 &amp;amp;&amp;amp; userInfo[upline].level &amp;gt; 3){
                    if(upRewards.level4Freezed &amp;gt; 0){
                        uint256 level4Reward = newAmount.mul(level4Percents[i - 1]).div(baseDivider);
                        if(level4Reward &amp;gt; upRewards.level4Freezed){
                            level4Reward = upRewards.level4Freezed;
                        }
                        upRewards.level4Freezed = upRewards.level4Freezed.sub(level4Reward); 
                        upRewards.level4Released = upRewards.level4Released.add(level4Reward);
                        userInfo[upline].totalRevenue = userInfo[upline].totalRevenue.add(level4Reward);
                    }
                }

                if(i &amp;gt;= 5 &amp;amp;&amp;amp; userInfo[upline].level &amp;gt; 4){
                    if(upRewards.level5Left &amp;gt; 0){
                        uint256 level5Reward = newAmount.mul(level5Percents[i - 5]).div(baseDivider);
                        if(level5Reward &amp;gt; upRewards.level5Left){
                            level5Reward = upRewards.level5Left;
                        }
                        upRewards.level5Left = upRewards.level5Left.sub(level5Reward); 
                        upRewards.level5Freezed = upRewards.level5Freezed.add(level5Reward);
                    }
                }
                upline = userInfo[upline].referrer;
            }else{
                break;
            }
        }
    }

    function _balActived(uint256 _bal) private {
        for(uint256 i = balDown.length; i &amp;gt; 0; i--){
            if(_bal &amp;gt;= balDown[i - 1]){
                balStatus[balDown[i - 1]] = true;
                break;
            }
        }
    }

    function _setFreezeReward(uint256 _bal) private {
        for(uint256 i = balDown.length; i &amp;gt; 0; i--){
            if(balStatus[balDown[i - 1]]){
                uint256 maxDown = balDown[i - 1].mul(balDownRate[i - 1]).div(baseDivider);
                if(_bal &amp;lt; balDown[i - 1].sub(maxDown)){
                    isFreezeReward = true;
                }else if(isFreezeReward &amp;amp;&amp;amp; _bal &amp;gt;= balRecover[i - 1]){
                    isFreezeReward = false;
                }
                break;
            }
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After deployment, I interacted with this contract using Web3.js from the frontend.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚙️ PHP Backend Integration
&lt;/h2&gt;

&lt;p&gt;Even though Web3 is often associated with Node.js, I used PHP for its maturity and fast development cycle.&lt;/p&gt;

&lt;p&gt;The backend handles:&lt;/p&gt;

&lt;p&gt;Wallet signature verification&lt;/p&gt;

&lt;p&gt;API endpoints for user interactions&lt;/p&gt;

&lt;p&gt;Optional database logging&lt;/p&gt;

&lt;p&gt;I used ext-curl to interact with blockchain nodes (like BSC RPC) and keccak256 libraries for signature verification.&lt;/p&gt;




&lt;h2&gt;
  
  
  🐳 Dockerizing the App
&lt;/h2&gt;

&lt;p&gt;✅ Backend Dockerfile&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; php:8.2-apache&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; . /var/www/html/&lt;/span&gt;
&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="s"&gt; 80&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ Docker Compose Setup&lt;br&gt;
&lt;/p&gt;

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

&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;web&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;php:8.2-apache&lt;/span&gt;
        &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;php-fizzyfy-container2&lt;/span&gt;
        &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;8083:80"&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="s"&gt;./:/var/www/html/&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ Docker Compose Setup (Local)&lt;br&gt;
&lt;/p&gt;

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

&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;php-backend&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;./php-backend&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;8080:80"&lt;/span&gt;

  &lt;span class="na"&gt;frontend&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;./frontend&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;3000:3000"&lt;/span&gt;

  &lt;span class="na"&gt;ganache&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;trufflesuite/ganache&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;8545:8545"&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;Run everything locally with:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;






&lt;h2&gt;
  
  
  🌐 Frontend Interaction with Web3.js
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;web3&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Web3&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ethereum&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;connectWallet&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;accounts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;ethereum&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;request&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;eth_requestAccounts&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Connected account:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;accounts&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The frontend connects to MetaMask and reads data from the deployed contract on BSC testnet.&lt;/p&gt;




&lt;h2&gt;
  
  
  📦 Deployment Options
&lt;/h2&gt;

&lt;p&gt;This app is fully containerized and can be deployed to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AWS EC2/ECS&lt;/li&gt;
&lt;li&gt;GCP Cloud Run&lt;/li&gt;
&lt;li&gt;DigitalOcean App Platform&lt;/li&gt;
&lt;li&gt;Or even Kubernetes using Helm charts&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🛠️ Next Steps
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Integrate NFTs with ERC-721&lt;/li&gt;
&lt;li&gt;Add WalletConnect support&lt;/li&gt;
&lt;li&gt;CI/CD with GitHub Actions&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧠 Lessons Learned
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;PHP can still shine in Web3 projects when used wisely&lt;/li&gt;
&lt;li&gt;Docker ensures a consistent and portable development environment&lt;/li&gt;
&lt;li&gt;Binance Smart Chain is a fast, low-cost option for Ethereum-compatible dApps&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  👋 Let’s Connect
&lt;/h2&gt;

&lt;p&gt;If you're building DApps and have a background in PHP or traditional stacks, I’d love to connect and exchange ideas.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;💼 LinkedIn: &lt;a href="https://www.linkedin.com/in/surender-gupta/" rel="noopener noreferrer"&gt;https://www.linkedin.com/in/surender-gupta/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;💻 GitHub: &lt;a href="https://github.com/surendergupta" rel="noopener noreferrer"&gt;https://github.com/surendergupta&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Feel free to drop comments or suggestions below!&lt;/p&gt;




</description>
      <category>web3</category>
      <category>solidity</category>
      <category>php</category>
      <category>docker</category>
    </item>
    <item>
      <title>How we create project for devops that help me to find job in devops engineer role</title>
      <dc:creator>Surender Gupta</dc:creator>
      <pubDate>Sat, 17 May 2025 15:31:29 +0000</pubDate>
      <link>https://dev.to/surendergupta/how-we-create-project-for-devops-that-help-me-to-find-job-in-devops-engineer-role-l71</link>
      <guid>https://dev.to/surendergupta/how-we-create-project-for-devops-that-help-me-to-find-job-in-devops-engineer-role-l71</guid>
      <description></description>
      <category>devops</category>
      <category>career</category>
      <category>portfolio</category>
    </item>
    <item>
      <title>🚀 Hire a PHP Laravel Developer to Build Scalable Web Apps, Admin Panels, and DApps – 7+ Years of Experience</title>
      <dc:creator>Surender Gupta</dc:creator>
      <pubDate>Sat, 17 May 2025 14:53:24 +0000</pubDate>
      <link>https://dev.to/surendergupta/hire-a-php-laravel-developer-to-build-scalable-web-apps-admin-panels-and-dapps-7-years-of-4d05</link>
      <guid>https://dev.to/surendergupta/hire-a-php-laravel-developer-to-build-scalable-web-apps-admin-panels-and-dapps-7-years-of-4d05</guid>
      <description>&lt;h2&gt;
  
  
  🚀 Hire a PHP Laravel Developer to Build Scalable Web Apps, Admin Panels, and DApps – 7+ Years of Experience
&lt;/h2&gt;

&lt;p&gt;Hi, I'm &lt;strong&gt;Surender&lt;/strong&gt;, a full-stack web developer with over &lt;strong&gt;7 years of experience&lt;/strong&gt; crafting reliable, scalable, and secure web applications using &lt;strong&gt;PHP&lt;/strong&gt;, &lt;strong&gt;Laravel&lt;/strong&gt;, &lt;strong&gt;CodeIgniter&lt;/strong&gt;, and modern cloud/backend tools.&lt;/p&gt;

&lt;p&gt;Whether you're building a dynamic website, an admin dashboard, or even a decentralized app (DApp), I bring both experience and technical depth to the table.&lt;/p&gt;




&lt;h2&gt;
  
  
  💼 Services I Offer
&lt;/h2&gt;

&lt;p&gt;I help clients turn their ideas into fully functional web apps with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Full-stack development using PHP (Laravel, CodeIgniter)&lt;/li&gt;
&lt;li&gt;✅ REST API &amp;amp; backend development&lt;/li&gt;
&lt;li&gt;✅ Admin panels and dashboards&lt;/li&gt;
&lt;li&gt;✅ Web3 DApps (Ethereum integration, Solidity basics)&lt;/li&gt;
&lt;li&gt;✅ Database design &amp;amp; optimization (MySQL, MongoDB)&lt;/li&gt;
&lt;li&gt;✅ Bug fixing, refactoring, and performance tuning&lt;/li&gt;
&lt;li&gt;✅ Deployment &amp;amp; CI/CD with GitHub Actions or Jenkins&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://www.fiverr.com/surendergupt338/develop-php-laravel-codeigniter-sites-and-dapps" rel="noopener noreferrer"&gt;Check out my Fiverr Gig here&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🛠️ My Tech Stack
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;Tools&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Backend&lt;/td&gt;
&lt;td&gt;PHP, Laravel, CodeIgniter, Nodejs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Frontend&lt;/td&gt;
&lt;td&gt;Reactjs, HTML, Bootstrap, Tailwind&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Web3&lt;/td&gt;
&lt;td&gt;Solidity basics, Web3.js&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Database&lt;/td&gt;
&lt;td&gt;MySQL, MongoDB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DevOps&lt;/td&gt;
&lt;td&gt;Docker, GitHub Actions, Jenkins&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deployment&lt;/td&gt;
&lt;td&gt;GCP, AWS EC2, Shared Hosting&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Version Control&lt;/td&gt;
&lt;td&gt;Git, GitHub&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🧪 Case Studies &amp;amp; Sample Work
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🔹 Custom CRM with Laravel
&lt;/h3&gt;

&lt;p&gt;Developed a full-featured CRM system for a logistics company, including user roles, ticketing, and reporting. Integrated automated backups and role-based access control.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔹 CodeIgniter Admin Panel
&lt;/h3&gt;

&lt;p&gt;Built a lightweight admin panel for an eCommerce platform using CodeIgniter. Features included product management, user access, and sales reports.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔹 DApp MVP
&lt;/h3&gt;

&lt;p&gt;Helped a blockchain startup create a proof-of-concept DApp integrating basic smart contract interactions using Web3.js and Laravel.&lt;/p&gt;




&lt;h2&gt;
  
  
  📞 Want to Work With Me?
&lt;/h2&gt;

&lt;p&gt;If you're building something exciting or need help fixing/optimizing an existing web application — let’s connect!&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;✅ &lt;strong&gt;&lt;a href="https://www.fiverr.com/surendergupt338/develop-php-laravel-codeigniter-sites-and-dapps" rel="noopener noreferrer"&gt;Visit My Fiverr Profile&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
💬 Or reach out via LinkedIn or Email (add your contact/email here if applicable)&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  ✍️ Why Clients Work With Me
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Clear and fast communication
&lt;/li&gt;
&lt;li&gt;Clean, maintainable code
&lt;/li&gt;
&lt;li&gt;On-time delivery
&lt;/li&gt;
&lt;li&gt;Flexible and open to feedback
&lt;/li&gt;
&lt;li&gt;Affordable pricing with top-tier quality&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Let’s build something great together!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>javascript</category>
      <category>softwaredevelopment</category>
    </item>
    <item>
      <title>🚀 Terraform Directory Structure – The Right Way!</title>
      <dc:creator>Surender Gupta</dc:creator>
      <pubDate>Thu, 15 May 2025 04:43:24 +0000</pubDate>
      <link>https://dev.to/surendergupta/terraform-directory-structure-the-right-way-95f</link>
      <guid>https://dev.to/surendergupta/terraform-directory-structure-the-right-way-95f</guid>
      <description>&lt;p&gt;When building cloud infrastructure using Terraform, &lt;strong&gt;your directory structure matters&lt;/strong&gt; more than you think.&lt;/p&gt;

&lt;p&gt;A well-structured Terraform layout helps you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Scale easily across environments&lt;/li&gt;
&lt;li&gt;Reuse code with modules&lt;/li&gt;
&lt;li&gt;Avoid production mistakes&lt;/li&gt;
&lt;li&gt;Automate safely with scripts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In this post, I’ll show you the best practices I follow for organizing Terraform projects used in &lt;strong&gt;Dev&lt;/strong&gt;, &lt;strong&gt;Stage&lt;/strong&gt;, and &lt;strong&gt;Prod&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  📁 1. Environment Separation: Dev, Stage, Prod
&lt;/h2&gt;

&lt;p&gt;Organize each environment in its own folder:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;terraform/
├── dev/
│   ├── main.tf
│   ├── variables.tf
│   ├── outputs.tf
├── stage/
│   └── ...
├── prod/
│   └── ...
└── env/
    ├── dev.tfvars
    ├── stage.tfvars
    └── prod.tfvars
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;✅ Pro tip: Keep &lt;code&gt;.tfvars&lt;/code&gt; values in a separate &lt;code&gt;env/&lt;/code&gt; directory for cleaner management.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Prevents accidental changes to production&lt;/li&gt;
&lt;li&gt;Clear separation of responsibilities&lt;/li&gt;
&lt;li&gt;Easier CI/CD integration&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  📦 2. Reuse Code with Modules
&lt;/h2&gt;

&lt;p&gt;Instead of copying and pasting the same code, create reusable modules:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;modules/
├── vpc/
│   ├── main.tf
│   ├── variables.tf
│   └── outputs.tf
├── ec2/
│   └── ...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Usage example:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hcl"&gt;&lt;code&gt;&lt;span class="nx"&gt;module&lt;/span&gt; &lt;span class="s2"&gt;"vpc"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;source&lt;/span&gt;     &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"../../modules/vpc"&lt;/span&gt;
  &lt;span class="nx"&gt;cidr_block&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;var&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;vpc_cidr&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Benefits:&lt;/strong&gt;&lt;br&gt;
💡 Define once, use everywhere&lt;br&gt;
🔄 Ensures consistency across environments&lt;br&gt;
🧩 Simplifies testing and debugging&lt;/p&gt;


&lt;h2&gt;
  
  
  🤖 3. Automate with Scripts
&lt;/h2&gt;

&lt;p&gt;Use shell scripts to handle Terraform operations like &lt;code&gt;init&lt;/code&gt;, &lt;code&gt;apply&lt;/code&gt;, and &lt;code&gt;destroy&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;scripts/
├── init.sh        # terraform init
├── plan.sh        # terraform plan
├── apply.sh       # terraform apply
└── teardown.sh    # terraform destroy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why script it?&lt;/strong&gt;&lt;br&gt;
⏱️ Saves time&lt;br&gt;
🔐 Reduces manual error&lt;br&gt;
⚙️ Fits into CI/CD pipelines seamlessly&lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 4. Core Terraform Files
&lt;/h2&gt;

&lt;p&gt;Each environment/module folder typically contains:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;main.tf&lt;/code&gt;: Infrastructure definitions&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;variables.tf&lt;/code&gt;: Variable declarations&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;outputs.tf&lt;/code&gt;: Exposed outputs&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;terraform.tfvars&lt;/code&gt;: Variable values (optional if using &lt;code&gt;env/*.tfvars&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;provider.tf&lt;/code&gt;: Cloud provider setup&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;backend.tf&lt;/code&gt;: Remote state configuration&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;🛡️ Store state remotely (e.g., S3 + DynamoDB) for security and team collaboration.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🖼️ Visual: Terraform Directory Structure
&lt;/h2&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%2Fym3dz2c5n6oktsxmrxfx.jpeg" 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%2Fym3dz2c5n6oktsxmrxfx.jpeg" alt="Terraform Directory Structure" width="572" height="610"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Infographic: High-level layout of a scalable Terraform project&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  ✅ Summary: Why This Structure Works
&lt;/h2&gt;

&lt;p&gt;✅ Modular and reusable&lt;br&gt;
✅ Safer deployments&lt;br&gt;
✅ DevOps- and CI/CD-friendly&lt;br&gt;
✅ Environment-ready (Dev, Stage, Prod)&lt;/p&gt;




&lt;h2&gt;
  
  
  💬 What’s your Terraform setup look like?
&lt;/h2&gt;

&lt;p&gt;Do you structure things differently?&lt;br&gt;&lt;br&gt;
Have tips for managing multiple environments or state files?&lt;/p&gt;

&lt;p&gt;Let’s share ideas in the comments 💬👇&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;#Terraform #DevOps #InfrastructureAsCode #AWS #GCP #Azure #CloudEngineering #SRE #CI/CD #IaC&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>terraform</category>
      <category>automation</category>
      <category>infrastructureascode</category>
      <category>sre</category>
    </item>
    <item>
      <title>🚀 From Zero to Hero: Deploying a FastAPI Backend on Google Cloud Run with CI/CD, Docker &amp; MongoDB</title>
      <dc:creator>Surender Gupta</dc:creator>
      <pubDate>Fri, 02 May 2025 11:02:06 +0000</pubDate>
      <link>https://dev.to/surendergupta/from-zero-to-hero-deploying-a-fastapi-backend-on-google-cloud-run-with-cicd-docker-mongodb-1301</link>
      <guid>https://dev.to/surendergupta/from-zero-to-hero-deploying-a-fastapi-backend-on-google-cloud-run-with-cicd-docker-mongodb-1301</guid>
      <description>&lt;h2&gt;
  
  
  Hey Devs! 👋
&lt;/h2&gt;

&lt;p&gt;This week, I took on a fun but powerful challenge — containerizing a FastAPI backend, wiring up MongoDB, pushing to Google Cloud Run, and fully automating it with GitHub Actions. And let me tell you — it feels GOOD to ship like a pro 💪&lt;/p&gt;

&lt;p&gt;Here’s how I did it (and how you can too).&lt;/p&gt;




&lt;h3&gt;
  
  
  🧠 TL;DR
&lt;/h3&gt;

&lt;p&gt;👉 FastAPI backend for a logging/incident tracking service&lt;br&gt;
👉 Dockerized and deployed to Google Cloud Run&lt;br&gt;
👉 MongoDB Atlas for persistence&lt;br&gt;
👉 GitHub Actions for zero-touch deployments&lt;br&gt;
👉 Full CI/CD pipeline using Artifact Registry + Cloud Run&lt;br&gt;
👉 Production-ready, scalable, and auto-deployed on every push!&lt;/p&gt;




&lt;h3&gt;
  
  
  🔧 Tech Stack
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;FastAPI – blazing fast Python framework&lt;/li&gt;
&lt;li&gt;Docker – containerizing like a boss&lt;/li&gt;
&lt;li&gt;MongoDB Atlas – cloud-hosted database&lt;/li&gt;
&lt;li&gt;Google Cloud Run – serverless container deployment&lt;/li&gt;
&lt;li&gt;GitHub Actions – CI/CD pipelines for automation&lt;/li&gt;
&lt;li&gt;Google Artifact Registry – to store and manage container images&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  💻 What I Built
&lt;/h3&gt;

&lt;p&gt;A REST API to log incidents/alerts that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Accepts structured JSON data via POST&lt;/li&gt;
&lt;li&gt;Stores it in a MongoDB database&lt;/li&gt;
&lt;li&gt;Returns clean, structured responses&lt;/li&gt;
&lt;li&gt;Has built-in Swagger UI (/docs)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🌐 Live Demo:&lt;br&gt;
🔗 &lt;a href="https://fastapi-agent-154172965587.us-central1.run.app" rel="noopener noreferrer"&gt;https://fastapi-agent-154172965587.us-central1.run.app&lt;/a&gt;&lt;br&gt;
(Play around with /docs – it's interactive!)&lt;/p&gt;




&lt;h3&gt;
  
  
  🐳 Dockerization in a Nutshell
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; python:3.11-slim&lt;/span&gt;
&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /app&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; requirements.txt .&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; . .&lt;/span&gt;
&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8080"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Simple. Fast. Efficient.&lt;/p&gt;




&lt;h3&gt;
  
  
  ☁️ Deployment to Google Cloud Run
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Build Docker image&lt;/li&gt;
&lt;li&gt;Push to Artifact Registry&lt;/li&gt;
&lt;li&gt;Deploy to Cloud Run via GitHub Actions&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I configured service accounts, IAM roles, and tokens securely to allow the GitHub pipeline to deploy like magic. ✨&lt;/p&gt;




&lt;h3&gt;
  
  
  ⚙️ CI/CD with GitHub Actions
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Deploy to Cloud Run&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt; &lt;span class="nv"&gt;main&lt;/span&gt; &lt;span class="pi"&gt;]&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;deploy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v3&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;Set up Google Cloud SDK&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;google-github-actions/setup-gcloud@v1&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;project_id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.GCP_PROJECT_ID }}&lt;/span&gt;
          &lt;span class="na"&gt;service_account_key&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.GCP_SA_KEY }}&lt;/span&gt;
          &lt;span class="na"&gt;export_default_credentials&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;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Docker build &amp;amp; push&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;docker build -t REGION-docker.pkg.dev/PROJECT_ID/REPO/fastapi-backend .&lt;/span&gt;
          &lt;span class="s"&gt;docker push REGION-docker.pkg.dev/PROJECT_ID/REPO/fastapi-backend&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;Deploy to Cloud Run&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;gcloud run deploy fastapi-backend \&lt;/span&gt;
            &lt;span class="s"&gt;--image REGION-docker.pkg.dev/PROJECT_ID/REPO/fastapi-backend \&lt;/span&gt;
            &lt;span class="s"&gt;--platform managed \&lt;/span&gt;
            &lt;span class="s"&gt;--region REGION \&lt;/span&gt;
            &lt;span class="s"&gt;--allow-unauthenticated&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;🔐 Secrets are managed via GitHub’s encrypted secret manager.&lt;/p&gt;




&lt;h3&gt;
  
  
  📖 Full Deep Dive (Step-by-Step)
&lt;/h3&gt;

&lt;p&gt;👉 I broke down every single detail in this Medium article:&lt;br&gt;
📖 &lt;a href="https://medium.com/@gupta.surender.1990/how-i-containerized-and-deployed-a-fastapi-backend-on-google-cloud-run-like-a-pro-5f3caf9cc543" rel="noopener noreferrer"&gt;How I Containerized and Deployed a FastAPI Backend on Google Cloud Run (Like a Pro)&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  💻 Source Code on GitHub
&lt;/h3&gt;

&lt;p&gt;Browse, fork, and ⭐ the repo here:&lt;br&gt;
🔗 &lt;a href="https://github.com/surendergupta/task_backend_devops" rel="noopener noreferrer"&gt;github.com/surendergupta/task_backend_devops&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  🙌 Final Thoughts
&lt;/h3&gt;

&lt;p&gt;✅ Cloud Run made scaling effortless&lt;br&gt;
✅ GitHub Actions made CI/CD painless&lt;br&gt;
✅ FastAPI made building APIs fun again&lt;br&gt;
✅ Docker made everything consistent&lt;/p&gt;

&lt;p&gt;If you're a Python/DevOps/cloud enthusiast, I highly recommend trying this stack combo out. You’ll learn a ton!&lt;/p&gt;




&lt;h3&gt;
  
  
  🔁 Let’s Connect
&lt;/h3&gt;

&lt;p&gt;If you enjoyed this, leave a ❤️ or drop a comment below!&lt;br&gt;
Got questions? I’m happy to help or collaborate.&lt;/p&gt;

&lt;p&gt;Let’s build cool things together 🙌&lt;/p&gt;

</description>
      <category>githubactions</category>
      <category>python</category>
      <category>cicd</category>
      <category>googlecloud</category>
    </item>
    <item>
      <title>🚀 How I Deployed a Self-Hosted n8n Instance on Google Cloud Free Tier (with Docker Compose + Script Automation)</title>
      <dc:creator>Surender Gupta</dc:creator>
      <pubDate>Fri, 02 May 2025 10:27:47 +0000</pubDate>
      <link>https://dev.to/surendergupta/how-i-deployed-a-self-hosted-n8n-instance-on-google-cloud-free-tier-with-docker-compose-script-lo0</link>
      <guid>https://dev.to/surendergupta/how-i-deployed-a-self-hosted-n8n-instance-on-google-cloud-free-tier-with-docker-compose-script-lo0</guid>
      <description>&lt;h2&gt;
  
  
  Hey DEV community! 👋
&lt;/h2&gt;

&lt;p&gt;I'm a DevOps Engineer obsessed with automation, cloud efficiency, and squeezing every drop out of free tiers. Recently, I deployed n8n, the powerful open-source workflow automation tool, on a GCP e2-micro instance (aka Free Tier heaven) — and it’s running securely, persistently, and flawlessly.&lt;/p&gt;

&lt;p&gt;Let me show you how I did it — step-by-step, script-included, and cloud-cost-friendly. 💸☁️&lt;/p&gt;




&lt;h3&gt;
  
  
  💡 Why n8n?
&lt;/h3&gt;

&lt;p&gt;If Zapier and Node-RED had a baby, it would be n8n. You can automate everything — from APIs to Slack workflows — and run it self-hosted for full control and zero SaaS limits.&lt;/p&gt;




&lt;h3&gt;
  
  
  🧰 Stack &amp;amp; Setup
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;🧱 Google Cloud Platform Free Tier (e2-micro VM)&lt;/li&gt;
&lt;li&gt;🐳 Docker + Docker Compose&lt;/li&gt;
&lt;li&gt;🔐 Basic Auth + Secured SSH&lt;/li&gt;
&lt;li&gt;📁 Persistent storage via Docker volumes&lt;/li&gt;
&lt;li&gt;⚙️ Automated install via shell script&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  🔧 Full Guide on Medium
&lt;/h3&gt;

&lt;p&gt;I documented everything — provisioning the VM, opening the right ports, installing Docker, configuring .env, securing the VM, and even automating it all via a deploy script.&lt;/p&gt;

&lt;h3&gt;
  
  
  👉 Read the full tutorial here:
&lt;/h3&gt;

&lt;p&gt;📖 &lt;a href="https://medium.com/@gupta.surender.1990/how-to-deploy-a-self-hosted-n8n-instance-on-google-cloud-free-tier-with-docker-compose-63f7fa1a40db" rel="noopener noreferrer"&gt;https://medium.com/@gupta.surender.1990/how-to-deploy-a-self-hosted-n8n-instance-on-google-cloud-free-tier-with-docker-compose-63f7fa1a40db&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  🖥️ TL;DR — The Highlights
&lt;/h3&gt;

&lt;p&gt;✅ Create an Ubuntu 22.04 e2-micro instance&lt;br&gt;
✅ Install Docker + Compose&lt;br&gt;
✅ Setup .env with Basic Auth&lt;br&gt;
✅ Mount persistent volume&lt;br&gt;
✅ Open only ports 22 and 5678&lt;br&gt;
✅ Secure SSH (no root login, key-based access only)&lt;br&gt;
✅ Hit your instance on http://:5678 and start building!&lt;/p&gt;




&lt;h3&gt;
  
  
  🧪 Bonus: One-Command Deploy Script
&lt;/h3&gt;

&lt;p&gt;Want it automated? I built a deploy script that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Installs Docker &amp;amp; Compose&lt;/li&gt;
&lt;li&gt;Sets up environment variables&lt;/li&gt;
&lt;li&gt;Builds your docker-compose.yml&lt;/li&gt;
&lt;li&gt;Starts the n8n container — ready to go!&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Just run:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;chmod&lt;/span&gt; +x n8n-deploy-gcp.sh
./n8n-deploy-gcp.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And boom 💥, you’ve got a self-hosted automation engine for free.&lt;/p&gt;




&lt;h3&gt;
  
  
  🔒 Security Reminder
&lt;/h3&gt;

&lt;p&gt;Please don’t forget to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use strong Basic Auth credentials&lt;/li&gt;
&lt;li&gt;Restrict open ports in your GCP firewall&lt;/li&gt;
&lt;li&gt;Disable password-based SSH login
Secure automation is happy automation. 😄&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  🤝 Let’s Connect
&lt;/h3&gt;

&lt;p&gt;If you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;❤️ n8n&lt;/li&gt;
&lt;li&gt;💻 Love DevOps&lt;/li&gt;
&lt;li&gt;🧠 Automate all the things&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let’s chat! Drop your feedback, questions, or improvements in the comments.&lt;/p&gt;




&lt;h3&gt;
  
  
  🚀 Go Read It &amp;amp; Deploy Your Own for FREE!
&lt;/h3&gt;

&lt;p&gt;👉 &lt;a href="https://medium.com/@gupta.surender.1990/how-to-deploy-a-self-hosted-n8n-instance-on-google-cloud-free-tier-with-docker-compose-63f7fa1a40db" rel="noopener noreferrer"&gt;https://medium.com/@gupta.surender.1990/how-to-deploy-a-self-hosted-n8n-instance-on-google-cloud-free-tier-with-docker-compose-63f7fa1a40db&lt;/a&gt;&lt;/p&gt;

</description>
      <category>n8n</category>
      <category>docker</category>
      <category>gcp</category>
      <category>automation</category>
    </item>
  </channel>
</rss>
