docs: document direct compose workflow

This commit is contained in:
Eduardo David Paredes Vara
2026-07-25 11:20:27 +00:00
parent d64191865b
commit 3b7f2a2fa1
20 changed files with 247 additions and 482 deletions
+2
View File
@@ -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
+11
View File
@@ -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.
+1 -1
View File
@@ -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`
---
+4 -4
View File
@@ -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 <tu-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` |
+2 -4
View File
@@ -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
+108 -302
View File
@@ -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 <repository-url>
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 <servicio>
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: `<tu-repositorio>`
- 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: `<tu-repositorio>`
- 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 <servicio>
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: `<tu-repositorio>`
- Reference: `main` (o tu rama)
- Compose path: `<stack-name>/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 <servicio>
docker compose --env-file .env down
```
## 📦 Stacks Disponibles
Usa `docker compose --env-file .env -f <ruta>/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 <servicio>
docker compose --env-file .env logs -f
```
### Reiniciar un Stack
Desde Portainer UI o:
```bash
cd <stack-folder>
docker compose restart
```
### Eliminar un Stack
Validar un compose:
```bash
cd <stack-folder>
docker compose down
# Para eliminar también volúmenes:
docker compose down -v
cd <servicio>
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 <dominio>`
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 <servicio>/.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=<stack>`).
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 <stack> DEPRECATED-<stack>` (preserva historial).
+11 -16
View File
@@ -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: `<tu-repositorio>`
- 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.
+8 -11
View File
@@ -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: `<tu-repositorio>`
- 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
+23 -25
View File
@@ -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: `<tu-repositorio>`
- 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
```
+7 -10
View File
@@ -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: `<tu-repositorio>`
- 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
+2 -4
View File
@@ -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 |
+8 -27
View File
@@ -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: `<tu-repositorio>`
- 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).
+7 -10
View File
@@ -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: `<tu-repositorio>`
- 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
+9 -12
View File
@@ -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: `<tu-repositorio>`
- 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
+7 -10
View File
@@ -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: `<tu-repositorio>`
- 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
+10 -9
View File
@@ -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
- Rechazo por DNS: valida SPF/DKIM/DMARC
+10 -13
View File
@@ -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: `<tu-repositorio>`
- 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
+1 -2
View File
@@ -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
```
+8 -11
View File
@@ -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: `<tu-repositorio>`
- 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
+8 -11
View File
@@ -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: `<tu-repositorio>`
- 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