bugl
bugl
HomeLearnPatternsPathsSearch
HomeLearnPatternsPathsSearch

Loading lesson path

Learn/Node.js/Node.js Deployment
Node.js•Node.js Deployment

Node.js Deployment

Flash cards

Review the key moves

1/4
Core idea

What is the main idea behind Node.js Deployment?

Lesson checks

Practice each idea before moving on

Short Mimo-style checks built from this lesson's code, terms, and sequence.

1Quick choice

Which statement best captures the main point of this lesson?

2Fill blank

Complete the missing token from the example code.

___ node:20-alpine
3Order

Put the learning moves in the order that makes the concept easiest to apply.

Benefits of Docker for Node.js
Containerization with Docker
Introduction to Deployment

Introduction to Deployment

Deployment strategies focus on how to deploy and manage your Node.js applications in production.

Key aspects of modern Node.js deployment include:

  • Containerization: Package your app and dependencies into a container that runs consistently across environments.
  • Orchestration: Automate container management with tools like Kubernetes or Docker Swarm.
  • CI/CD: Automate testing and deployment pipelines.
  • Cloud-native: Use cloud services and serverless functions.
  • IaC: Define infrastructure as code for reproducible deployments.
  • Observability: Monitor your application's performance and health.

Containerization with Docker

Containers package your application and its dependencies into a standardized unit, ensuring consistent behavior across different environments.

Docker is the most popular containerization platform for Node.js applications.

Benefits of Docker for Node.js

  • Environment consistency across development, testing, and production
  • Isolation from the host system and other applications
  • Efficient resource utilization compared to virtual machines
  • Simplified scaling and orchestration
  • Easy integration with CI/CD pipelines

Example: Basic Dockerfile for Node.js

FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 8080
CMD ["node", "app.js"]

This basic Dockerfile

  • Specifies a base image (Alpine Linux with Node.js 20)
  • Sets the working directory
  • Copies and installs dependencies
  • Copies application code
  • Exposes a port
  • Defines the startup command

Building and Running Your Docker Container

# Build the image
docker build -t my-nodejs-app .
# Run the container
docker run -p 8080:8080 my-nodejs-app

Multi-Stage Builds for Optimized Images

Multi-stage builds create smaller, more secure images by separating the build environment from the runtime environment:

Example: Multi-Stage Dockerfile

# Build stage
FROM node:20-alpine AS build
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
# Production stage
FROM node:20-alpine
WORKDIR /app
COPY --from=build /app/node_modules ./node_modules
COPY . .
# Set NODE_ENV
ENV NODE_ENV=production
# Non-root user for security
USER node
EXPOSE 8080
CMD ["node", "app.js"]

Why Multi-Stage Builds?

  • Smaller images (no build tools or dev dependencies)
  • Better security (fewer potential vulnerabilities)
  • Faster container startup and deployment

Docker Compose for Multi-Container Applications

For applications with multiple services (e.g., Node.js app + database), use Docker Compose to define and run multi-container applications:

Example: docker-compose.yml

version: '3.8'
services:
# Node.js application
app:
build: .
ports:
- "8080:8080"
environment:
- NODE_ENV=production
- DB_HOST=db
- DB_USER=user
- DB_PASSWORD=password
- DB_NAME=myapp
depends_on:
- db
restart: unless-stopped
# Database
db:
image: postgres:14
volumes:
- postgres_data:/var/lib/postgresql/data
environment:
- POSTGRES_USER=user
- POSTGRES_PASSWORD=password
- POSTGRES_DB=myapp
restart: unless-stopped
volumes:
postgres_data:
# Start all services
docker-compose up
# Start in detached mode
docker-compose up -d
# Stop all services
docker-compose down

Kubernetes for Orchestration

For production-grade orchestration of containerized applications, Kubernetes provides powerful features:

  • Automatic scaling of containers based on load
  • Self-healing (restarting failed containers)
  • Service discovery and load balancing
  • Rolling updates and rollbacks
  • Storage orchestration

Example: deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
name: nodejs-app
spec:
replicas: 3
selector:
matchLabels:
app: nodejs-app
template:
metadata:
labels:
app: nodejs-app
spec:
containers:
- name: nodejs-app
image: your-registry/nodejs-app:latest
ports:
- containerPort: 8080
env:
- name: NODE_ENV
value: "production"
resources:
limits:
cpu: "500m"
memory: "512Mi"
requests:
cpu: "200m"
memory: "256Mi"
livenessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 30
periodSeconds: 10

Example: service.yaml

apiVersion: v1
kind: Service
metadata:
name: nodejs-service
spec:
selector:
app: nodejs-app
ports:
- port: 80
targetPort: 8080
type: LoadBalancer

To learn more about Kubernetes, check out the Kubernetes documentation .

Cloud Platform Deployment

Cloud platforms provide ready-to-use infrastructure and services for deploying Node.js applications with minimal configuration. These platforms abstract away much of the complexity of infrastructure management.

Popular Cloud Platforms for Node.js

PlatformFeaturesBest For
HerokuSimple deployment via Git, auto-scaling, add-ons marketplaceQuick prototyping, startups, simple deployments
AWS Elastic BeanstalkAuto-scaling, load balancing, health monitoringAWS ecosystem integration, enterprise applications
Google App EngineAuto-scaling, traffic splitting, versioningGoogle Cloud ecosystem, high-traffic applications
Azure App ServiceBuilt-in CI/CD, staging environments, easy scalingMicrosoft ecosystem, enterprise applications
VercelPreview deployments, global CDN, optimized for Next.jsFrontend-focused apps, JAMstack applications
DigitalOcean App PlatformSimple pricing, built-in monitoring, auto-scalingSmall to medium apps, cost-sensitive deployments

Example: Deploying to Heroku

Heroku offers one of the simplest deployment workflows for Node.js applications:

Prerequisites

# Install Heroku CLI
npm install -g heroku
# Login to Heroku
heroku login

Create a Procfile in your project root to tell Heroku how to run your app:

Procfile

web: node app.js

Deploy your application

# Initialize Git if needed
git init
git add .
git commit -m "Initial commit"
# Create a Heroku app
heroku create my-nodejs-app
# Deploy to Heroku
git push heroku main
# Scale your app (optional)
heroku ps:scale web=1
# Open your app in browser
heroku open

Environment-Specific Configuration

For any cloud deployment, ensure your app is configured for production:

Example: app.js with environment configuration

const express = require('express');
const app = express();
// Environment variables with fallbacks
const PORT = process.env.PORT || 8080;
const NODE_ENV = process.env.NODE_ENV || 'development';
const DB_URI = process.env.DB_URI || 'mongodb://localhost:27017/myapp';
app.get('/', (req, res) => {
 res.send(`Hello from ${NODE_ENV} environment!`);
});
app.listen(PORT, () => {
 console.log(`Server running on port ${PORT} in ${NODE_ENV} mode`);
});

Serverless Deployment

Serverless computing allows you to build and run applications without thinking about servers.

It provides automatic scaling, built-in high availability, and a pay-for-use billing model.

Benefits of Serverless for Node.js

  • No server management required
  • Automatic scaling based on demand
  • Only pay for what you use (no idle costs)
  • Built-in high availability and fault tolerance
  • Focus on code, not infrastructure

Popular Serverless Platforms

  • AWS Lambda
  • Azure Functions
  • Google Cloud Functions
  • Vercel Functions
  • Netlify Functions

Simple AWS Lambda Function (handler.js)

module.exports.hello = async (event) => {
 const name = event.queryStringParameters?.name || 'World';
 return {
 statusCode: 200,
 headers: {
 'Content-Type': 'application/json'
 },
 body: JSON.stringify(
 {
 message: `Hello, ${name}!`,
 timestamp: new Date().toISOString(),
 },
 ),
};
};

Example: Serverless Framework Configuration

Using the Serverless Framework makes it easier to deploy and manage serverless applications:

Previous

Node.js Security

Next chapter

Perfomance & Scaling

Start with Node.js Logging