Deployment & Environment Config
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.