Dockerizar una aplicación Next.JS con Nginx y PostgreSQL
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;
Related Posts

Cifrar JSON Web Token con Flask
2025-03-17 00:00:00

Entorno de desarrollo local con Next.js, Drizzle, Nginx y PostgreSQL
2025-09-21 00:00:00

Web blog Next.js 15
2025-11-23 00:00:00
Popular Category
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.