Clone
3
Configuracion
groales edited this page 2025-12-02 19:16:33 +01:00

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.conf
  • root.conf - Final de nginx.conf
  • http_top.conf - Top del bloque http
  • http.conf - Final del bloque http
  • events.conf - Final del bloque events
  • stream.conf - Final del bloque stream
  • server_proxy.conf - Final de cada servidor proxy
  • server_redirect.conf - Final de cada servidor de redirección
  • server_stream.conf - Final de cada stream
  • server_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-bit
  • arm64 - 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