5e220591e7
- .gitignore: añadir reglas para .env, *.live.yaml, .codex, .vscode, certs - README.md y COOLIFY-TEMPLATE.md: actualizados con nuevos stacks - NUEVA-APP.md: guía para añadir nuevas apps al homelab - PROMPT-SSO-ISSUE.md: contexto de debugging SSO/Authentik - .github/copilot-instructions.md: instrucciones de arquitectura para Copilot - docker-compose.yml raíz: ajustes al stack de Portainer Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
4.7 KiB
4.7 KiB
Instrucciones para Copilot
Comandos de build, test y lint
- Este repositorio no tiene un build, lint o suite de tests centralizados; la validacion principal se hace con
docker compose configpor stack. - Validar el stack raiz de Portainer:
docker compose -f docker-compose.yml config - Validar la variante inicial de bootstrap por 9443:
docker compose -f docker-compose.yml -f docker-compose.9443.yml config - Levantar el bootstrap inicial de Portainer:
docker compose -f docker-compose.yml -f docker-compose.9443.yml up -d - Validar un stack individual usando su plantilla versionada de variables:
docker compose --env-file <stack>/stack.env -f <stack>/docker-compose.yml config - Levantar un stack individual en local con su plantilla de variables:
docker compose --env-file <stack>/stack.env -f <stack>/docker-compose.yml up -d - Los unicos scripts ejecutables del repo estan en
n8n-observability/:- Validar la sintaxis de un script:
bash -n n8n-observability/scripts/server-summary.sh - Ejecutar un script:
./n8n-observability/scripts/server-summary.sh - Ejecutar el digest de logs para una ventana concreta:
SINCE="24 hours ago" ./n8n-observability/scripts/log-digest.sh
- Validar la sintaxis de un script:
Arquitectura de alto nivel
- El repositorio agrupa varios stacks Docker Compose pensados para desplegarse desde Portainer. El orden base es: stack raiz de Portainer, despues
Traefik/, luegoauthentik/y despues el resto de stacks de aplicaciones. - El
docker-compose.ymlde la raiz define Portainer detras de Traefik. Separa la UI autenticada del host de API/app movil, protegido con una IP allowlist.docker-compose.9443.ymlno es un stack independiente: es solo un override para anadir el puerto de bootstrap y debe combinarse con el compose raiz. Traefik/es la capa compartida de entrada. Mantiene la red externaproxy, el estado de ACME/Let's Encrypt y la configuracion dinamica basada en ficheros bajo/opt/traefik/dynamic.authentik/es la capa compartida de SSO. Publica el middleware reutilizable de Traefikths-authentik@dockery la ruta del outpost bajo/outpost.goauthentik.io/; los demas stacks consumen ese middleware en vez de redefinir su propia integracion de auth.- Cada carpeta de stack es autocontenida: incluye su propio
docker-compose.yml, una plantillastack.envversionada y, normalmente, un README con notas de despliegue y operacion. - La mayoria de stacks de aplicacion siguen el mismo patron de red: una red bridge privada para trafico app/base de datos/cache, mas la red externa
proxysolo para los servicios publicados por Traefik. mail-relay/es infraestructura compartida para SMTP saliente. Los stacks que necesitan correo se conectan a la redmail_internaly usanmail-relaycomo host SMTP.- Hay integraciones cruzadas deliberadas entre stacks: Gitea incluye un contenedor runner para Actions, Nextcloud monta
/opt/paperless/mediaen solo lectura y Paperless sincroniza su bandeja de entrada desde Nextcloud WebDAV mediantepaperless-inbox-sync.
Convenciones clave
stack.enves la plantilla versionada de configuracion de cada stack. La documentacion de despliegue indica de forma consistente copiarstack.enva.envo cargarlo directamente como archivo de entorno; al anadir variables nuevas, actualizastack.envy respeta los nombres ya existentes.- Los datos persistentes del host se guardan en bind mounts bajo
/opt/<stack>/..., no dentro del arbol del repositorio. Las rutas nuevas deben seguir esa convencion. - Los bind mounts usan de forma consistente sufijos de relabel SELinux como
:Z. No los elimines salvo que el stack deje de usar bind mounts del host de forma intencionada. - Los servicios expuestos por HTTP deben unirse a la red
proxyy definir labels de Traefik para router y service, especialmentetraefik.http.services.<name>.loadbalancer.server.port. - Los servicios solo internos se mantienen fuera de
proxyy normalmente no llevan labels de Traefik. Solo anademail_internalcuando el servicio necesite llegar al relay SMTP. - El nombre del middleware compartido de Authentik es
ths-authentik@docker. Reutilizalo desde las labels de los routers en vez de crear variantes por stack, salvo que el stack necesite un comportamiento distinto de verdad. - El stack raiz de Portainer mantiene de forma intencionada routers de Traefik separados para la UI, el acceso directo a la API y dominios adicionales. Conserva esa separacion cuando cambies el enrutado raiz.
- La documentacion del repositorio esta mayoritariamente en espanol. Mantén ese estilo al editar READMEs o documentacion de servicios.
- Cuando cambies un stack, lee siempre su README junto con
docker-compose.ymlystack.env; muchos README contienen restricciones operativas que no se deducen solo del compose.