# Portainer Stacks Repository Este repositorio contiene la configuración de Portainer y múltiples stacks de servicios Docker gestionados mediante Docker Compose. ## 📋 Tabla de Contenidos - [Descripción](#descripción) - [Arquitectura](#arquitectura) - [Prerequisitos](#prerequisitos) - [Instalación y Despliegue](#instalación-y-despliegue) - [Stacks Disponibles](#stacks-disponibles) - [Configuración](#configuración) - [Uso](#uso) ## 📖 Descripción Este proyecto proporciona una infraestructura completa de servicios containerizados utilizando: - **Portainer** como gestor visual de contenedores Docker - **Traefik** como reverse proxy con certificados SSL automáticos - **Authentik** para autenticación SSO - Múltiples servicios adicionales (Gitea, n8n, AdGuard, etc.) ## 🏗️ Arquitectura La arquitectura sigue este orden de despliegue: 1. **Portainer** (gestor de contenedores) - acceso directo por puerto 9443 2. **Traefik** (reverse proxy) - desplegado desde Portainer 3. **Authentik** (SSO) - desplegado desde Portainer 4. **Resto de stacks** - desplegables desde Portainer Todos los servicios se comunican a través de la red Docker `proxy` y están protegidos por Traefik con SSL. > **⚠️ Importante**: Los registros DNS deben estar configurados ANTES de desplegar Traefik y Authentik para que los certificados SSL se generen correctamente. ## ✅ Prerequisitos - Docker Engine (20.10+) - Docker Compose (v2.0+) - Dominio(s) configurado(s) apuntando a tu servidor - Puertos 80 y 443 abiertos (o 9443 para modo directo) ## 🚀 Instalación y Despliegue ### Paso 1: Clonar el Repositorio ```bash git clone cd Portainer_repo ``` ### Paso 2: Crear la Red de Docker Todos los servicios comparten la red `proxy`: ```bash docker network create proxy ``` ### Paso 3: Preparar Secretos de Portainer Crea el archivo de secreto para la clave de cifrado de Portainer: ```bash # Crear directorio para secretos sudo mkdir -p /opt/portainer/secrets # Generar una clave aleatoria de 32 caracteres openssl rand -base64 32 | sudo tee /opt/portainer/secrets/portainer # Asegurar permisos correctos sudo chmod 600 /opt/portainer/secrets/portainer ``` ### Paso 4: Desplegar Portainer (PRIMERO) Despliega Portainer con acceso directo por puerto 9443: ```bash docker compose -f docker-compose.9443.yml up -d ``` Verifica que Portainer esté corriendo: ```bash docker ps | grep portainer ``` Accede a: `https://tu-servidor:9443` ### Paso 5: Configuración Inicial de Portainer 1. Accede a Portainer mediante `https://tu-servidor:9443` 2. Crea el usuario administrador (primera vez - tienes 5 minutos) 3. Selecciona el entorno Docker local 4. Completa la configuración inicial ### Paso 6: Configurar Registros DNS **Antes de desplegar Traefik y Authentik**, configura los registros DNS: - Registro A para Traefik Dashboard (ej: `traefik.tudominio.com`) - Registro A para Portainer UI (ej: `portainer.tudominio.com`) - Registro A para Portainer API (ej: `portainer-api.tudominio.com`) - Registro A para Authentik (ej: `auth.tudominio.com`) - Cualquier otro dominio que vayas a usar > **⏰ Espera** a que los registros DNS se propaguen antes de continuar (puede tardar de minutos a horas). Verifica la propagación: ```bash nslookup traefik.tudominio.com nslookup portainer.tudominio.com nslookup auth.tudominio.com ``` ### Paso 7: Desplegar Traefik desde Portainer 1. En Portainer, ve a **Stacks** → **Add stack** 2. Nombre: `traefik` 3. Selecciona **Repository** o **Git repository** 4. Configura: - Repository URL: `` - Repository reference: `main` - Compose path: `Traefik/docker-compose.yml` 5. Añade el archivo de variables de entorno: `Traefik/stack.env` (o configúralas manualmente) 6. Haz clic en **Deploy the stack** Verifica que Traefik esté funcionando: ```bash docker logs traefik ``` ### Paso 8: Desplegar Authentik desde Portainer 1. En Portainer, ve a **Stacks** → **Add stack** 2. Nombre: `authentik` 3. Selecciona **Repository** o **Git repository** 4. Configura: - Repository URL: `` - Repository reference: `main` - Compose path: `authentik/docker-compose.yml` 5. Añade las variables de entorno necesarias 6. Haz clic en **Deploy the stack** #### Configuración de Authentik Una vez desplegado Authentik, necesitarás configurar: - **Applications** (aplicaciones a proteger) - **Providers** de tipo Forward Auth - **Authorization Flow** de tipo Implicit - **Outposts** para ejecutar los providers - **Middleware** en Traefik Para instrucciones detalladas, consulta el [README de Authentik](authentik/README.md). ### Paso 9: Configurar Variables de Entorno para Portainer UI Una vez Traefik y Authentik están funcionando, actualiza el archivo `.env` en la raíz del proyecto: ```bash nano .env ``` Variables principales a configurar: - `PORTAINER_DOMAIN`: Tu dominio para Portainer UI (ej: `portainer.tudominio.com`) - `PORTAINER_API_DOMAIN`: Tu dominio para la API de Portainer (ej: `portainer-api.tudominio.com`) - `PORTAINER_API_IP_WHITELIST`: IPs permitidas para acceso directo a la API - `TRAEFIK_AUTH_MIDDLEWARE`: Middleware de autenticación (ej: `ths-authentik@docker`) ### Paso 10: Actualizar Stack de Portainer (Opcional) Si deseas acceder a Portainer mediante dominio con SSL (en lugar del puerto 9443): 1. En Portainer, ve a **Stacks** → **Add stack** 2. Nombre: `portainer` 3. Selecciona **Upload** y sube el archivo `docker-compose.yml` de la raíz 4. O usa **Repository** apuntando a la raíz del repositorio 5. Añade las variables de entorno del archivo `.env` 6. Haz clic en **Deploy the stack** > **Nota**: Esto reemplazará el despliegue inicial por puerto 9443 con acceso mediante dominio. ### Paso 11: Desplegar Otros Stacks desde Portainer Una vez la infraestructura base está funcionando, puedes desplegar el resto de stacks: #### Método 1: Desde la UI de Portainer (Recomendado) 1. Ve a **Stacks** → **Add stack** 2. Selecciona **Repository** 3. Configura el repositorio Git: - URL: `` - Reference: `main` (o tu rama) - Compose path: `/docker-compose.yml` 4. Añade variables de entorno si es necesario 5. Haz clic en **Deploy the stack** #### Método 2: Desde línea de comandos ```bash # Ejemplo: Desplegar Authentik cd authentik docker compose up -d cd .. # Ejemplo: Desplegar Gitea cd gitea docker compose up -d cd .. ``` ## 📦 Stacks Disponibles | Stack | Descripción | Carpeta | Documentación | |-------|-------------|---------|---------------| | **Traefik** | Reverse proxy con SSL automático | `Traefik/` | [README](Traefik/README.md) | | **Portainer** | Gestor visual de Docker | Raíz (docker-compose.yml) | - | | **Authentik** | Sistema de autenticación SSO (Forward Auth) | `authentik/` | [README](authentik/README.md) | | **Gitea** | Servidor Git autoalojado con Actions | `gitea/` | [README](gitea/README.md) | | **n8n** | Plataforma de automatización de workflows | `n8n/` | [README](n8n/README.md) | | **AdGuard** | Bloqueador de anuncios DNS con DoT | `adguard/` | [README](adguard/README.md) | | **Trilium** | Aplicación de notas jerárquicas | `trilium/` | [README](trilium/README.md) | | **Wireguard** | VPN rápida y segura | `wireguard/` | [README](wireguard/README.md) | | **Ruleta** | Aplicación Next.js personalizada | `ruleta/` | [README](ruleta/README.md) | > **📖 Nota**: Cada stack tiene su propio README con instrucciones detalladas de configuración, uso y troubleshooting. ## ⚙️ Configuración ### Archivo .env Principal El archivo `.env` en la raíz contiene las configuraciones globales: ```env # Imagen de Portainer PORTAINER_IMAGE=portainer/portainer-ce:latest # Rutas de almacenamiento PORTAINER_SECRET_PATH=/opt/portainer/secrets/portainer PORTAINER_DATA_PATH=/opt/portainer/data # Configuración de red y proxy TRAEFIK_DOCKER_NETWORK=proxy TRAEFIK_ENTRYPOINT_SECURE=websecure TRAEFIK_CERTRESOLVER=letsencrypt # Dominios PORTAINER_DOMAIN=portainer.example.com PORTAINER_API_DOMAIN=portainer-api.example.com # Seguridad PORTAINER_API_IP_WHITELIST=10.8.0.0/24,172.18.0.1/32 TRAEFIK_AUTH_MIDDLEWARE=ths-authentik@docker ``` ### Configuraciones por Stack Cada stack puede tener su propio archivo `stack.env` o `.env` en su carpeta correspondiente. ## 🎯 Uso ### Ver Logs de Portainer ```bash docker logs -f portainer ``` ### Ver Estado de Todos los Contenedores ```bash docker ps -a ``` ### Actualizar Portainer ```bash docker compose pull docker compose up -d ``` ### Reiniciar un Stack Desde Portainer UI o: ```bash cd docker compose restart ``` ### Eliminar un Stack ```bash cd docker compose down # Para eliminar también volúmenes: docker compose down -v ``` ## 🔒 Seguridad ### Acceso a Portainer UI - **Protegido por SSO**: La UI principal está protegida mediante Authentik (configurable con `TRAEFIK_AUTH_MIDDLEWARE`) - **Dominio**: Accesible solo mediante el dominio configurado con SSL ### Acceso a API de Portainer - **Whitelist IP**: La API está restringida a IPs específicas (VPN, localhost) - **Dominio separado**: Usa un dominio diferente sin SSO para apps móviles - **SSL**: Todo el tráfico está cifrado ### Base de Datos Cifrada Portainer utiliza una clave de cifrado para proteger su base de datos, montada en: - `/run/secrets/portainer` - `/run/portainer/portainer` ## 🛠️ Troubleshooting ### Portainer no arranca 1. Verifica que la red `proxy` existe: `docker network ls | grep proxy` 2. Revisa los logs: `docker logs portainer` 3. Verifica que el archivo de secreto existe y tiene permisos correctos 4. Verifica que el puerto 9443 no esté ocupado: `sudo netstat -tulpn | grep 9443` ### No puedo acceder mediante dominio 1. Verifica que el dominio apunta a tu servidor: `nslookup tudominio.com` 2. Verifica que los registros DNS están propagados 3. Verifica que Traefik esté corriendo: `docker ps | grep traefik` 4. Verifica la configuración de Traefik: `docker logs traefik` 5. Revisa las labels de Traefik en el docker-compose.yml 6. Verifica que los puertos 80 y 443 estén abiertos: `sudo netstat -tulpn | grep -E ':(80|443)'` 7. Como respaldo, siempre puedes acceder por `https://tu-servidor:9443` ### Error de permisos con volúmenes (SELinux) Si usas SELinux, los volúmenes ya tienen la opción `:Z` configurada. Si persisten problemas: ```bash sudo chcon -Rt svirt_sandbox_file_t /opt/portainer/data ``` ### Authentik no protege los servicios 1. Verifica que el outpost esté corriendo y en estado **Healthy** 2. Revisa que las aplicaciones y providers estén correctamente configurados 3. Verifica que el authorization flow sea de tipo **Implicit** 4. Comprueba que el middleware de Traefik esté correctamente referenciado en las labels 5. Revisa los logs de Authentik: `docker logs authentik-server` 6. Verifica la conectividad entre Traefik y Authentik en la red `proxy` ## 📝 Notas Adicionales - **Orden de despliegue**: Siempre desplegar Portainer (9443) → Traefik → Authentik → Resto de stacks - **Registros DNS**: Configurar ANTES de desplegar Traefik para que Let's Encrypt funcione correctamente - **Puerto 9443**: Mantén el acceso por puerto 9443 como respaldo en caso de problemas con Traefik - **Backups**: Considera hacer backup regular de `/opt/portainer/data` y el archivo de secretos - **Actualizaciones**: Actualiza las imágenes regularmente desde Portainer UI - **Monitoreo**: Usa Portainer para monitorear recursos y logs de todos los contenedores ## 📄 Licencia Consulta el archivo LICENSE en este repositorio. ## 🤝 Contribuciones Las contribuciones son bienvenidas. Por favor, abre un issue o pull request para sugerencias o mejoras.