Dockerizar una aplicación Next.JS con Nginx y PostgreSQL

author
By admin
21 de septiembre de 2025
image

Creamos un contenedor por cada una de estas tecnologías, y lo lanzamos con el servidor de desarrollo de Node, cuando se ejecute el comando CMD, del Dockerfile.


En docker-compose.yml configuramos una red, así tenemos la IP que no cambia en reinicios, etc, del contenedor, al configurar una red, como se ve más abajo en el fichero docker-compose.yml.

Creamos un certificado auto firmado para tener conexión segura(SSL), entre cliente(navegador) y servidor Nginx, Nginx hace de proxy entre cliente y aplicación, de este modo en desarrollo utilizamos cookies seguras, etc, nos acercamos en el modelo de desarrollo al de producción.

Definimos las variables con las credenciales que usara Next.JS en el archivo .env, y con esto la cadena de conexión a PostgreSQL, con esta configuración tenemos un entorno de desarrollo web.

Permitir usuarios no root ejecutar el contenedor con Docker Engine, añadir el usuario al grupo docker

$ sudo usermod -aG docker usuario

Creamos

$ npx create-next-app@latest app && cd app && mkdir -p data/nginx/conf.d && mkdir -p data/nginx/ssl

Creamos certificado auto firmado

$ cd app/data/nginx/ssl && openssl req -newkey rsa:4096 -x509 -nodes -days 3560 -out nextjs.crt -keyout nextjs.key

$ cd app/data/nginx/

Fichero: nginx.com

user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                     '$status $body_bytes_sent "$http_referer" '
                     '"$http_user_agent" "$http_x_forwarded_for"';

              
    access_log  /var/log/nginx/access.log  main;
              
    sendfile        on;
    #tcp_nopush     on;
    keepalive_timeout  65;
    #gzip  on;

    include /config/nginx/conf.d/*.conf;
}

$ cd app/

 

Fichero: Dockerfile

# Use the official Node.js runtime as the base image
FROM node:22.18.0-alpine

# Set the working directory inside the container
WORKDIR /app

# Copy package.json and package-lock.json (if available)
COPY package*.json ./

# Install dependencies
RUN npm ci

# Copy the rest of the application code
COPY . .

# Expose the port that Next.js runs on
EXPOSE 3000

# Start the development server
CMD ["npm", "run", "dev"]

 

Fichero: .env

POSTGRES_DB=nextjs
POSTGRES_USER=admin
POSTGRES_PASSWORD=1234
#DATABASE_URL=postgres://user:password@database:5432/mydatabase
NODE_ENV=development
JWT_SECRET=your-jwt-secret-key-for-development
ENCRYPTION_SECRET=supersecretkeyforencryption

Creamos el virtual host

$ cd app/data/nginx/conf.d

 

Fichero: default.conf

server {
    listen       80;
    listen  [::]:80;
    listen  443 ssl;

    server_name  localhost;
    server_tokens off;
    
     ssl_certificate /config/nginx/ssl/nextjs.crt;
     ssl_certificate_key /config/nginx/ssl/nextjs.key;
     ssl_protocols TLSv1.3;
     #ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
     ssl_session_cache    shared:SSL:1m;
     ssl_session_timeout  5m;
     ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA HIGH !RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS";
     #ssl_ciphers  HIGH:!aNULL:!MD5;
     ssl_prefer_server_ciphers  on;
     #access_log  /var/log/nginx/host.access.log  main;

    location / {
        proxy_pass http://10.8.0.1: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;
    }
    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

}

$ cd app && docker compose up -d

 

La base de datos

$ docker exec -it postgres bash

$ su - postgres -c 'psql'

postgres=# create user admin login encrypted password '1234';

postgres=# create database nextjs with owner admin;

 

 
Share this post :

Subscribe to receive future updates

Lorem ipsum dolor sited Sed ullam corper consectur adipiscing Mae ornare massa quis lectus.

No spam guaranteed, So please don’t send any spam mail.