Deployment & Environment Config

🌿 Node.js Lesson 15 Advanced

The final step of any Node.js project is deploying it to production. This lesson covers environment variables, process managers, Docker containerization, and cloud deployment strategies.

1 Environment Variables & dotenv
File — .env
NODE_ENV=production
PORT=3000
MONGODB_URI=mongodb+srv://user:pass@cluster.mongodb.net/mydb
JWT_SECRET=super_secret_key_at_least_32_chars_long
CORS_ORIGIN=https://myapp.com
JavaScript — config.js
require('dotenv').config();

const config = {
  env:         process.env.NODE_ENV || 'development',
  port:        Number(process.env.PORT) || 3000,
  mongoUri:    process.env.MONGODB_URI,
  jwtSecret:   process.env.JWT_SECRET,
  corsOrigin:  process.env.CORS_ORIGIN || '*'
};

// Validate required variables at startup
const required = ['MONGODB_URI', 'JWT_SECRET'];
required.forEach(key => {
  if (!process.env[key]) {
    throw new Error('Missing required environment variable: ' + key);
  }
});

module.exports = config;
2 Docker & PM2
Dockerfile — Production Node App
FROM node:20-alpine

WORKDIR /app

# Copy dependency files first (better layer caching)
COPY package*.json ./
RUN npm ci --only=production

# Copy source code
COPY src/ ./src/

# Run as non-root user for security
USER node

EXPOSE 3000
CMD ["node", "src/index.js"]
Terminal — PM2 Process Manager
# Install PM2 globally
npm install -g pm2

# Start your app with PM2 (auto-restarts on crash)
pm2 start src/index.js --name "my-api" -i max

# View running processes
pm2 list

# View real-time logs
pm2 logs my-api

# Auto-restart on server reboot
pm2 startup
pm2 save
3 Code Challenge
Challenge: Write a Dockerfile for your Node.js API and a docker-compose.yml that starts both your app and a MongoDB container together with a shared network.