<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Node.js Demo App]]></title><description><![CDATA[Node.js Demo App]]></description><link>https://nodejs-demo-app.hashnode.dev</link><generator>RSS for Node</generator><lastBuildDate>Sat, 10 Oct 2026 19:43:36 GMT</lastBuildDate><atom:link href="https://nodejs-demo-app.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[🚀 Node.js Demo App – My Journey to Automated Deployment with GitHub Actions & Docker]]></title><description><![CDATA[This month, I challenged myself to take a simple Node.js application and deploy it the way a real DevOps pipeline would — fully automated from code commit to deployment.No manual builds, no “docker run” copy-paste, and no pushing images by hand.
That...]]></description><link>https://nodejs-demo-app.hashnode.dev/nodejs-demo-app-my-journey-to-automated-deployment-with-github-actions-and-docker</link><guid isPermaLink="true">https://nodejs-demo-app.hashnode.dev/nodejs-demo-app-my-journey-to-automated-deployment-with-github-actions-and-docker</guid><category><![CDATA[Docker]]></category><category><![CDATA[dockerhub]]></category><category><![CDATA[github-actions]]></category><category><![CDATA[CI/CD]]></category><category><![CDATA[Pipeline]]></category><dc:creator><![CDATA[HARSHAL VERNEKAR]]></dc:creator><pubDate>Wed, 13 Aug 2025 16:51:08 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1755103708014/7eb9ab67-2d43-4f22-8c38-b0b428cf9e72.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>This month, I challenged myself to take a <strong>simple Node.js application</strong> and deploy it the way a real DevOps pipeline would — fully automated from code commit to deployment.<br />No manual builds, no “docker run” copy-paste, and no pushing images by hand.</p>
<p>That’s how <strong>Node.js Demo App</strong> was born — a small project that taught me how powerful GitHub Actions can be when paired with Docker.</p>
<hr />
<h2 id="heading-project-overview">📂 Project Overview</h2>
<p>The application itself is straightforward — a <strong>Node.js web app</strong> that serves content on port 3000. But the real focus here wasn’t the app’s complexity, it was <strong>the automation pipeline</strong> behind it.</p>
<p><strong>Repository:</strong> <a target="_blank" href="https://github.com/Harshalv21/nodejs-demo-app">nodejs-demo-app</a></p>
<p>Structure:</p>
<pre><code class="lang-plaintext">.
├── app.js              # Main app logic
├── Dockerfile          # Container build instructions
├── package.json        # Node.js dependencies
└── .github/
    └── workflows/
        └── main.yml    # GitHub Actions workflow
</code></pre>
<hr />
<h2 id="heading-tools-amp-technologies">🛠️ Tools &amp; Technologies</h2>
<ul>
<li><p><strong>Node.js</strong> – For the web app itself</p>
</li>
<li><p><strong>Docker</strong> – To package and ship the app in containers</p>
</li>
<li><p><strong>DockerHub</strong> – To store and share the container image</p>
</li>
<li><p><strong>GitHub Actions</strong> – To automate the build, test, and push process</p>
</li>
</ul>
<hr />
<h2 id="heading-the-cicd-workflow">⚙️ The CI/CD Workflow</h2>
<p>The pipeline lives in <code>📄 .github/workflows/main.yml</code> and runs <strong>every time I push to</strong> <code>main</code>.</p>
<p>Here’s what happens behind the scenes:</p>
<ol>
<li><p><strong>Checkout Code</strong> – GitHub Actions pulls the latest code from the repository.</p>
</li>
<li><p><strong>Setup Node.js</strong> – The runner gets a Node.js environment ready.</p>
</li>
<li><p><strong>Install Dependencies</strong> – Runs <code>npm install</code> to set up required packages.</p>
</li>
<li><p><strong>Run Tests</strong> – Validates the app to make sure nothing’s broken before deployment.</p>
</li>
<li><p><strong>Authenticate with DockerHub</strong> – Uses my <strong>GitHub Secrets</strong> to log in securely.</p>
</li>
<li><p><strong>Build Docker Image</strong> – Creates a production-ready container image.</p>
</li>
<li><p><strong>Push to DockerHub</strong> – Publishes the image so it’s instantly available anywhere.</p>
</li>
</ol>
<hr />
<h2 id="heading-secure-credentials">🔐 Secure Credentials</h2>
<p>To make this work without exposing my password, I stored these secrets in GitHub:</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Secret Name</td><td>Purpose</td></tr>
</thead>
<tbody>
<tr>
<td><code>DOCKER_USERNAME</code></td><td>DockerHub username</td></tr>
<tr>
<td><code>DOCKER_PASSWORD</code></td><td>DockerHub password or access token</td></tr>
</tbody>
</table>
</div><hr />
<h2 id="heading-running-the-app-locally">🐳 Running the App Locally</h2>
<p>If you want to run it locally without CI/CD, it’s just:</p>
<pre><code class="lang-plaintext">npm install
npm start
</code></pre>
<p>The app runs on <a target="_blank" href="http://localhost:3000"><strong>http://localhost:3000</strong></a>.</p>
<p>Or, if you want to use my Docker image:</p>
<pre><code class="lang-plaintext">docker pull &lt;dockerhub-username&gt;/&lt;image-name&gt;
docker run -p 3000:3000 &lt;dockerhub-username&gt;/&lt;image-name&gt;
</code></pre>
<hr />
<h2 id="heading-the-result">📦 The Result</h2>
<p>The beauty of this setup is that I no longer have to worry about <strong>manual builds or deployments</strong>. Every time I push code to <code>main</code>, a new Docker image is automatically built, tested, and pushed to DockerHub.</p>
<p>This is the kind of automation that DevOps is all about — repeatable, reliable, and fast.</p>
<hr />
<h2 id="heading-about-me">🙋‍♂️ About Me</h2>
<p>I’m <strong>Harshal Vernekar</strong>, an aspiring DevOps &amp; Cloud Engineer passionate about automation, CI/CD, and cloud-native technologies.</p>
]]></content:encoded></item></channel></rss>