<?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>Forem: Solomon Nnajieze</title>
    <description>The latest articles on Forem by Solomon Nnajieze (@snnajieze).</description>
    <link>https://forem.com/snnajieze</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%2F3671306%2F6e3a83ca-4dfd-48d9-8635-442e76290ba0.jpg</url>
      <title>Forem: Solomon Nnajieze</title>
      <link>https://forem.com/snnajieze</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/snnajieze"/>
    <language>en</language>
    <item>
      <title>Essential AI &amp; Automation Tools for Modern Professionals</title>
      <dc:creator>Solomon Nnajieze</dc:creator>
      <pubDate>Thu, 12 Feb 2026 03:18:36 +0000</pubDate>
      <link>https://forem.com/snnajieze/essential-ai-automation-tools-for-modern-professionals-2ldo</link>
      <guid>https://forem.com/snnajieze/essential-ai-automation-tools-for-modern-professionals-2ldo</guid>
      <description>&lt;p&gt;I registered for a course on AI and Automation at &lt;a href="http://tsacademyonline.com" rel="noopener noreferrer"&gt;TS Academy&lt;/a&gt;, went through the curriculum, and I was amazed at the amount of AI and Automation tools covered in the course.&lt;/p&gt;

&lt;p&gt;The landscape of AI and automation is rapidly evolving, transforming how we work and solve problems across industries. As businesses increasingly seek efficiency and innovation, mastering the right tools has become crucial for professionals looking to stay competitive. The TS Academy AI &amp;amp; Automation curriculum provides comprehensive training on industry-leading platforms that enable anyone, from beginners to seasoned professionals, to build intelligent systems, streamline workflows, and create automation-driven solutions.&lt;/p&gt;

&lt;p&gt;Whether you're looking to automate repetitive tasks, build conversational AI agents, or develop complex multi-app workflows, understanding these tools is your gateway to the future of work. Here's a curated list of the essential platforms covered in this transformative program:&lt;/p&gt;




&lt;h2&gt;
  
  
  Automation Workflow Platforms
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Zapier&lt;/strong&gt;&lt;br&gt;
Zapier is a user-friendly, no-code automation platform that connects your favorite apps and services to automate workflows and business processes. Zapier enables you to create "Zaps" (automations) using triggers and actions to move data between applications, format information, add delays, and integrate Google Workspace tools seamlessly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Make (formerly Integromat)&lt;/strong&gt;&lt;br&gt;
An advanced visual automation platform that allows you to build complex, multi-app workflows through scenarios, modules, and data mapping. Make offers sophisticated features, including routers, filters, conditional logic, webhooks, custom integrations, data stores, and API connections for enterprise-level automation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;n8n&lt;/strong&gt;&lt;br&gt;
This is an open-source, self-hosted workflow automation tool that provides extensive customization options. n8n uses a node-based interface to build automations with triggers, workflows, logic controls, data transformations, webhooks, API integrations, and robust error handling capabilities.&lt;/p&gt;




&lt;h2&gt;
  
  
  AI Integration &amp;amp; Development
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;ChatGPT API (OpenAI)&lt;/strong&gt;&lt;br&gt;
OpenAI's powerful language model API enables developers to integrate advanced conversational AI capabilities into applications. The ChatGPT API allows for natural language processing, content generation, data analysis, and intelligent automation when connected through platforms like n8n or custom applications.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Claude (Anthropic)&lt;/strong&gt;&lt;br&gt;
Claude is an AI assistant created by Anthropic. It is similar to ChatGPT and can be integrated via API for tasks requiring natural language understanding, content creation, analysis, and conversational interactions within automated workflows.&lt;/p&gt;




&lt;h2&gt;
  
  
  Data Management &amp;amp; Organization
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Airtable&lt;/strong&gt;&lt;br&gt;
A hybrid database-spreadsheet platform that combines the simplicity of spreadsheets with the power of databases. Airtable features bases, tables, records, fields, multiple view types (Grid, Form, Calendar, Gallery, Kanban), relationship management, formulas, automations, forms for data collection, and collaboration tools. These make it ideal for client management, project tracking, and workflow organization.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Google Sheets&lt;/strong&gt;&lt;br&gt;
This is a cloud-based spreadsheet application that serves as a versatile data source for automation workflows. It integrates seamlessly with automation platforms to store, retrieve, and manipulate data in real-time across various automated processes.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conversational AI &amp;amp; Chatbot Platforms
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Voiceflow&lt;/strong&gt;&lt;br&gt;
Voiceflow is a collaborative platform for designing, prototyping, and building conversational AI experiences, including chatbots and voice assistants. Voiceflow provides a visual interface for creating complex conversation flows, integrating with various channels, and deploying intelligent conversational agents.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ManyChat&lt;/strong&gt;&lt;br&gt;
ManyChat is a platform used in building chatbots that focuses on marketing automation and customer engagement, particularly for Facebook Messenger, Instagram, and SMS. It enables businesses to create automated conversation flows for lead generation, customer support, and sales.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Chatbase&lt;/strong&gt;&lt;br&gt;
It is a platform for building AI-powered chatbots trained on custom data sources. Chatbase allows you to create intelligent chat assistants that can answer questions based on your specific content, documents, or knowledge base.&lt;/p&gt;




&lt;h2&gt;
  
  
  AI Voice Technology
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Vapi&lt;/strong&gt;&lt;br&gt;
Vapi is a platform specifically designed for building AI voice agents that can handle real-time voice conversations. It enables the creation of intelligent phone assistants and voice-enabled applications with natural language understanding.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Retell AI&lt;/strong&gt;&lt;br&gt;
This is a conversational AI platform focused on voice-based interactions, allowing developers to create sophisticated voice agents for customer service, sales, and support applications with natural speech capabilities.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ElevenLabs&lt;/strong&gt;&lt;br&gt;
ElevenLabs is an advanced AI voice synthesis platform that generates highly realistic, natural-sounding voices. It is used for creating voiceovers, audio content, and powering voice agents with lifelike speech output.&lt;/p&gt;




&lt;h2&gt;
  
  
  AI-Powered Development (Vibe Coding) Tools
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Bolt.new&lt;/strong&gt;&lt;br&gt;
This is a no-code/low-code AI development platform that enables rapid application development using AI assistance. Bolt.new represents the emerging category of "vibe coding" tools that help users build applications through natural language instructions and AI-powered code generation.&lt;/p&gt;




&lt;h2&gt;
  
  
  AI Agent Development Platforms
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Relevance AI&lt;/strong&gt;&lt;br&gt;
A low-code/no-code platform for building AI agents and multi-agent systems. Relevance AI enables businesses to create autonomous AI workflows that can handle complex tasks, make decisions, and integrate with various data sources and APIs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lindy&lt;/strong&gt;&lt;br&gt;
Lindy is an AI agent platform that allows users to create autonomous assistants capable of performing tasks, managing workflows, and interacting with multiple applications to streamline business processes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Flowise&lt;/strong&gt;&lt;br&gt;
It is an open-source tool for building customized AI flows and agents using a visual, drag-and-drop interface. Flowise enables the creation of large language model (LLM) applications and intelligent automation workflows.&lt;/p&gt;




&lt;h2&gt;
  
  
  AI Frameworks &amp;amp; Libraries
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;LangChain&lt;/strong&gt;&lt;br&gt;
This is a code-first framework for building applications powered by large language models (LLMs). LangChain provides tools for creating chains, agents, and complex AI workflows that can interact with external data sources, APIs, and perform multi-step reasoning.&lt;/p&gt;




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

&lt;p&gt;The convergence of AI and automation is not just changing technology. It is reshaping entire industries and career trajectories. These tools represent the foundation of modern intelligent systems, from simple workflow automations to sophisticated AI agents capable of autonomous decision-making. Whether you are a business professional looking to increase productivity, a developer building the next generation of AI applications, or an entrepreneur seeking to leverage automation for competitive advantage, mastering these platforms opens doors to unprecedented opportunities.&lt;/p&gt;

&lt;p&gt;The &lt;a href="http://tsacademyonline.com/" rel="noopener noreferrer"&gt;TS Academy&lt;/a&gt; AI &amp;amp; Automation curriculum is designed to take you from foundational concepts to practical implementation across all these tools, preparing you for high-demand roles such as AI Automation Specialist, Business Process Automation Consultant, No-Code AI Developer, AI Product Manager, and Intelligent Systems Analyst. With comprehensive hands-on projects, mentorship support, and job placement assistance, this program provides the complete pathway to becoming job-ready in 3-6 months.&lt;/p&gt;

&lt;p&gt;The future belongs to those who can harness the power of AI and automation. Which of these tools are you most excited to master?&lt;/p&gt;

&lt;h1&gt;
  
  
  AIAutomation #NoCode #WorkflowAutomation #ArtificialIntelligence #AIAgents
&lt;/h1&gt;

</description>
    </item>
    <item>
      <title>CI/CD Is Not Only for the Cloud: Building a CI/CD Pipeline for Shared Hosting Using GitHub Actions</title>
      <dc:creator>Solomon Nnajieze</dc:creator>
      <pubDate>Mon, 22 Dec 2025 22:38:51 +0000</pubDate>
      <link>https://forem.com/snnajieze/cicd-is-not-only-for-the-cloud-building-a-cicd-pipeline-for-shared-hosting-using-github-actions-4c4h</link>
      <guid>https://forem.com/snnajieze/cicd-is-not-only-for-the-cloud-building-a-cicd-pipeline-for-shared-hosting-using-github-actions-4c4h</guid>
      <description>&lt;h2&gt;
  
  
  Introduction: CI/CD Beyond Cloud Platforms
&lt;/h2&gt;

&lt;p&gt;When people hear Continuous Integration and Continuous Deployment (CI/CD), they often think it’s something that only works on cloud platforms like AWS, Azure, or GCP, Kubernetes, EC2, containers, and all that.&lt;/p&gt;

&lt;p&gt;But the truth is:&lt;/p&gt;

&lt;p&gt;CI/CD is not made for the cloud alone. It is a workflow, and it can work anywhere, including shared hosting.&lt;/p&gt;

&lt;p&gt;CI/CD pipelines are &lt;strong&gt;not exclusive to cloud infrastructure&lt;/strong&gt;.&lt;br&gt;
In this article, I will walk you through how I built a real &lt;strong&gt;CI/CD pipeline&lt;/strong&gt; for a Laravel application deployed on &lt;strong&gt;shared hosting (Namecheap)&lt;/strong&gt; using &lt;strong&gt;GitHub Actions&lt;/strong&gt; + &lt;strong&gt;SSH&lt;/strong&gt; + &lt;strong&gt;rsync&lt;/strong&gt;, even with the limitations of traditional cPanel servers.&lt;/p&gt;

&lt;p&gt;This guild is based on a &lt;strong&gt;real-world deployment&lt;/strong&gt; on Namecheap shared hosting, highlighting challenges, fixes, and best practices.&lt;/p&gt;


&lt;h2&gt;
  
  
  Why CI/CD on Shared Hosting?
&lt;/h2&gt;

&lt;p&gt;Shared hosting is still very common for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Personal projects&lt;/li&gt;
&lt;li&gt;Small businesses&lt;/li&gt;
&lt;li&gt;MVPs&lt;/li&gt;
&lt;li&gt;Legacy systems&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Yet most CI/CD tutorials completely ignore it.&lt;/p&gt;
&lt;h3&gt;
  
  
  Common misconceptions
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;“You need Kubernetes.”&lt;/li&gt;
&lt;li&gt;“You need Docker.”&lt;/li&gt;
&lt;li&gt;“You need AWS, Azure, or GCP.”&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Reality
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;If you have SSH access, you can do CI/CD&lt;/li&gt;
&lt;li&gt;GitHub Actions works anywhere&lt;/li&gt;
&lt;li&gt;Automation is about process, not infrastructure&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  The Stack We Used
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Laravel application&lt;/li&gt;
&lt;li&gt;Shared hosting (Namecheap)&lt;/li&gt;
&lt;li&gt;SSH access enabled&lt;/li&gt;
&lt;li&gt;GitHub Actions&lt;/li&gt;
&lt;li&gt;&lt;p&gt;rsync for deployment&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;No Docker.&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;No cloud VM.&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;No managed pipelines.&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  The Main Idea
&lt;/h2&gt;

&lt;p&gt;The idea is simple:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Push code to GitHub&lt;/li&gt;
&lt;li&gt;GitHub Actions runs a workflow&lt;/li&gt;
&lt;li&gt;The workflow connects to the server via SSH&lt;/li&gt;
&lt;li&gt;Only changed files are synced to the server&lt;/li&gt;
&lt;li&gt;The application files update automatically&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  What We Are Building
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;CI/CD pipeline&lt;/strong&gt; using &lt;strong&gt;GitHub Actions&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Deployment to &lt;strong&gt;shared hosting (Namecheap)&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Laravel application (You can deploy any application)&lt;/li&gt;
&lt;li&gt;Secure deployment using &lt;strong&gt;SSH&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Zero downtime friendly using rsync for deployment&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  Why CI/CD on Shared Hosting Is Challenging
&lt;/h2&gt;

&lt;p&gt;Shared hosting environments are restrictive by design and functionality, unlike cloud and VPSs, where you have full control. Some of the difficulties we encountered include:&lt;/p&gt;
&lt;h3&gt;
  
  
  1. Limited Server Control
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;No root access and sudo&lt;/li&gt;
&lt;li&gt;No system-wide package installation&lt;/li&gt;
&lt;li&gt;Restricted SSH configuration&lt;/li&gt;
&lt;li&gt;Cannot run npm for JavaScript packages&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  2. SSH Authentication Issues
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;SSH keys generated on the server vs local machine&lt;/li&gt;
&lt;li&gt;Incorrect key formats are causing &lt;code&gt;libcrypto&lt;/code&gt; errors&lt;/li&gt;
&lt;li&gt;Permission errors (&lt;code&gt;Permission denied (publickey)&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  3. Risk of Accidental File Deletion
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Using &lt;code&gt;rsync --delete&lt;/code&gt; without exclusions&lt;/li&gt;
&lt;li&gt;Losing &lt;code&gt;.env&lt;/code&gt; and storage files&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  Step-by-Step: Setting Up CI/CD for Shared Hosting
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Step 1: Generate SSH Key on the Server
&lt;/h3&gt;

&lt;p&gt;SSH is not enabled on Namecheap cPanel by default, and you need to enable it to be able to follow this guide.&lt;/p&gt;

&lt;p&gt;From the cPanel, under &lt;strong&gt;Exclusive for Namecheap Customers&lt;/strong&gt;, click on &lt;strong&gt;Manage Shell&lt;/strong&gt; then you will enable the SSH as shown below:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1ly9umrr6wyl1j9qv5x7.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%2F1ly9umrr6wyl1j9qv5x7.png" alt="How to enable ssh on Namecheap shared hosting" width="800" height="348"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can either access the server terminal from your local machine using SSH or directly from cPanel &lt;strong&gt;Terminal&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Log into your shared hosting CLI and run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh-keygen &lt;span class="nt"&gt;-t&lt;/span&gt; ed25519 &lt;span class="nt"&gt;-f&lt;/span&gt; github_actions_key &lt;span class="nt"&gt;-N&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Do &lt;strong&gt;not&lt;/strong&gt; set a passphrase. GitHub actions will not work with passphrase/password.&lt;/li&gt;
&lt;li&gt;The above bash command will create two files:

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;github_actions_key&lt;/code&gt; (private key)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;github_actions_key.pub&lt;/code&gt; (public key)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;The files will be stored in the &lt;strong&gt;.ssh&lt;/strong&gt; folder on cPanel:&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; You can generate the SSH keys from cPanel UI, but it requires you add a password, which will not work with GitHub actions.&lt;/p&gt;

&lt;p&gt;To confirm that the key works, download the key to a folder on your local machine and try to SSH to your server from the same folder where the key is stored. If it does not require a password, then the GitHub action will have the permission to access your server.&lt;/p&gt;




&lt;h3&gt;
  
  
  Step 2: Add Public Key to Authorized Keys
&lt;/h3&gt;

&lt;p&gt;Append the public key:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; ~/.ssh/github_actions_key.pub &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; ~/.ssh/authorized_keys
&lt;span class="nb"&gt;chmod &lt;/span&gt;600 ~/.ssh/authorized_keys
&lt;span class="nb"&gt;chmod &lt;/span&gt;700 ~/.ssh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will authorize the keys to be accessed from GitHub actions.&lt;/p&gt;




&lt;h3&gt;
  
  
  Step 3: Add Private Key and other variables to GitHub Secrets
&lt;/h3&gt;

&lt;p&gt;In your GitHub repository:&lt;br&gt;
&lt;strong&gt;Settings → Secrets and variables → Actions → New Repository Secret&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqfb8ednjlvp01qzw79ql.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%2Fqfb8ednjlvp01qzw79ql.png" alt="Adding variables and secrets on github repository secrets" width="800" height="393"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;APP_PATH&lt;/td&gt;
&lt;td&gt;project_path&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SSH_HOST&lt;/td&gt;
&lt;td&gt;yourdomain.com or server IP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SSH_KEY&lt;/td&gt;
&lt;td&gt;&lt;em&gt;(contents of github_actions_key)&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SSH_PORT&lt;/td&gt;
&lt;td&gt;custom_ssh_port(eg 21098)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SSH_USER&lt;/td&gt;
&lt;td&gt;hosting_username&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Use &lt;strong&gt;Repository Secrets&lt;/strong&gt;, not Environment secrets. Paste the &lt;strong&gt;private key&lt;/strong&gt;, not the &lt;em&gt;.pub&lt;/em&gt; file.&lt;/p&gt;


&lt;h2&gt;
  
  
  Step 4: Create GitHub Actions Workflow for Shared Hosting Deployment
&lt;/h2&gt;

&lt;p&gt;Normally, GitHub detects and presents suggested workflows automatically according to your codebase. In this sample, we will go with the &lt;em&gt;"set up a workflow yourself"&lt;/em&gt; link.&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%2Frb97cv6g2b26gpuxjuqq.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%2Frb97cv6g2b26gpuxjuqq.png" alt="Setting up github actions" width="800" height="398"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is shown only when you have not created any workflow on the repository. If you have a workflow already, it will show the workflow runs and the button to create another workflow.&lt;/p&gt;

&lt;p&gt;Clicking the link will create a file named ".github/workflows/main.yml" which will contain the YAML script of GitHub actions.&lt;/p&gt;
&lt;h3&gt;
  
  
  Sample Workflow steps explained
&lt;/h3&gt;

&lt;p&gt;Let us go through and explain the workflow steps accordingly.&lt;/p&gt;
&lt;h3&gt;
  
  
  Workflow Name &amp;amp; Trigger
&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;Laravel CI/CD (Namecheap SSH)&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="s"&gt;main&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This section defines the name of the workflow and when it should run.&lt;br&gt;
This block &lt;strong&gt;on.push.branches.main&lt;/strong&gt; tells GitHub to automatically trigger this workflow whenever new code is pushed to the main branch.&lt;/p&gt;

&lt;p&gt;In a company setting with many repository branches, the workflow will not be triggered if a push is made to any branch other than main. That way, it prevents unwanted changes from being deployed.&lt;/p&gt;
&lt;h3&gt;
  
  
  Job Definition &amp;amp; Runner
&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;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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This section defines a job named deploy and specifies the environment it runs in, and jobs is the top-level key where all workflow jobs are declared.&lt;/p&gt;
&lt;h3&gt;
  
  
  Checking Out the Repository
&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;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;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Checkout code&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@v4&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This step pulls the latest version of your repository into the GitHub Actions runner, and the &lt;strong&gt;steps&lt;/strong&gt; define a sequence of actions executed within the job.&lt;/p&gt;
&lt;h3&gt;
  
  
  Setting Up PHP Environment
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&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;Setup PHP&lt;/span&gt;
    &lt;span class="s"&gt;uses&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;shivammathur/setup-php@v2&lt;/span&gt;
    &lt;span class="s"&gt;with&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;php-version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;8.2"&lt;/span&gt;
      &lt;span class="na"&gt;extensions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mbstring, xml, curl, zip, bcmath&lt;/span&gt;
      &lt;span class="na"&gt;coverage&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;none&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This step prepares the PHP runtime required to run the Laravel application. At this point, if you are creating a workflow for an application developed in another language, then this will be different.&lt;/p&gt;
&lt;h3&gt;
  
  
  Deploying Files to the Server (Rsync over SSH)
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&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;Upload project via rsync (SSH)&lt;/span&gt;
    &lt;span class="s"&gt;uses&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;burnett01/rsync-deployments@7.1.0&lt;/span&gt;
    &lt;span class="s"&gt;with&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;switches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;-az --exclude=".env" --exclude="storage/**" --exclude="bootstrap/cache/**" --exclude=".git" --exclude=".htaccess"&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;./&lt;/span&gt;
      &lt;span class="na"&gt;remote_path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.APP_PATH }}&lt;/span&gt;
      &lt;span class="na"&gt;remote_host&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.SSH_HOST }}&lt;/span&gt;
      &lt;span class="na"&gt;remote_user&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.SSH_USER }}&lt;/span&gt;
      &lt;span class="na"&gt;remote_key&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.SSH_KEY }}&lt;/span&gt;
      &lt;span class="na"&gt;remote_port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.SSH_PORT }}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This step deploys the application to the server using rsync over SSH.&lt;br&gt;
&lt;strong&gt;rsync&lt;/strong&gt; transfers only changed files, while &lt;strong&gt;--exclude&lt;/strong&gt; prevents sensitive and environment files from being deleted, files like .env, .htaccess, etc.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;path&lt;/strong&gt; specifies the local project directory to sync while &lt;strong&gt;remote_*...&lt;/strong&gt; values are pulled from GitHub Secrets.&lt;/p&gt;
&lt;h3&gt;
  
  
  Running Laravel Commands on the Server
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&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;Run Laravel commands on server&lt;/span&gt;
    &lt;span class="s"&gt;uses&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;appleboy/ssh-action@v1.0.3&lt;/span&gt;
    &lt;span class="s"&gt;with&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;host&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.SSH_HOST }}&lt;/span&gt;
      &lt;span class="na"&gt;username&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.SSH_USER }}&lt;/span&gt;
      &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.SSH_KEY }}&lt;/span&gt;
      &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.SSH_PORT }}&lt;/span&gt;
      &lt;span class="na"&gt;script&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
        &lt;span class="s"&gt;cd ${{ secrets.APP_PATH }}&lt;/span&gt;
        &lt;span class="s"&gt;php artisan migrate --force&lt;/span&gt;
        &lt;span class="s"&gt;php artisan optimize:clear&lt;/span&gt;
        &lt;span class="s"&gt;php artisan config:cache&lt;/span&gt;
        &lt;span class="s"&gt;php artisan route:cache&lt;/span&gt;
        &lt;span class="s"&gt;php artisan view:cache&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This step connects to the production server via SSH and executes essential Laravel maintenance commands. It finalizes the deployment by ensuring the application is up to date, optimized, and production ready after each release.&lt;/p&gt;
&lt;h3&gt;
  
  
  The full CI/CD workflow for shared hosting (&lt;code&gt;.github/workflows/main.yml&lt;/code&gt;)
&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;Laravel CI/CD (Namecheap SSH)&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="s"&gt;main&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;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Checkout code&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@v4&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;Setup PHP&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;shivammathur/setup-php@v2&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;php-version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;8.2"&lt;/span&gt;
          &lt;span class="na"&gt;extensions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mbstring, xml, curl, zip, bcmath&lt;/span&gt;
          &lt;span class="na"&gt;coverage&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;none&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;Upload project via rsync (SSH)&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;burnett01/rsync-deployments@7.1.0&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;switches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;-az --exclude=".env" --exclude="storage/**" --exclude="bootstrap/cache/**" --exclude=".git" --exclude=".htaccess"&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;./&lt;/span&gt;
          &lt;span class="na"&gt;remote_path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.APP_PATH }}&lt;/span&gt;
          &lt;span class="na"&gt;remote_host&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.SSH_HOST }}&lt;/span&gt;
          &lt;span class="na"&gt;remote_user&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.SSH_USER }}&lt;/span&gt;
          &lt;span class="na"&gt;remote_key&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.SSH_KEY }}&lt;/span&gt;
          &lt;span class="na"&gt;remote_port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.SSH_PORT }}&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;Run Laravel commands on server&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;appleboy/ssh-action@v1.0.3&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;host&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.SSH_HOST }}&lt;/span&gt;
          &lt;span class="na"&gt;username&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.SSH_USER }}&lt;/span&gt;
          &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.SSH_KEY }}&lt;/span&gt;
          &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.SSH_PORT }}&lt;/span&gt;
          &lt;span class="na"&gt;script&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
            &lt;span class="s"&gt;cd ${{ secrets.APP_PATH }}&lt;/span&gt;
            &lt;span class="s"&gt;php artisan migrate --force&lt;/span&gt;
            &lt;span class="s"&gt;php artisan optimize:clear&lt;/span&gt;
            &lt;span class="s"&gt;php artisan config:cache&lt;/span&gt;
            &lt;span class="s"&gt;php artisan route:cache&lt;/span&gt;
            &lt;span class="s"&gt;php artisan view:cache&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Why rsync Is Ideal for Shared Hosting CI/CD
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Transfers &lt;strong&gt;only changed files&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Faster deployments&lt;/li&gt;
&lt;li&gt;Lower server load&lt;/li&gt;
&lt;li&gt;Avoids full folder replacement&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Does rsync delete everything on the server?
&lt;/h3&gt;

&lt;p&gt;No, unless you use &lt;code&gt;--delete&lt;/code&gt;.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;rsync &lt;span class="nt"&gt;-az&lt;/span&gt; &lt;span class="nt"&gt;--delete&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Files &lt;strong&gt;not present in the repo&lt;/strong&gt; will be removed on the server.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Recommended:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Avoid &lt;code&gt;--delete&lt;/code&gt; on shared hosting&lt;/li&gt;
&lt;li&gt;And use exclusions (&lt;code&gt;--exclude&lt;/code&gt;) very carefully&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Best Practices for CI/CD on Shared Hosting
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Security
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Never commit &lt;code&gt;.env&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Use SSH keys, not passwords&lt;/li&gt;
&lt;li&gt;Test SSH manually first&lt;/li&gt;
&lt;li&gt;Restrict SSH ports&lt;/li&gt;
&lt;li&gt;Exclude sensitive files&lt;/li&gt;
&lt;li&gt;Do not hard code variables and secrets, use &lt;strong&gt;Repository Secrets&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Deployment
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Deploy only changed files using &lt;strong&gt;rsync&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Backup before major changes&lt;/li&gt;
&lt;li&gt;Exclude runtime directories and files&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Stability
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Build locally or in CI when possible&lt;/li&gt;
&lt;li&gt;Monitor file permissions after deploy&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Bonus
&lt;/h2&gt;

&lt;h2&gt;
  
  
  You may need .htaccess file for Laravel application
&lt;/h2&gt;

&lt;p&gt;When you host a Laravel application on shared hosting, by default, the file lists will show when someone visits your domain name. To prevent this and direct users to your application home page, use the &lt;strong&gt;.htaccess&lt;/strong&gt; file to set the rules.&lt;/p&gt;

&lt;h3&gt;
  
  
  Correct Laravel Rewrite Rule
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight apache"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nl"&gt;IfModule&lt;/span&gt;&lt;span class="sr"&gt; mod_rewrite.c&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="nc"&gt;RewriteEngine&lt;/span&gt; &lt;span class="ss"&gt;On&lt;/span&gt;
    &lt;span class="nc"&gt;RewriteRule&lt;/span&gt; ^(.*)$ public/$1 [L]
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nl"&gt;IfModule&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use the rule above inside the .htaccess file. It will direct traffic to the public folder of the Laravel application instead of listing the directory contents. The .htaccess file should be in the parent folder of the application.&lt;/p&gt;

&lt;h2&gt;
  
  
  Problem with npm
&lt;/h2&gt;

&lt;p&gt;If you are deploying an application that needs you to run &lt;code&gt;npm&lt;/code&gt; command to bundle your app, it is advisable you run &lt;code&gt;npm run build&lt;/code&gt; on your local machine and remove the build folder from &lt;code&gt;.gitignore&lt;/code&gt; file so it can be pushed to GitHub and then be deployed to your server.&lt;/p&gt;




&lt;h2&gt;
  
  
  Key Takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;CI/CD is &lt;strong&gt;not limited to cloud platforms&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Shared hosting can support CI/CD with proper setup&lt;/li&gt;
&lt;li&gt;GitHub Actions + SSH + rsync is a powerful combo&lt;/li&gt;
&lt;li&gt;Understanding hosting limitations is critical
Shared hosting can absolutely support professional CI/CD workflows if you design them properly.&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;CI/CD pipelines are about &lt;strong&gt;automation&lt;/strong&gt;, not infrastructure based. With the right approach, even shared hosting environments can benefit from modern DevOps workflows.&lt;/p&gt;

&lt;p&gt;If you're running Laravel on shared hosting, CI/CD is absolutely achievable, and it saves time from having to update your server's files after each change constantly.&lt;/p&gt;

&lt;p&gt;After you have followed the above guide, whenever you push your code to the main branch, GitHub Action will automatically deploy your code to your shared host server.&lt;/p&gt;




</description>
      <category>cloud</category>
      <category>githubactions</category>
      <category>laravel</category>
      <category>cicd</category>
    </item>
  </channel>
</rss>
