Compare commits

..

2 Commits

4 changed files with 377 additions and 1 deletions

19
.env.example Normal file
View File

@@ -0,0 +1,19 @@
# Ejemplo de variables de entorno para NGINX Proxy Manager
# Zona horaria
TZ=Europe/Madrid
# Puertos (descomentar si quieres cambiarlos)
# HTTP_PORT=80
# HTTPS_PORT=443
# ADMIN_PORT=81
# Base de datos externa (opcional - descomentar si usas MySQL/PostgreSQL)
# DB_MYSQL_HOST=mysql
# DB_MYSQL_PORT=3306
# DB_MYSQL_USER=npm
# DB_MYSQL_PASSWORD=npm_password
# DB_MYSQL_NAME=npm
# Deshabilitar IPv6 (descomentar si tienes problemas con IPv6)
# DISABLE_IPV6=true

22
.gitignore vendored Normal file
View File

@@ -0,0 +1,22 @@
# Datos locales
data/
letsencrypt/
# Variables de entorno
.env
*.env
!.env.example
# Logs
*.log
# OS
.DS_Store
Thumbs.db
# IDE
.vscode/
.idea/
*.swp
*.swo
*~

311
README.md
View File

@@ -1,2 +1,311 @@
# npm # Infraestructura: NGINX Proxy Manager
# NGINX Proxy Manager — Despliegue con Docker Compose
Este repositorio proporciona una forma sencilla de desplegar **NGINX Proxy Manager** usando Docker Compose, siguiendo las recomendaciones oficiales del proyecto.
## ¿Qué es NGINX Proxy Manager?
NGINX Proxy Manager es una herramienta de gestión de proxy inverso fácil de usar que te permite:
- 🌐 **Gestionar hosts proxy** sin conocimientos avanzados de NGINX
- 🔒 **Certificados SSL/TLS gratuitos** con Let's Encrypt automático
- 🔐 **Listas de acceso** y autenticación HTTP básica
- 📊 **Interfaz web moderna** basada en Tabler
- 🔄 **Redirecciones y streams** configurables fácilmente
- 👥 **Gestión de usuarios** y permisos
## Requisitos
- Docker y Docker Compose instalados en el host
- Puertos 80, 443 y 81 disponibles
- Dominio apuntando al servidor (para certificados Let's Encrypt)
- (Opcional) Acceso a los puertos 80/443 desde Internet para validación de certificados
## Qué incluye este stack
- **Servicio**: `nginx-proxy-manager` con la imagen `jc21/nginx-proxy-manager:latest`
- **Puertos**:
- `80`: HTTP (redirige automáticamente a HTTPS)
- `81`: Interfaz web de administración
- `443`: HTTPS
- **Volúmenes**:
- `npm_data`: Datos de configuración, base de datos y logs
- `npm_letsencrypt`: Certificados SSL de Let's Encrypt
- **Red**: `npm_network` dedicada para el stack
## Pasos de despliegue
### 1. Clonar el repositorio
```bash
git clone https://git.ictiberia.com/groales/npm
cd npm
```
### 2. Levantar el stack
```bash
docker compose up -d
```
### 3. Verificar el estado
```bash
docker ps --filter name=nginx-proxy-manager
```
### 4. Acceder a la interfaz de administración
Abre tu navegador en: **http://IP-del-servidor:81**
⏱️ **Primera vez**: El inicio puede tardar 1-2 minutos dependiendo del hardware.
### 5. Login inicial
**Credenciales por defecto**:
- **Email**: `admin@example.com`
- **Password**: `changeme`
🔐 **Importante**: Al primer login, se te pedirá cambiar estas credenciales inmediatamente.
## Uso básico
### Crear un Proxy Host
1. **Login** en la interfaz web (puerto 81)
2. Click en **"Hosts"** → **"Proxy Hosts"** → **"Add Proxy Host"**
3. Configurar:
- **Domain Names**: `ejemplo.tudominio.com`
- **Scheme**: `http` o `https`
- **Forward Hostname/IP**: IP del servicio backend (ej: `192.168.1.100`)
- **Forward Port**: Puerto del servicio (ej: `8080`)
4. Pestaña **"SSL"**:
- Marcar **"Request a new SSL Certificate"**
- Marcar **"Force SSL"**
- Marcar **"HTTP/2 Support"**
- Aceptar términos de Let's Encrypt
5. **Save**
✅ En pocos segundos tendrás un proxy HTTPS funcionando con certificado válido.
## Configuración avanzada
### Variables de entorno
Crea un archivo `.env` para personalizar:
```env
# Zona horaria
TZ=Europe/Madrid
# Puertos personalizados (si los defaults están ocupados)
HTTP_PORT=80
HTTPS_PORT=443
ADMIN_PORT=81
```
Luego modifica `docker-compose.yaml`:
```yaml
environment:
TZ: "${TZ:-Europe/Madrid}"
ports:
- "${HTTP_PORT:-80}:80"
- "${ADMIN_PORT:-81}:81"
- "${HTTPS_PORT:-443}:443"
```
### Integración con redes Docker
Para proxy a contenedores en otras redes Docker:
```yaml
services:
app:
# ... configuración existente ...
networks:
- npm_network
- otra_red_docker
networks:
npm_network:
name: npm_network
otra_red_docker:
external: true
```
Luego en NPM usa el **nombre del contenedor** como Forward Hostname (ej: `portainer`).
## Documentación adicional
Consulta la [**Wiki del proyecto**](https://git.ictiberia.com/groales/npm/wiki) para documentación detallada:
- [Guía de Configuración](https://git.ictiberia.com/groales/npm/wiki/Configuracion)
- [Certificados SSL/TLS](https://git.ictiberia.com/groales/npm/wiki/SSL)
- [Backup y Restauración](https://git.ictiberia.com/groales/npm/wiki/Backup)
- [Configuración Avanzada](https://git.ictiberia.com/groales/npm/wiki/Avanzado)
## Solución de problemas
### Puerto ocupado
Si algún puerto está en uso:
```bash
# Ver qué proceso usa el puerto
Get-NetTCPConnection -LocalPort 80
# o en Linux
sudo netstat -tulpn | grep :80
# Cambiar puerto en docker-compose.yaml
ports:
- "8080:80" # HTTP en puerto 8080
```
### Contenedor no arranca
```bash
# Ver logs
docker logs nginx-proxy-manager
# Logs en tiempo real
docker logs -f nginx-proxy-manager
```
### Certificado SSL no se genera
Verifica que:
1. ✅ El dominio apunta correctamente al servidor (DNS)
2. ✅ Puertos 80 y 443 accesibles desde Internet
3. ✅ No hay firewall bloqueando el tráfico
4. ✅ El dominio no supera los límites de Let's Encrypt (5 certs/semana)
```bash
# Test de accesibilidad desde exterior
curl -I http://tudominio.com
# Verificar DNS
nslookup tudominio.com
dig tudominio.com
```
### Olvido de credenciales
Resetear contraseña del admin:
```bash
docker exec -it nginx-proxy-manager /bin/bash
# Dentro del contenedor
cd /app
npx knex migrate:latest --env production
npx knex seed:run --env production
# Credenciales vuelven a:
# Email: admin@example.com
# Password: changeme
```
## Personalización
### Cambiar base de datos a MySQL/PostgreSQL
Por defecto NPM usa SQLite. Para usar MySQL:
```yaml
services:
app:
environment:
DB_MYSQL_HOST: "mysql"
DB_MYSQL_PORT: 3306
DB_MYSQL_USER: "npm"
DB_MYSQL_PASSWORD: "npm_password"
DB_MYSQL_NAME: "npm"
depends_on:
- mysql
mysql:
image: mysql:8.0
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: root_password
MYSQL_DATABASE: npm
MYSQL_USER: npm
MYSQL_PASSWORD: npm_password
volumes:
- mysql_data:/var/lib/mysql
volumes:
npm_data:
npm_letsencrypt:
mysql_data:
```
### Deshabilitar IPv6
Si tienes problemas con IPv6:
```yaml
environment:
DISABLE_IPV6: "true"
```
## Recursos oficiales
- 📘 [Documentación oficial](https://nginxproxymanager.com/)
- 🐛 [GitHub - Issues](https://github.com/NginxProxyManager/nginx-proxy-manager/issues)
- 💬 [Reddit Community](https://reddit.com/r/nginxproxymanager)
- 🎥 [Setup Guide (YouTube)](https://www.youtube.com/watch?v=P3imFC7GSr0)
- 🐳 [Docker Hub](https://hub.docker.com/r/jc21/nginx-proxy-manager)
## Seguridad
### Recomendaciones
1.**Cambiar credenciales** por defecto inmediatamente
2.**Restringir acceso** al puerto 81 (admin) con firewall
3.**Usar certificados SSL** para todos los hosts
4.**Habilitar listas de acceso** para hosts sensibles
5.**Actualizar regularmente** con `docker compose pull && docker compose up -d`
6.**Backup periódico** del volumen `npm_data`
### Proteger puerto de administración
Limitar acceso al puerto 81 solo desde IP local:
```yaml
ports:
- "80:80"
- "127.0.0.1:81:81" # Solo accesible desde localhost
- "443:443"
```
Luego accede via túnel SSH:
```bash
ssh -L 8081:localhost:81 usuario@servidor
# Abre http://localhost:8081 en tu navegador
```
O usa VPN (WireGuard, Tailscale) para acceso seguro remoto.
## Actualización
```bash
# Pull nueva imagen
docker compose pull
# Reiniciar con nueva versión
docker compose up -d
# Ver logs
docker logs -f nginx-proxy-manager
```
NPM mantiene compatibilidad de base de datos entre versiones, las actualizaciones suelen ser sin problemas.
---
**Versión**: Latest (imagen Docker rolling)
**Última actualización**: Noviembre 2025

26
docker-compose.yaml Normal file
View File

@@ -0,0 +1,26 @@
services:
app:
container_name: nginx-proxy-manager
image: jc21/nginx-proxy-manager:latest
restart: unless-stopped
environment:
TZ: "Europe/Madrid"
ports:
- "80:80" # HTTP
- "81:81" # Admin UI
- "443:443" # HTTPS
volumes:
- npm_data:/data
- npm_letsencrypt:/etc/letsencrypt
networks:
- npm_network
volumes:
npm_data:
name: npm_data
npm_letsencrypt:
name: npm_letsencrypt
networks:
npm_network:
name: npm_network