Introduction:
Here, we will guide you through the process of setting up aDockerfile
for a
Nest.js
application that integrates PostgreSQL as its database and Nginx as a reverse proxy. Furthermore, we will demonstrate how to configure Nginx to use a personalized domain name, as
docker.bithost.in
Let's kick things off by establishing our project structure. We'll assume that you have a Nest.js application already set up along with a docker-compose.yml
file to run our services.
Step 1: Set Up Project Structure:
Create a new directory for your Docker configuration files. Inside this directory, create a Dockerfile
and a nginx.conf file
.
project-root/
│
├── nestjs-app/
│ ├── src/
│ │ ├── main.ts
│ │ ├── app.module.ts
│ │ └── ... (other Nest.js application files)
│ └── ... (other Nest.js application directories)
├── docker-compose.yml
├── Dockerfile
├── nginx.conf
Step 2: Dockerfile Configuration
Open the Dockerfile
and add the below contents:
# Use Node.js base image
FROM node:18 AS builder
# Set working directory
WORKDIR /app
# Install dependencies
COPY package*.json ./
RUN npm install
# Copy source code
COPY . .
# Build the application
RUN npm run build
# Production image
FROM node:18-alpine
# Set working directory
WORKDIR /app
# Install production dependencies
COPY --from=builder /app/package*.json ./
RUN npm install --only=production
# Copy build files
COPY --from=builder /app/dist ./dist
# Expose port
EXPOSE 3000
# Start the application
CMD ["node", "dist/main"]
This Dockerfile
employs a multi-stage approach. It begins by installing dependencies and building the application in one stage, then copies over only the essential files to a smaller production image.
Step 3: Nginx Configuration
Next, let's configure Nginx to act as a reverse proxy. Open the nginx.conf
file and add the following configuration:
server {
listen 80;
server_name docker.bithost.in;
location / {
proxy_pass http://localhost:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
This Nginx configuration listens on port 80 for requests to docker.bithost.in and proxies them to our Nest.js application running on port 3000.
To configure SSL for your domain with nginx you can follow my SSL configuration blog here, or refer to my youtube video.
Step 4: Docker Compose Configuration
Finally, update your docker-compose.yml
file to include both the Nest.js application and the Nginx service:
//docker-compose.yml
version: '3'
services:
app:
build:
context: .
dockerfile: Dockerfile
ports:
- '3000:3000'
environment:
NODE_ENV: production
depends_on:
- postgres
nginx:
image: nginx:latest
volumes:
- ./nginx.conf:/etc/nginx/conf.d/default.conf
ports:
- '80:80'
depends_on:
- app
postgres:
image: postgres:latest
environment:
POSTGRES_DB: mydatabase
POSTGRES_USER: myuser
POSTGRES_PASSWORD: mypassword
Step 5: Build and Run the Docker Containers
Next, go to your project directory and execute the following command to build and launch the Docker containers:
docker-compose up --build
This script will compile your Nest.js application, generate Docker images for both the application and Nginx, and then launch the containers.
Hope you find this helpful!!!!
For consultations, please email [email protected].
Docker for a Nest.js App with PostgreSQL and Nginx Reverse Proxy