diff --git a/.gitignore b/.gitignore index 70b9fa1..3cc7890 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,8 @@ # Configuraciones live con datos reales de producción *.live.yaml +opencode/opencode.json +cheerfy_pentest_report.md # Backups y temporales *.bak diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..333f90c --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,11 @@ +# Repository Instructions + +This repository is managed directly with Docker Compose. + +- Do not assume Portainer is part of the deployment workflow. +- Deploy services with `docker compose` and each service's local `.env`. +- Do not use `stack.env` as the deployment environment file. +- Avoid adding new Portainer-based instructions. +- Keep edits scoped; many service compose files may have local uncommitted changes. +- For exposed services, keep Traefik labels consistent with the existing `proxy` network pattern. +- Validate compose changes with `docker compose --env-file .env config` from the service directory when possible. diff --git a/COOLIFY-TEMPLATE.md b/COOLIFY-TEMPLATE.md index bef790a..61676d1 100644 --- a/COOLIFY-TEMPLATE.md +++ b/COOLIFY-TEMPLATE.md @@ -168,7 +168,7 @@ docker network create mail_internal 1. **Ports Exposes**: set to the app's HTTP port (must match `loadbalancer.server.port` label) 2. **Domain**: set FQDN (e.g. `myapp.sherlockhomeless.net`) 3. **Base Directory**: set to the subdirectory (e.g. `/gitea`, `/n8n`) -4. **Environment Variables**: fill from `.env` (copy values from `stack.env` template if needed) +4. **Environment Variables**: fill from the service `.env` --- diff --git a/NUEVA-APP.md b/NUEVA-APP.md index 7e106f0..fee621b 100644 --- a/NUEVA-APP.md +++ b/NUEVA-APP.md @@ -73,9 +73,9 @@ Igual que el Caso A — CrowdSec siempre, Authentik solo cuando la app no tiene --- -## 3. Variables de entorno obligatorias en stack.env / .env +## 3. Variables de entorno obligatorias en .env -Incluye siempre estas variables en el `stack.env` de la nueva app para que las labels funcionen: +Incluye siempre estas variables en el `.env` local de la nueva app para que Docker Compose resuelva las labels: ```env ##### Traefik / dominios ##### @@ -169,7 +169,7 @@ Nueva app │ ├── Caso B (privada) → crowdsec-bouncer@file + ths-authentik@docker │ └── Caso C (auth propia)→ crowdsec-bouncer@file │ - ├── 3. Variables en stack.env / .env + ├── 3. Variables en .env │ ├── 4. Authentik Provider + App + Outpost (solo Caso B) │ @@ -198,4 +198,4 @@ Nueva app | 3 | SSL no funciona | `tls.certresolver` mal escrito o dominio no existe en DNS | Verificar DNS con `dig miapp.sherlockhomeless.net` | | 4 | Authentik redirige pero da 404 | App no añadida al Embedded Outpost | Paso 4.3 | | 5 | CrowdSec da 403 | IP baneada | `docker exec crowdsec cscli decisions list` — si apareces, `cscli decisions delete --ip ` | -| 6 | Variable no expandida en label | Traefik no expande vars en labels de docker | Hardcodear el valor o usar la variable en stack.env | +| 6 | Variable no expandida en label | Traefik no expande vars en labels de docker; Docker Compose debe resolverlas antes | Definirla en `.env` y validar con `docker compose --env-file .env config` | diff --git a/PROMPT-SSO-ISSUE.md b/PROMPT-SSO-ISSUE.md index c1b2fe1..3fadf23 100644 --- a/PROMPT-SSO-ISSUE.md +++ b/PROMPT-SSO-ISSUE.md @@ -121,12 +121,10 @@ Posibles causas: Portainer_repo/ ├── opengist/ │ ├── docker-compose.yml -│ ├── .env -│ └── stack.env +│ └── .env ├── onetimesecret/ │ ├── docker-compose.yml -│ ├── .env -│ └── stack.env +│ └── .env ├── authentik/ │ ├── docker-compose.yml │ ├── create-auth-app.sh diff --git a/README.md b/README.md index 331d908..1188074 100644 --- a/README.md +++ b/README.md @@ -1,377 +1,183 @@ -# Portainer Stacks Repository +# Compose Services Repository -Este repositorio contiene la configuración de Portainer y múltiples stacks de servicios Docker gestionados mediante Docker Compose. +Este repositorio contiene servicios autoalojados gestionados directamente con Docker Compose. -## 📋 Tabla de Contenidos +Portainer ya no es el gestor de despliegue de este repo. Los despliegues se hacen desde CLI con `docker compose` y variables en archivos `.env` locales. No uses `stack.env` como fuente de despliegue. + +## Contenido -- [Descripción](#descripción) - [Arquitectura](#arquitectura) - [Prerequisitos](#prerequisitos) -- [Instalación y Despliegue](#instalación-y-despliegue) -- [Stacks Disponibles](#stacks-disponibles) -- [Configuración](#configuración) +- [Despliegue](#despliegue) +- [Servicios](#servicios) +- [Configuracion](#configuracion) - [Uso](#uso) -- [**→ Añadir una nueva app**](NUEVA-APP.md) +- [Anadir una nueva app](NUEVA-APP.md) -## 📖 Descripción +## Arquitectura -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.) +La infraestructura base se levanta en este orden: -## 🏗️ Arquitectura +1. `Traefik/`: reverse proxy y certificados TLS. +2. `authentik/`: SSO y forward auth para apps privadas. +3. `crowdsec/`: proteccion colaborativa y bouncer para Traefik. +4. Resto de servicios: cada uno desde su propia carpeta. -La arquitectura sigue este orden de despliegue: +Los servicios publicados comparten la red Docker externa `proxy`, que Traefik usa para alcanzarlos. -1. **Portainer** (gestor de contenedores) - acceso directo por puerto 9443 -2. **Traefik** (reverse proxy) - desplegado desde Portainer -3. **Authentik** (SSO) - desplegado desde Portainer -4. **CrowdSec** (IPS/IDS + bouncer) - protección de seguridad colaborativa para todos los servicios -5. **Resto de stacks** - desplegables desde Portainer +Configura DNS antes de desplegar servicios expuestos. Los certificados de Let's Encrypt dependen de que los dominios resuelvan correctamente. -Todos los servicios se comunican a través de la red Docker `proxy` y están protegidos por Traefik con SSL. +## Prerequisitos -> **⚠️ Importante**: Los registros DNS deben estar configurados ANTES de desplegar Traefik y Authentik para que los certificados SSL se generen correctamente. +- Docker Engine +- Docker Compose v2 +- Red Docker externa `proxy` +- Dominios apuntando al servidor o al Cloudflare Tunnel correspondiente +- Puertos 80/443 disponibles para Traefik si aplica -## ✅ 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`: +Crear la red compartida: ```bash docker network create proxy ``` -### Paso 3: Preparar Secretos de Portainer +Si ya existe, Docker devolvera un error inofensivo. -Crea el archivo de secreto para la clave de cifrado de Portainer: +## Despliegue + +Cada servicio se despliega desde su carpeta con su `.env` local: ```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 +cd Traefik +docker compose --env-file .env up -d ``` -### Paso 4: Desplegar Portainer (PRIMERO) - -Despliega Portainer con acceso directo por puerto 9443: +Para actualizar un servicio: ```bash -docker compose -f docker-compose.9443.yml up -d +cd +docker compose --env-file .env pull +docker compose --env-file .env 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/.env` (puedes partir de `Traefik/stack.env` como plantilla) -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). - -> **Importante**: para proteger nuevas apps con `ths-authentik@docker`, no basta con añadir el middleware en Traefik. También hay que crear en Authentik el **Proxy Provider**, la **Application** y asociarlos al **Embedded Outpost**. El patrón completo está documentado en `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: +Para reiniciarlo: ```bash -nano .env +cd +docker compose --env-file .env restart ``` -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 +Para detenerlo: ```bash -# Ejemplo: Desplegar Authentik -cd authentik -docker compose up -d -cd .. - -# Ejemplo: Desplegar Gitea -cd gitea -docker compose up -d -cd .. +cd +docker compose --env-file .env down ``` -## 📦 Stacks Disponibles +Usa `docker compose --env-file .env -f /docker-compose.yml up -d` si prefieres ejecutar desde la raiz del repo. -| 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) | -| **CrowdSec** | IPS/IDS colaborativo + bouncer Traefik + Grafana | `crowdsec/` | [README](crowdsec/README.md) | -| **Homepage** | Dashboard principal expuesto por Traefik | `homepage/` | [README](homepage/README.md) | -| **Dozzle** | Visor de logs Docker protegido con Authentik | `dozzle/` | [README](dozzle/README.md) | -| **Beszel** | Monitorización ligera de host y contenedores | `beszel/` | [README](beszel/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) | -| **Mail Relay** | Relay SMTP de salida para aplicaciones | `mail-relay/` | [README](mail-relay/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) | +## Servicios -> **📖 Nota**: Cada stack tiene su propio README con instrucciones detalladas de configuración, uso y troubleshooting. +| Servicio | Descripcion | Carpeta | Documentacion | +|---|---|---|---| +| Traefik | Reverse proxy con TLS automatico | `Traefik/` | [README](Traefik/README.md) | +| Authentik | SSO y Forward Auth | `authentik/` | [README](authentik/README.md) | +| CrowdSec | IPS/IDS, bouncer y Grafana | `crowdsec/` | [README](crowdsec/README.md) | +| Homepage | Dashboard principal | `homepage/` | [README](homepage/README.md) | +| Dozzle | Visor de logs Docker | `dozzle/` | [README](dozzle/README.md) | +| Beszel | Monitorizacion ligera | `beszel/` | [README](beszel/README.md) | +| Gitea | Git autoalojado | `gitea/` | [README](gitea/README.md) | +| n8n | Automatizacion de workflows | `n8n/` | [README](n8n/README.md) | +| Mail Relay | Relay SMTP interno | `mail-relay/` | [README](mail-relay/README.md) | +| AdGuard | DNS y bloqueo de anuncios | `adguard/` | [README](adguard/README.md) | +| Trilium | Notas jerarquicas | `trilium/` | [README](trilium/README.md) | +| Wireguard | VPN | `wireguard/` | [README](wireguard/README.md) | +| Open WebUI | UI para modelos locales/remotos | `openwebui/` | [README](openwebui/README.md) | +| OpenCode | Entorno OpenCode servido por Traefik | `opencode/` | [README](opencode/README.md) | +| Kopia | Backups | `backups/kopia/` | [README](backups/kopia/README.md) | -## ⚙️ Configuración +## Configuracion -### Archivo .env Principal +Cada carpeta de servicio debe tener un `.env` con sus variables reales. -El archivo `.env` en la raíz contiene las configuraciones globales: +Reglas actuales: + +- Despliega siempre con `.env`. +- No uses `stack.env` para desplegar. +- No documentes flujos nuevos basados en Portainer. +- Mantén secretos reales fuera de Git. +- Para apps expuestas por Traefik, el servicio publicado debe estar en la red `proxy`. +- Las bases de datos y dependencias internas deben quedarse en redes internas salvo que Traefik deba alcanzarlas. + +Variables comunes de Traefik: ```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 +Para crear una app nueva, sigue [NUEVA-APP.md](NUEVA-APP.md). -Cada stack usa su propio archivo `.env` local. El archivo `stack.env` se conserva solo como plantilla de ejemplo para copiar o tomar como referencia. +## Uso -## 🎯 Uso - -### Ver Logs de Portainer - -```bash -docker logs -f portainer -``` - -### Ver Estado de Todos los Contenedores +Ver contenedores: ```bash docker ps -a ``` -### Actualizar Portainer +Ver logs de un servicio: ```bash -docker compose pull -docker compose up -d +cd +docker compose --env-file .env logs -f ``` -### Reiniciar un Stack - -Desde Portainer UI o: -```bash -cd -docker compose restart -``` - -### Eliminar un Stack +Validar un compose: ```bash -cd -docker compose down -# Para eliminar también volúmenes: -docker compose down -v +cd +docker compose --env-file .env config ``` -## 🔒 Seguridad +## Troubleshooting -### Acceso a Portainer UI +Si Traefik no enruta: -- **Protegido por SSO**: La UI principal está protegida mediante Authentik (configurable con `TRAEFIK_AUTH_MIDDLEWARE`) -- **Dominio**: Accesible solo mediante el dominio configurado con SSL +1. Verifica DNS: `dig ` +2. Comprueba que Traefik esta corriendo: `docker ps | grep traefik` +3. Revisa logs: `docker logs traefik` +4. Valida labels del servicio publicado. +5. Comprueba que el contenedor esta en la red `proxy`. -### Acceso a API de Portainer +Si Authentik redirige pero devuelve error: -- **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 +1. Verifica que existe el Proxy Provider. +2. Verifica que existe la Application. +3. Comprueba que la app esta asociada al Embedded Outpost. +4. Revisa logs de `authentik-server`. -### Base de Datos Cifrada +Si un `.env` no se aplica: -Portainer utiliza una clave de cifrado para proteger su base de datos, montada en: -- `/run/secrets/portainer` -- `/run/portainer/portainer` +1. Ejecuta desde la carpeta del servicio o usa `--env-file /.env`. +2. Valida con `docker compose --env-file .env config`. +3. Recuerda que Traefik no expande variables; Docker Compose las expande antes de crear labels. -## 🛠️ Troubleshooting +## Notas -### Portainer no arranca +- Orden recomendado: Traefik -> Authentik -> CrowdSec -> servicios. +- CrowdSec debe ir antes de Authentik en la cadena de middlewares cuando ambos se usen. +- Las instrucciones antiguas de Portainer se consideran obsoletas. -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` +## Stacks deprecados -### No puedo acceder mediante dominio +Los stacks descartados de la infra (ya no se despliegan) se prefijan con +`DEPRECATED-` (ej. `DEPRECATED-kasm/`) en vez de borrarse, para conservar +la config por si hace falta consultarla. Antes de renombrar: -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 → CrowdSec → 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. +1. Confirmar que no queden contenedores corriendo (`docker ps -a --filter name=`). +2. Quitar/inhabilitar su ruta en `/opt/traefik/dynamic/` si tenía una. +3. Quitar su entrada de Homepage (labels en el compose o `services.yaml`). +4. `git mv DEPRECATED-` (preserva historial). diff --git a/Traefik/README.md b/Traefik/README.md index 8bd6392..de87bbb 100644 --- a/Traefik/README.md +++ b/Traefik/README.md @@ -28,17 +28,14 @@ Este stack despliega Traefik configurado para: sudo mkdir -p /opt/traefik/letsencrypt ``` -### Desde Portainer +### Desde Docker Compose -1. 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. Copia `Traefik/stack.env` a `Traefik/.env` y carga `Traefik/.env` como archivo de variables de entorno -6. Haz clic en **Deploy the stack** +Asegurate de tener `Traefik/.env` configurado y despliega: + +```bash +cd Traefik +docker compose --env-file .env up -d +``` ### Variables de Entorno @@ -296,17 +293,15 @@ sudo tar -xzf traefik-backup-YYYYMMDD.tar.gz -C / Para actualizar Traefik: -1. En Portainer, ve al stack de Traefik -2. Edita el archivo `.env` y cambia la versión: +1. Edita el archivo `.env` y cambia la versión: ```env TRAEFIK_IMAGE=traefik:v3.3 ``` -3. Haz clic en **Update the stack** -4. O desde línea de comandos: +2. Redespiega: ```bash cd Traefik - docker compose pull - docker compose up -d + docker compose --env-file .env pull + docker compose --env-file .env up -d ``` > **⚠️ Nota**: Revisa el [changelog de Traefik](https://github.com/traefik/traefik/releases) antes de actualizar versiones mayores. diff --git a/adguard/README.md b/adguard/README.md index 3d8b5b5..9c30d4f 100644 --- a/adguard/README.md +++ b/adguard/README.md @@ -47,17 +47,14 @@ openssl req -x509 -nodes -days 365 -newkey rsa:2048 \ -subj "/CN=adguard.tudominio.com" ``` -### Desde Portainer +### Desde Docker Compose -1. Ve a **Stacks** → **Add stack** -2. Nombre: `adguard` -3. Selecciona **Repository** o **Git repository** -4. Configura: - - Repository URL: `` - - Repository reference: `main` - - Compose path: `adguard/docker-compose.yml` -5. Copia `adguard/stack.env` a `adguard/.env` y carga `adguard/.env` como archivo de variables de entorno -6. Haz clic en **Deploy the stack** +Asegurate de tener `adguard/.env` configurado y despliega: + +```bash +cd adguard +docker compose --env-file .env up -d +``` ### Variables de Entorno @@ -352,7 +349,7 @@ sudo tar -xzf adguard-backup-YYYYMMDD.tar.gz -C / ```env ADGUARD_IMAGE=adguard/adguardhome:latest ``` -3. Actualiza el stack en Portainer +3. Redespiega con Docker Compose 4. Verifica los logs y el panel web ## 📊 Estadísticas diff --git a/authentik/README.md b/authentik/README.md index 32f6be8..48880aa 100644 --- a/authentik/README.md +++ b/authentik/README.md @@ -8,18 +8,14 @@ Este stack despliega Authentik configurado para funcionar con Traefik mediante * ## 🚀 Despliegue -### Desde Portainer +### Desde Docker Compose -1. 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. Carga el archivo de variables de entorno: `authentik/.env` -6. O añade manualmente las variables de entorno necesarias -7. Haz clic en **Deploy the stack** +Asegurate de tener `authentik/.env` configurado y despliega: + +```bash +cd authentik +docker compose --env-file .env up -d +``` ### Variables de Entorno Importantes @@ -53,12 +49,12 @@ Una vez desplegado Authentik, accede a su interfaz web en `https://auth.tudomini ### 2. Crear Applications (Aplicaciones) -Para cada servicio que quieras proteger (ej: Portainer, Traefik Dashboard, Gitea, etc.): +Para cada servicio que quieras proteger (ej: Traefik Dashboard, Gitea, Dozzle, etc.): 1. Ve a **Applications** → **Create** 2. Completa el formulario: - - **Name**: `Portainer` (nombre descriptivo) - - **Slug**: `portainer` (identificador único en minúsculas) + - **Name**: `Mi App` (nombre descriptivo) + - **Slug**: `miapp` (identificador único en minúsculas) - **Provider**: (lo crearás en el siguiente paso - déjalo vacío por ahora) - **Policy engine mode**: `any` (permite acceso si alguna política coincide) - **UI settings**: Configura el icono y apariencia (opcional) @@ -71,11 +67,11 @@ Los providers conectan tus aplicaciones con Authentik. Para Forward Auth con Tra 1. Ve a **Applications** → Tu aplicación → **Provider** → **Create** 2. Selecciona tipo: **Proxy Provider** 3. Completa el formulario: - - **Name**: `Portainer Provider` + - **Name**: `Mi App Provider` - **Authorization flow**: Selecciona `default-provider-authorization-implicit-consent` (créalo si no existe - ver paso 4) - **Type**: **Forward auth (single application)** - - **External host**: `https://portainer.tudominio.com` (URL completa de tu servicio) - - **Internal host**: `http://portainer:9000` (opcional - URL interna si Authentik debe hacer reverse proxy) + - **External host**: `https://miapp.tudominio.com` (URL completa de tu servicio) + - **Internal host**: `http://miapp:8080` (opcional - URL interna si Authentik debe hacer reverse proxy) - **Internal host SSL validation**: Desactivado (si usas HTTP interno) 4. **Advanced settings**: - **Token validity**: `hours=24` (duración de la sesión) @@ -140,7 +136,7 @@ Los **outposts** son los componentes que ejecutan los providers y procesan las p - **Name**: `authentik-embedded-outpost` (o el nombre que prefieras) - **Type**: **Proxy** - **Integration**: Déjalo vacío (el outpost embedded usa la integración por defecto) -3. **Applications**: Selecciona todas las aplicaciones que creaste (Portainer, Traefik, etc.) +3. **Applications**: Selecciona todas las aplicaciones que creaste (Traefik, Gitea, Dozzle, etc.) 4. **Configuration**: ```yaml authentik_host: https://auth.tudominio.com @@ -203,14 +199,14 @@ Una vez configurado el middleware, añade la label a los servicios que quieras p ```yaml labels: - traefik.http.routers.portainer.middlewares: "ths-authentik@docker" + traefik.http.routers.miapp.middlewares: "ths-authentik@docker" ``` O si definiste el middleware en archivo: ```yaml labels: - traefik.http.routers.portainer.middlewares: "authentik@file" + traefik.http.routers.miapp.middlewares: "authentik@file" ``` ### 7.1 Patrón recomendado para nuevas apps @@ -583,8 +579,10 @@ docker exec authentik-redis redis-cli --rdb /data/dump.rdb ## 🔄 Actualizaciones -1. En Portainer, ve a tu stack de Authentik -2. Haz clic en **Editor** -3. Actualiza las versiones de las imágenes si es necesario -4. Haz clic en **Update the stack** -5. O ejecuta: `docker compose pull && docker compose up -d` +1. Edita `.env` y actualiza las versiones de las imagenes si es necesario. +2. Ejecuta: + ```bash + cd authentik + docker compose --env-file .env pull + docker compose --env-file .env up -d + ``` diff --git a/beszel/README.md b/beszel/README.md index 2ad910a..5779b07 100644 --- a/beszel/README.md +++ b/beszel/README.md @@ -2,17 +2,14 @@ Stack para desplegar [Beszel](https://beszel.dev/) en `beszel.sherlockhomeless.net`, con el **hub** publicado por Traefik y un **agent** local para monitorizar este mismo host Docker. -## 🚀 Despliegue en Portainer +## 🚀 Despliegue con Docker Compose -1. Ve a **Stacks** → **Add stack** -2. Nombre: `beszel` -3. Selecciona **Repository** o **Git repository** -4. Configura: - - Repository URL: `` - - Repository reference: `main` - - Compose path: `beszel/docker-compose.yml` -5. Copia `beszel/stack.env` a `beszel/.env` y carga `beszel/.env` como archivo de variables de entorno -6. Haz clic en **Deploy the stack** +Asegurate de tener `beszel/.env` configurado y despliega: + +```bash +cd beszel +docker compose --env-file .env up -d +``` ## ⚙️ Variables importantes diff --git a/cloudflared/README.md b/cloudflared/README.md index d7f6e22..2d725d5 100644 --- a/cloudflared/README.md +++ b/cloudflared/README.md @@ -42,7 +42,6 @@ Permisos mínimos necesarios: ### 3. Configurar el `.env` ```bash -cp stack.env .env nano .env ``` @@ -111,7 +110,7 @@ docker compose --env-file .env up -d # 2. Migrar los DNS al tunnel (convierte A records → CNAME proxied) ./add-domain.sh --tunnel auth traefik gitea n8n nextcloud paperless paperless-ai \ notas memos vikunja karakeep kasm remote beszel dozzle crowdsec grafana llm \ - ocode adblock onlyoffice www cockpit coolify kopia notes opencode portainer \ + ocode adblock onlyoffice www cockpit coolify kopia notes portainer \ uptimekuma webtop wg # 3. Verificar conexión @@ -127,7 +126,7 @@ docker stop cloudflared # 2. Revertir DNS a registros A directos ./add-domain.sh auth traefik gitea n8n nextcloud paperless paperless-ai \ notas memos vikunja karakeep kasm remote beszel dozzle crowdsec grafana llm \ - ocode adblock onlyoffice www cockpit coolify kopia notes opencode portainer \ + ocode adblock onlyoffice www cockpit coolify kopia notes portainer \ uptimekuma webtop wg ``` @@ -163,7 +162,6 @@ docker stop cloudflared | `coolify` | Coolify | | `kopia` | Kopia | | `notes` | Notes | -| `opencode` | OpenCode (alt) | | `portainer` | Portainer | | `uptimekuma` | Uptime Kuma | | `webtop` | Webtop | diff --git a/crowdsec/README.md b/crowdsec/README.md index 8e13fd7..685c969 100644 --- a/crowdsec/README.md +++ b/crowdsec/README.md @@ -30,10 +30,9 @@ Este stack despliega: ### Paso 1: Configurar variables de entorno -Copia la plantilla y edita las variables: +Edita el `.env` local con las variables reales: ```bash -cp crowdsec/stack.env crowdsec/.env nano crowdsec/.env ``` @@ -73,34 +72,18 @@ El script: **Importante**: Traefik necesita reiniciarse para cargar el plugin de CrowdSec y los nuevos volúmenes. -Desde Portainer: -1. Ve a **Stacks** → stack `traefik` -2. Actualiza el archivo `.env` de Traefik para incluir `TRAEFIK_LOG_DIR=/opt/traefik/logs` -3. Haz clic en **Update the stack** +Actualiza el archivo `.env` de Traefik para incluir `TRAEFIK_LOG_DIR=/opt/traefik/logs` y redespliega: -O desde CLI: ```bash cd Traefik -docker compose up -d +docker compose --env-file .env up -d ``` ### Paso 4: Desplegar CrowdSec -Desde Portainer: -1. Ve a **Stacks** → **Add stack** -2. Nombre: `crowdsec` -3. Selecciona **Repository** -4. Configura: - - Repository URL: `` - - Repository reference: `main` - - Compose path: `crowdsec/docker-compose.yml` -5. Carga `crowdsec/.env` como archivo de variables de entorno -6. Haz clic en **Deploy the stack** - -O desde CLI: ```bash cd crowdsec -docker compose up -d +docker compose --env-file .env up -d ``` ### Paso 5: Verificar el despliegue @@ -456,18 +439,16 @@ Incluye en tus backups de Kopia (ya configurados en `backups/kopia/`): Para actualizar CrowdSec: -1. En Portainer, ve al stack `crowdsec` -2. Edita `.env` y actualiza la versión si es necesario: +1. Edita `.env` y actualiza la versión si es necesario: ```env CROWDSEC_IMAGE=crowdsecurity/crowdsec:latest GRAFANA_IMAGE=grafana/grafana:latest ``` -3. Haz clic en **Update the stack** -4. O desde CLI: +2. Redespiega: ```bash cd crowdsec - docker compose pull - docker compose up -d + docker compose --env-file .env pull + docker compose --env-file .env up -d ``` > ⚠️ Antes de actualizar versiones mayores de CrowdSec, revisa el [changelog](https://github.com/crowdsecurity/crowdsec/releases). diff --git a/dozzle/README.md b/dozzle/README.md index 3a1f45a..886dd1c 100644 --- a/dozzle/README.md +++ b/dozzle/README.md @@ -2,17 +2,14 @@ Stack para desplegar [Dozzle](https://dozzle.dev/) como visor ligero de logs Docker en `dozzle.sherlockhomeless.net`. -## 🚀 Despliegue en Portainer +## 🚀 Despliegue con Docker Compose -1. Ve a **Stacks** → **Add stack** -2. Nombre: `dozzle` -3. Selecciona **Repository** o **Git repository** -4. Configura: - - Repository URL: `` - - Repository reference: `main` - - Compose path: `dozzle/docker-compose.yml` -5. Copia `dozzle/stack.env` a `dozzle/.env` y carga `dozzle/.env` como archivo de variables de entorno -6. Haz clic en **Deploy the stack** +Asegurate de tener `dozzle/.env` configurado y despliega: + +```bash +cd dozzle +docker compose --env-file .env up -d +``` ## ⚙️ Variables importantes diff --git a/gitea/README.md b/gitea/README.md index 8350194..866d3d6 100644 --- a/gitea/README.md +++ b/gitea/README.md @@ -19,17 +19,14 @@ Este stack despliega Gitea con: 2. **Registro DNS**: Configura el registro A para tu dominio Gitea 3. **Puerto SSH**: El puerto SSH debe estar disponible (por defecto 222) -### Desde Portainer +### Desde Docker Compose -1. Ve a **Stacks** → **Add stack** -2. Nombre: `gitea` -3. Selecciona **Repository** o **Git repository** -4. Configura: - - Repository URL: `` - - Repository reference: `main` - - Compose path: `gitea/docker-compose.yml` -5. Copia `gitea/stack.env` a `gitea/.env` y carga `gitea/.env` como archivo de variables de entorno -6. Haz clic en **Deploy the stack** +Asegurate de tener `gitea/.env` configurado y despliega: + +```bash +cd gitea +docker compose --env-file .env up -d +``` ### Variables de Entorno Importantes @@ -85,7 +82,7 @@ Para habilitar CI/CD con Gitea Actions: ```env GITEA_RUNNER_REGISTRATION_TOKEN=tu-token-copiado ``` -3. Actualiza el stack en Portainer +3. Redespiega con Docker Compose #### Paso 3: Verificar el Runner @@ -342,7 +339,7 @@ Esto crea un archivo `gitea-dump-*.zip` con todo lo necesario para restaurar. ```env GITEA_IMAGE=gitea/gitea:1.21.0 ``` -3. Actualiza el stack en Portainer +3. Redespiega con Docker Compose 4. Verifica los logs: `docker logs gitea` 5. Prueba que todo funciona correctamente diff --git a/homepage/README.md b/homepage/README.md index 47d8dae..1fa5af5 100644 --- a/homepage/README.md +++ b/homepage/README.md @@ -2,17 +2,14 @@ Stack para desplegar [Homepage](https://gethomepage.dev/) detrás de Traefik como dashboard principal en `www.sherlockhomeless.net`. -## 🚀 Despliegue en Portainer +## 🚀 Despliegue con Docker Compose -1. Ve a **Stacks** → **Add stack** -2. Nombre: `homepage` -3. Selecciona **Repository** o **Git repository** -4. Configura: - - Repository URL: `` - - Repository reference: `main` - - Compose path: `homepage/docker-compose.yml` -5. Copia `homepage/stack.env` a `homepage/.env` y carga `homepage/.env` como archivo de variables de entorno -6. Haz clic en **Deploy the stack** +Asegurate de tener `homepage/.env` configurado y despliega: + +```bash +cd homepage +docker compose --env-file .env up -d +``` ## ⚙️ Variables importantes diff --git a/mail-relay/README.md b/mail-relay/README.md index 8de36fa..3c36682 100644 --- a/mail-relay/README.md +++ b/mail-relay/README.md @@ -23,20 +23,21 @@ printf '%s' 'CAMBIA_ESTA_PASSWORD_SMTP' | sudo tee /opt/mail-relay/secrets/relay sudo chmod 600 /opt/mail-relay/secrets/relayhost_password ``` -### 2. Desplegar desde Portainer +### 2. Configurar `.env` -1. Ve a **Stacks** -> **Add stack** -2. Nombre: `mail-relay` -3. Configura el repositorio Git -4. Compose path: `mail-relay/docker-compose.yml` -5. Copia `mail-relay/stack.env` a `mail-relay/.env` y carga `mail-relay/.env` -6. Ajusta al menos: +Asegurate de tener `mail-relay/.env` configurado. Ajusta al menos: - `MAIL_RELAY_HOSTNAME` - `MAIL_RELAY_ALLOWED_SENDER_DOMAINS` - `MAIL_RELAY_MASQUERADED_DOMAINS` - `MAIL_RELAY_SMARTHOST` - `MAIL_RELAY_SMARTHOST_USERNAME` -7. Deploy del stack + +### 3. Desplegar con Docker Compose + +```bash +cd mail-relay +docker compose --env-file .env up -d +``` ## ⚙️ Variables importantes @@ -134,4 +135,4 @@ docker logs -f mail-relay Errores tipicos: - `Relay access denied`: revisa `MAIL_RELAY_ALLOWED_SENDER_DOMAINS` - Auth fallida con proveedor: revisa usuario/password SMTP -- Rechazo por DNS: valida SPF/DKIM/DMARC \ No newline at end of file +- Rechazo por DNS: valida SPF/DKIM/DMARC diff --git a/media-server/README.md b/media-server/README.md index 07c21f3..66539f4 100644 --- a/media-server/README.md +++ b/media-server/README.md @@ -42,17 +42,14 @@ Este stack despliega un servidor multimedia completo con: 2. **Registros DNS**: Configura los registros A para tus dominios de servicios 3. **Almacenamiento**: Prepara los directorios para medios y configuraciones -### Desde Portainer +### Desde Docker Compose -1. Ve a **Stacks** → **Add stack** -2. Nombre: `media-server` -3. Selecciona **Repository** o **Git repository** -4. Configura: - - Repository URL: `` - - Repository reference: `main` - - Compose path: `media-server/docker-compose.yml` -5. Copia `media-server/stack.env` a `media-server/.env` y carga `media-server/.env` como archivo de variables de entorno -6. Haz clic en **Deploy the stack** +Asegurate de tener `media-server/.env` configurado y despliega: + +```bash +cd media-server +docker compose --env-file .env up -d +``` ### Variables de Entorno Importantes @@ -445,10 +442,10 @@ echo "Backup completado: $BACKUP_DIR" SONARR_IMAGE=lscr.io/linuxserver/sonarr:latest RADARR_IMAGE=lscr.io/linuxserver/radarr:latest ``` -3. Actualiza el stack en Portainer o con Docker Compose: +3. Redespiega con Docker Compose: ```bash - docker compose pull - docker compose up -d + docker compose --env-file .env pull + docker compose --env-file .env up -d ``` 4. Verifica los logs de cada servicio 5. Comprueba que todo funciona correctamente diff --git a/openwebui/README.md b/openwebui/README.md index 5c08b83..fe08083 100644 --- a/openwebui/README.md +++ b/openwebui/README.md @@ -16,8 +16,7 @@ cd cloudflared ```bash mkdir -p /opt/openwebui/data -cp openwebui/stack.env openwebui/.env -# Editar .env: cambiar WEBUI_SECRET_KEY por un valor aleatorio +# Editar openwebui/.env: cambiar WEBUI_SECRET_KEY por un valor aleatorio openssl rand -hex 32 docker compose --env-file openwebui/.env -f openwebui/docker-compose.yml up -d ``` diff --git a/trilium/README.md b/trilium/README.md index 9912631..7124799 100644 --- a/trilium/README.md +++ b/trilium/README.md @@ -18,17 +18,14 @@ Este stack despliega Trilium con: 1. **Red Docker**: Asegúrate de que la red `proxy` existe 2. **Registro DNS**: Configura los registros A para tus dominios Trilium -### Desde Portainer +### Desde Docker Compose -1. Ve a **Stacks** → **Add stack** -2. Nombre: `trilium` -3. Selecciona **Repository** o **Git repository** -4. Configura: - - Repository URL: `` - - Repository reference: `main` - - Compose path: `trilium/docker-compose.yml` -5. Copia `trilium/stack.env` a `trilium/.env` y carga `trilium/.env` como archivo de variables de entorno -6. Haz clic en **Deploy the stack** +Asegurate de tener `trilium/.env` configurado y despliega: + +```bash +cd trilium +docker compose --env-file .env up -d +``` ### Variables de Entorno @@ -355,7 +352,7 @@ Trilium hace backups automáticos: ```env TRILIUM_IMAGE=zadam/trilium:0.63.7 ``` -3. Actualiza el stack en Portainer +3. Redespiega con Docker Compose 4. Verifica los logs: `docker logs trilium` 5. Accede y verifica que todo funciona diff --git a/wireguard/README.md b/wireguard/README.md index cd5a8a4..2a536b0 100644 --- a/wireguard/README.md +++ b/wireguard/README.md @@ -34,17 +34,14 @@ sudo dnf install wireguard-tools # Fedora/RHEL sudo apt install wireguard # Debian/Ubuntu ``` -### Desde Portainer +### Desde Docker Compose -1. Ve a **Stacks** → **Add stack** -2. Nombre: `wireguard` -3. Selecciona **Repository** o **Git repository** -4. Configura: - - Repository URL: `` - - Repository reference: `main` - - Compose path: `wireguard/docker-compose.yml` -5. Copia `wireguard/stack.env` a `wireguard/.env` y carga `wireguard/.env` como archivo de variables de entorno -6. Haz clic en **Deploy the stack** +Asegurate de tener `wireguard/.env` configurado y despliega: + +```bash +cd wireguard +docker compose --env-file .env up -d +``` ### Variables de Entorno @@ -378,7 +375,7 @@ docker restart wg-easy ```env WG_EASY_IMAGE=ghcr.io/wg-easy/wg-easy:latest ``` -3. Actualiza el stack en Portainer +3. Redespiega con Docker Compose 4. Verifica que los clientes siguen conectando ## 📊 Monitoreo