Table of Contents
- Configuración Avanzada
- Base de Datos Externa
- Docker Secrets
- Redes Docker
- Configuraciones NGINX Personalizadas
- Variables de Entorno Avanzadas
- Ejecutar como Usuario No-Root
- Deshabilitar IPv6
- Deshabilitar IP Ranges Fetch
- Header X-FRAME-OPTIONS
- Usuario Admin Automático
- Healthcheck
- Logrotate Personalizado
- Migración desde Otra Instancia
- Arquitecturas Soportadas
Configuración Avanzada
Base de Datos Externa
MySQL / MariaDB
Para mayor rendimiento y escalabilidad, usa MySQL/MariaDB en lugar de SQLite:
services:
app:
image: jc21/nginx-proxy-manager:latest
environment:
TZ: "Europe/Madrid"
DB_MYSQL_HOST: "db"
DB_MYSQL_PORT: 3306
DB_MYSQL_USER: "npm"
DB_MYSQL_PASSWORD: "npm_password"
DB_MYSQL_NAME: "npm"
depends_on:
- db
db:
image: jc21/mariadb-aria:latest
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: "root_password"
MYSQL_DATABASE: "npm"
MYSQL_USER: "npm"
MYSQL_PASSWORD: "npm_password"
MARIADB_AUTO_UPGRADE: "1"
volumes:
- mysql_data:/var/lib/mysql
volumes:
npm_data:
npm_letsencrypt:
mysql_data:
PostgreSQL
services:
app:
environment:
DB_POSTGRES_HOST: "db"
DB_POSTGRES_PORT: "5432"
DB_POSTGRES_USER: "npm"
DB_POSTGRES_PASSWORD: "npm_password"
DB_POSTGRES_NAME: "npm"
depends_on:
- db
db:
image: postgres:17
environment:
POSTGRES_USER: "npm"
POSTGRES_PASSWORD: "npm_password"
POSTGRES_DB: "npm"
volumes:
- postgres_data:/var/lib/postgresql
volumes:
npm_data:
npm_letsencrypt:
postgres_data:
Docker Secrets
Para mayor seguridad, usa secrets en lugar de variables de entorno en texto plano:
secrets:
mysql_pwd:
file: ./secrets/mysql_password.txt
services:
app:
environment:
DB_MYSQL_HOST: "db"
DB_MYSQL_PORT: 3306
DB_MYSQL_USER: "npm"
DB_MYSQL_PASSWORD__FILE: /run/secrets/mysql_pwd
DB_MYSQL_NAME: "npm"
secrets:
- mysql_pwd
Redes Docker
Conectar NPM con Otros Servicios
La red proxy se crea automáticamente al desplegar NPM.
NPM:
services:
app:
networks:
- proxy
- npm_internal
networks:
npm_internal:
name: npm_internal
proxy:
external: true
Otros servicios:
services:
mi_app:
networks:
- proxy
networks:
proxy:
external: true
Configurar Proxy Host:
- Forward Hostname:
mi_app(nombre del contenedor) - Forward Port: Puerto interno (no necesitas publicarlo con
-p)
Configuraciones NGINX Personalizadas
NPM permite insertar configuración NGINX personalizada en diferentes ubicaciones.
Ubicaciones de Archivos Custom
Crear directorio: ./data/nginx/custom/ (se monta desde volumen npm_data)
Archivos disponibles:
root_top.conf- Top de nginx.confroot.conf- Final de nginx.confhttp_top.conf- Top del bloque httphttp.conf- Final del bloque httpevents.conf- Final del bloque eventsstream.conf- Final del bloque streamserver_proxy.conf- Final de cada servidor proxyserver_redirect.conf- Final de cada servidor de redirecciónserver_stream.conf- Final de cada streamserver_dead.conf- Final de cada servidor 404
Ejemplo: Rate Limiting Global
# Acceder al contenedor
docker exec -it nginx-proxy-manager /bin/bash
# Crear archivo custom
cat > /data/nginx/custom/http_top.conf << 'EOF'
# Rate limiting
limit_req_zone $binary_remote_addr zone=general:10m rate=10r/s;
limit_req_status 429;
EOF
# Salir y recargar NGINX
exit
docker exec nginx-proxy-manager nginx -s reload
Aplicar en Proxy Host (pestaña Advanced):
limit_req zone=general burst=20 nodelay;
Ejemplo: Módulo GeoIP2
Habilitar módulo:
docker exec -it nginx-proxy-manager /bin/bash
cat > /data/nginx/custom/root_top.conf << 'EOF'
load_module /usr/lib/nginx/modules/ngx_http_geoip2_module.so;
load_module /usr/lib/nginx/modules/ngx_stream_geoip2_module.so;
EOF
exit
docker exec nginx-proxy-manager nginx -s reload
Variables de Entorno Avanzadas
Ejecutar como Usuario No-Root
environment:
PUID: 1000
PGID: 1000
⚠️ Puede causar problemas con puertos < 1024. Solución: usar --cap-add=NET_BIND_SERVICE.
Deshabilitar IPv6
environment:
DISABLE_IPV6: 'true'
Deshabilitar IP Ranges Fetch
Para entornos con acceso limitado a Internet:
environment:
IP_RANGES_FETCH_ENABLED: 'false'
Header X-FRAME-OPTIONS
environment:
X_FRAME_OPTIONS: "sameorigin" # o "deny", "allow-from https://example.com"
Usuario Admin Automático
Saltarse el setup inicial:
environment:
INITIAL_ADMIN_EMAIL: admin@tudominio.com
INITIAL_ADMIN_PASSWORD: tu_password_segura
⚠️ Cambiar la contraseña inmediatamente después del primer login.
Healthcheck
Añadir healthcheck al servicio:
services:
app:
healthcheck:
test: ["CMD", "/usr/bin/check-health"]
interval: 10s
timeout: 3s
retries: 3
Logrotate Personalizado
Por defecto NPM rota logs semanalmente (access: 4 archivos, error: 10 archivos).
Personalizar:
# logrotate.custom
/data/logs/*.log {
daily
rotate 7
missingok
notifempty
compress
delaycompress
sharedscripts
postrotate
docker exec nginx-proxy-manager nginx -s reopen
endscript
}
Montar en compose:
volumes:
- npm_data:/data
- npm_letsencrypt:/etc/letsencrypt
- ./logrotate.custom:/etc/logrotate.d/nginx-proxy-manager
Migración desde Otra Instancia
Exportar desde origen
# Backup volúmenes
docker run --rm \
-v npm_data:/data \
-v $(pwd):/backup \
alpine tar czf /backup/npm_data_backup.tar.gz -C /data .
docker run --rm \
-v npm_letsencrypt:/letsencrypt \
-v $(pwd):/backup \
alpine tar czf /backup/npm_letsencrypt_backup.tar.gz -C /letsencrypt .
Importar en destino
# Crear volúmenes
docker volume create npm_data
docker volume create npm_letsencrypt
# Restaurar
docker run --rm \
-v npm_data:/data \
-v $(pwd):/backup \
alpine tar xzf /backup/npm_data_backup.tar.gz -C /data
docker run --rm \
-v npm_letsencrypt:/letsencrypt \
-v $(pwd):/backup \
alpine tar xzf /backup/npm_letsencrypt_backup.tar.gz -C /letsencrypt
# Levantar NPM
docker compose up -d
Arquitecturas Soportadas
NPM soporta múltiples arquitecturas (manifest multi-arch):
amd64- Intel/AMD 64-bitarm64- ARM 64-bit (Raspberry Pi 4, Apple Silicon)armv7- ARM 32-bit (Raspberry Pi 3)
No necesitas hacer nada especial, Docker pull descarga la imagen correcta automáticamente.
Raspberry Pi Consideraciones
Para MariaDB en ARM, usar imagen alternativa:
db:
image: yobasystems/alpine-mariadb:latest # en lugar de jc21/mariadb-aria
Volver a: Página Principal | Certificados SSL