@saulwade/swl-ses 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CLAUDE.md +238 -0
- package/README.md +560 -0
- package/_userland/agentes/.gitkeep +0 -0
- package/_userland/habilidades/.gitkeep +0 -0
- package/agentes/.evolved.json +9 -0
- package/agentes/accesibilidad-wcag-swl.md +692 -0
- package/agentes/arquitecto-swl.md +238 -0
- package/agentes/auto-evolucion-swl.md +854 -0
- package/agentes/backend-api-swl.md +470 -0
- package/agentes/backend-csharp-swl.md +418 -0
- package/agentes/backend-go-swl.md +388 -0
- package/agentes/backend-java-swl.md +279 -0
- package/agentes/backend-node-swl.md +477 -0
- package/agentes/backend-python-swl.md +608 -0
- package/agentes/backend-rust-swl.md +362 -0
- package/agentes/backend-workers-swl.md +480 -0
- package/agentes/cloud-infra-swl.md +485 -0
- package/agentes/consolidador-swl.md +539 -0
- package/agentes/datos-swl.md +584 -0
- package/agentes/depurador-swl.md +349 -0
- package/agentes/devops-ci-swl.md +374 -0
- package/agentes/disenador-ui-swl.md +558 -0
- package/agentes/documentador-swl.md +343 -0
- package/agentes/evals/arquitecto-swl.evals.json +56 -0
- package/agentes/evals/auto-evolucion-swl.evals.json +68 -0
- package/agentes/evals/implementador-swl.evals.json +56 -0
- package/agentes/evals/orquestador-swl.evals.json +60 -0
- package/agentes/evals/perfilador-usuario-swl.evals.json +60 -0
- package/agentes/evals/red-team-swl.evals.json +59 -0
- package/agentes/evals/revisor-codigo-swl.evals.json +59 -0
- package/agentes/frontend-angular-swl.md +627 -0
- package/agentes/frontend-css-swl.md +720 -0
- package/agentes/frontend-react-swl.md +696 -0
- package/agentes/frontend-swl.md +500 -0
- package/agentes/frontend-tailwind-swl.md +830 -0
- package/agentes/implementador-swl.md +328 -0
- package/agentes/investigador-swl.md +430 -0
- package/agentes/investigador-ux-swl.md +500 -0
- package/agentes/llm-apps-swl.md +276 -0
- package/agentes/migrador-swl.md +417 -0
- package/agentes/mobile-android-swl.md +509 -0
- package/agentes/mobile-cross-swl.md +539 -0
- package/agentes/mobile-ios-swl.md +500 -0
- package/agentes/mobile-testing-swl.md +300 -0
- package/agentes/notificador-swl.md +916 -0
- package/agentes/observabilidad-swl.md +436 -0
- package/agentes/orquestador-swl.md +884 -0
- package/agentes/pagos-swl.md +283 -0
- package/agentes/perfilador-usuario-swl.md +306 -0
- package/agentes/planificador-swl.md +402 -0
- package/agentes/producto-prd-swl.md +587 -0
- package/agentes/red-team-swl.md +216 -0
- package/agentes/release-manager-swl.md +568 -0
- package/agentes/rendimiento-swl.md +714 -0
- package/agentes/resolutor-build-swl.md +243 -0
- package/agentes/revisor-angular-swl.md +276 -0
- package/agentes/revisor-codigo-swl.md +348 -0
- package/agentes/revisor-csharp-swl.md +262 -0
- package/agentes/revisor-go-swl.md +257 -0
- package/agentes/revisor-java-swl.md +255 -0
- package/agentes/revisor-kotlin-swl.md +271 -0
- package/agentes/revisor-nextjs-swl.md +279 -0
- package/agentes/revisor-php-swl.md +269 -0
- package/agentes/revisor-react-swl.md +276 -0
- package/agentes/revisor-rust-swl.md +344 -0
- package/agentes/revisor-seguridad-swl.md +390 -0
- package/agentes/revisor-swift-swl.md +266 -0
- package/agentes/revisor-typescript-swl.md +344 -0
- package/agentes/sre-swl.md +265 -0
- package/agentes/tdd-qa-swl.md +354 -0
- package/agentes/ux-disenador-swl.md +501 -0
- package/bin/lib/bot-comandos.js +1030 -0
- package/bin/lib/bot-discovery.js +182 -0
- package/bin/lib/bot-git.js +142 -0
- package/bin/swl-ses.js +325 -0
- package/bin/swl-telegram-bot.js +442 -0
- package/bin/swl-telegram-bot.plist +21 -0
- package/bin/swl-telegram-bot.service +14 -0
- package/comandos/swl/.evolved.json +23 -0
- package/comandos/swl/actualizar.md +174 -0
- package/comandos/swl/adoptar-proyecto.md +207 -0
- package/comandos/swl/aprender.md +701 -0
- package/comandos/swl/auditar-deps.md +134 -0
- package/comandos/swl/autoresearch.md +170 -0
- package/comandos/swl/ayuda.md +224 -0
- package/comandos/swl/brainstorm.md +50 -0
- package/comandos/swl/checkpoint.md +330 -0
- package/comandos/swl/compactar.md +283 -0
- package/comandos/swl/configurar-ci.md +227 -0
- package/comandos/swl/contexto.md +112 -0
- package/comandos/swl/contribuir.md +233 -0
- package/comandos/swl/crear-skill.md +292 -0
- package/comandos/swl/cron.md +196 -0
- package/comandos/swl/dashboard.md +146 -0
- package/comandos/swl/discutir-fase.md +230 -0
- package/comandos/swl/ejecutar-fase.md +135 -0
- package/comandos/swl/evaluar-skill.md +487 -0
- package/comandos/swl/evolucion-estado.md +142 -0
- package/comandos/swl/evolucionar.md +259 -0
- package/comandos/swl/exportar-vault.md +189 -0
- package/comandos/swl/gateway.md +158 -0
- package/comandos/swl/inbox.md +116 -0
- package/comandos/swl/instalar.md +220 -0
- package/comandos/swl/instintos.md +86 -0
- package/comandos/swl/mapear-codebase.md +312 -0
- package/comandos/swl/mcp-status.md +175 -0
- package/comandos/swl/metricas.md +270 -0
- package/comandos/swl/modelo.md +102 -0
- package/comandos/swl/notificaciones.md +396 -0
- package/comandos/swl/nuevo-proyecto.md +154 -0
- package/comandos/swl/planear-fase.md +221 -0
- package/comandos/swl/plugins.md +256 -0
- package/comandos/swl/reflect-skills.md +125 -0
- package/comandos/swl/release.md +217 -0
- package/comandos/swl/revisar-impacto.md +206 -0
- package/comandos/swl/revisar.md +330 -0
- package/comandos/swl/salud.md +363 -0
- package/comandos/swl/sesiones.md +200 -0
- package/comandos/swl/skill-search.md +113 -0
- package/comandos/swl/verificar.md +585 -0
- package/comandos/swl/wiki.md +620 -0
- package/contextos/dev.md +32 -0
- package/contextos/research.md +30 -0
- package/contextos/review.md +31 -0
- package/habilidades/accesibilidad-a11y/SKILL.md +201 -0
- package/habilidades/accesibilidad-a11y/evals/evals.json +56 -0
- package/habilidades/accesibilidad-a11y/recursos/ejemplos-y-checklist-completo.md +441 -0
- package/habilidades/agent-browser/SKILL.md +218 -0
- package/habilidades/agentes-como-servicio/SKILL.md +218 -0
- package/habilidades/ai-runtime-security/SKILL.md +273 -0
- package/habilidades/angular-avanzado/SKILL.md +164 -0
- package/habilidades/angular-avanzado/recursos/ejemplos-avanzados.md +219 -0
- package/habilidades/angular-moderno/SKILL.md +186 -0
- package/habilidades/angular-moderno/evals/evals.json +45 -0
- package/habilidades/angular-moderno/recursos/ejemplos-avanzados.md +106 -0
- package/habilidades/api-rest-diseno/SKILL.md +191 -0
- package/habilidades/api-rest-diseno/recursos/openapi-template.yaml +506 -0
- package/habilidades/api-rest-diseno/recursos/referencia-api.md +140 -0
- package/habilidades/aprendizaje-continuo/SKILL.md +151 -0
- package/habilidades/aprendizaje-continuo/evals/evals.json +53 -0
- package/habilidades/aprendizaje-continuo/recursos/referencia-instintos.md +290 -0
- package/habilidades/async-python/SKILL.md +149 -0
- package/habilidades/async-python/evals/evals.json +47 -0
- package/habilidades/async-python/recursos/patrones-y-ejemplos-completos.md +292 -0
- package/habilidades/auth-patrones/.evolved.json +9 -0
- package/habilidades/auth-patrones/SKILL.md +413 -0
- package/habilidades/auth-patrones/recursos/implementaciones-completas.md +229 -0
- package/habilidades/auto-evolucion-protocolo/SKILL.md +276 -0
- package/habilidades/auto-evolucion-protocolo/evals/evals.json +55 -0
- package/habilidades/auto-evolucion-protocolo/recursos/referencia-completa.md +145 -0
- package/habilidades/autoresearch/SKILL.md +268 -0
- package/habilidades/autoresearch/evals/evals.json +41 -0
- package/habilidades/autoresearch/recursos/checklist-template.md +191 -0
- package/habilidades/autoresearch/scripts/calcular-score.js +88 -0
- package/habilidades/azure-cloud/SKILL.md +308 -0
- package/habilidades/azure-cloud/recursos/aks.md +327 -0
- package/habilidades/backend-mcp-servidor/SKILL.md +270 -0
- package/habilidades/backend-production-resilience/SKILL.md +288 -0
- package/habilidades/brainstorming/SKILL.md +295 -0
- package/habilidades/brainstorming/recursos/componentes-html.md +247 -0
- package/habilidades/build-errors-cpp/SKILL.md +270 -0
- package/habilidades/build-errors-csharp/SKILL.md +265 -0
- package/habilidades/build-errors-go/SKILL.md +306 -0
- package/habilidades/build-errors-java/SKILL.md +278 -0
- package/habilidades/build-errors-kotlin/SKILL.md +303 -0
- package/habilidades/build-errors-nextjs/SKILL.md +312 -0
- package/habilidades/build-errors-php/SKILL.md +270 -0
- package/habilidades/build-errors-python/SKILL.md +292 -0
- package/habilidades/build-errors-rust/SKILL.md +284 -0
- package/habilidades/build-errors-swift/SKILL.md +272 -0
- package/habilidades/build-errors-typescript/SKILL.md +369 -0
- package/habilidades/checklist-calidad/SKILL.md +271 -0
- package/habilidades/checklist-calidad/recursos/quality-report-template.md +148 -0
- package/habilidades/checklist-seguridad/SKILL.md +285 -0
- package/habilidades/checkpoints-verificacion/SKILL.md +298 -0
- package/habilidades/checkpoints-verificacion/recursos/checkpoint-templates.md +360 -0
- package/habilidades/ci-cd-pipelines/SKILL.md +157 -0
- package/habilidades/ci-cd-pipelines/recursos/github-actions-template.yaml +403 -0
- package/habilidades/ci-cd-pipelines/recursos/pipelines-completos.md +487 -0
- package/habilidades/cloud-aws/SKILL.md +142 -0
- package/habilidades/cloud-aws/recursos/servicios-aws-referencia.md +321 -0
- package/habilidades/compactacion-contexto/SKILL.md +247 -0
- package/habilidades/contenedores-docker/SKILL.md +137 -0
- package/habilidades/contenedores-docker/recursos/dockerfile-template.dockerfile +160 -0
- package/habilidades/contenedores-docker/recursos/ejemplos-y-configuraciones.md +327 -0
- package/habilidades/context-builder/SKILL.md +170 -0
- package/habilidades/control-profundidad/SKILL.md +128 -0
- package/habilidades/csharp-experto/SKILL.md +322 -0
- package/habilidades/csharp-patrones/SKILL.md +316 -0
- package/habilidades/csharp-testing/SKILL.md +286 -0
- package/habilidades/css-moderno/SKILL.md +166 -0
- package/habilidades/css-moderno/evals/evals.json +43 -0
- package/habilidades/css-moderno/recursos/ejemplos-y-patrones-completos.md +337 -0
- package/habilidades/datos-etl/SKILL.md +129 -0
- package/habilidades/datos-etl/recursos/implementaciones-completas.md +322 -0
- package/habilidades/dbml-experto/SKILL.md +339 -0
- package/habilidades/dbml-experto/evals/evals.json +56 -0
- package/habilidades/dependencias-auditoria/SKILL.md +320 -0
- package/habilidades/deprecacion-migracion/SKILL.md +169 -0
- package/habilidades/deprecacion-migracion/recursos/implementaciones-completas.md +220 -0
- package/habilidades/design-tokens/SKILL.md +158 -0
- package/habilidades/design-tokens/recursos/tokens-y-configuracion.md +363 -0
- package/habilidades/devsecops-pipeline-security/SKILL.md +309 -0
- package/habilidades/diagrama-arquitectura/SKILL.md +165 -0
- package/habilidades/diagrama-arquitectura/assets/template.html +276 -0
- package/habilidades/discutir-fase/SKILL.md +188 -0
- package/habilidades/diseno-herramientas-agente/SKILL.md +199 -0
- package/habilidades/diseno-responsivo/SKILL.md +186 -0
- package/habilidades/diseno-responsivo/recursos/ejemplos-layouts.md +156 -0
- package/habilidades/django-experto/SKILL.md +205 -0
- package/habilidades/django-experto/recursos/async-django.md +390 -0
- package/habilidades/django-experto/recursos/drf-patrones.md +438 -0
- package/habilidades/django-experto/recursos/orm-avanzado.md +382 -0
- package/habilidades/django-experto/recursos/referencia-completa.md +188 -0
- package/habilidades/django-experto/recursos/testing-django.md +415 -0
- package/habilidades/doc-sync/SKILL.md +280 -0
- package/habilidades/drift-detection/SKILL.md +179 -0
- package/habilidades/ejecutar-fase/SKILL.md +468 -0
- package/habilidades/estilo-sin-ai-isms/SKILL.md +775 -0
- package/habilidades/estilo-sin-ai-isms/evals/evals.json +63 -0
- package/habilidades/estilo-sin-ai-isms/scripts/detectar_aiisms.py +500 -0
- package/habilidades/estructura-proyecto-claude/SKILL.md +215 -0
- package/habilidades/estructura-proyecto-claude/recursos/claude-md-template.md +261 -0
- package/habilidades/estructura-proyecto-claude/recursos/configuracion-y-extensiones.md +176 -0
- package/habilidades/estructura-proyecto-claude/recursos/frontmatter-y-hooks-referencia.md +289 -0
- package/habilidades/estructura-proyecto-claude/recursos/mcp-json-template.json +77 -0
- package/habilidades/estructura-proyecto-claude/recursos/variantes-por-stack.md +177 -0
- package/habilidades/evaluacion-agentes/SKILL.md +314 -0
- package/habilidades/event-driven/SKILL.md +153 -0
- package/habilidades/event-driven/recursos/implementaciones-completas.md +423 -0
- package/habilidades/extraccion-documentos/SKILL.md +221 -0
- package/habilidades/extractor-de-aprendizajes/.evolved.json +9 -0
- package/habilidades/extractor-de-aprendizajes/SKILL.md +311 -0
- package/habilidades/extractor-de-aprendizajes/evals/evals.json +55 -0
- package/habilidades/fastapi-experto/SKILL.md +221 -0
- package/habilidades/fastapi-experto/recursos/async-patterns.md +438 -0
- package/habilidades/fastapi-experto/recursos/dependency-injection.md +330 -0
- package/habilidades/fastapi-experto/recursos/referencia-completa.md +79 -0
- package/habilidades/fastapi-experto/recursos/testing-httpx.md +420 -0
- package/habilidades/filament-admin/SKILL.md +290 -0
- package/habilidades/frontend-avanzado/SKILL.md +257 -0
- package/habilidades/frontend-avanzado/recursos/apis-nativas-ejemplos.md +341 -0
- package/habilidades/gcp-cloud/SKILL.md +260 -0
- package/habilidades/gcp-cloud/recursos/gke.md +234 -0
- package/habilidades/gcp-cloud/recursos/terraform-gcp.md +307 -0
- package/habilidades/generacion-mermaid/SKILL.md +229 -0
- package/habilidades/git-worktrees-paralelo/SKILL.md +270 -0
- package/habilidades/go-experto/SKILL.md +305 -0
- package/habilidades/go-patrones/SKILL.md +299 -0
- package/habilidades/go-testing/SKILL.md +291 -0
- package/habilidades/graphql-experto/SKILL.md +323 -0
- package/habilidades/guardrail-semantico/SKILL.md +282 -0
- package/habilidades/harness-claude-code/SKILL.md +299 -0
- package/habilidades/iam-secretos/SKILL.md +265 -0
- package/habilidades/iam-secretos/recursos/implementaciones-completas.md +356 -0
- package/habilidades/infra-github-actions/SKILL.md +166 -0
- package/habilidades/instalar-sistema/.evolved.json +9 -0
- package/habilidades/instalar-sistema/SKILL.md +221 -0
- package/habilidades/java-experto/SKILL.md +290 -0
- package/habilidades/java-patrones/SKILL.md +275 -0
- package/habilidades/java-testing/SKILL.md +288 -0
- package/habilidades/kotlin-compose/SKILL.md +278 -0
- package/habilidades/kotlin-compose/recursos/animaciones-performance.md +93 -0
- package/habilidades/kotlin-experto/SKILL.md +318 -0
- package/habilidades/kotlin-testing/SKILL.md +267 -0
- package/habilidades/kotlin-testing/recursos/testing-avanzado.md +74 -0
- package/habilidades/kubernetes-orquestacion/SKILL.md +152 -0
- package/habilidades/kubernetes-orquestacion/recursos/manifiestos-completos.md +452 -0
- package/habilidades/langchain-langraph/SKILL.md +386 -0
- package/habilidades/langchain-langraph/recursos/evaluacion-rag.md +321 -0
- package/habilidades/langchain-langraph/recursos/rag-maturity-model.md +225 -0
- package/habilidades/langchain-langraph/recursos/vectorstores.md +306 -0
- package/habilidades/legacy-code-rescue/SKILL.md +267 -0
- package/habilidades/likec4-experto/SKILL.md +412 -0
- package/habilidades/likec4-experto/evals/evals.json +69 -0
- package/habilidades/manejo-errores/.evolved.json +9 -0
- package/habilidades/manejo-errores/SKILL.md +407 -0
- package/habilidades/manejo-errores/recursos/implementaciones-completas.md +248 -0
- package/habilidades/mapear-codebase/SKILL.md +275 -0
- package/habilidades/memoria-busqueda/SKILL.md +194 -0
- package/habilidades/memoria-busqueda/evals/evals.json +44 -0
- package/habilidades/meta-skills-estandar/SKILL.md +298 -0
- package/habilidades/meta-skills-estandar/recursos/anti-patrones-y-leyes.md +205 -0
- package/habilidades/meta-skills-estandar/recursos/frameworks-seguridad.md +107 -0
- package/habilidades/meta-skills-estandar/recursos/idiomas-framework.md +60 -0
- package/habilidades/meta-skills-estandar/recursos/skills-as-agents.md +163 -0
- package/habilidades/microservicios/SKILL.md +155 -0
- package/habilidades/microservicios/recursos/patrones-y-ejemplos-completos.md +325 -0
- package/habilidades/mobile-flutter/SKILL.md +199 -0
- package/habilidades/mobile-flutter/recursos/ejemplos-completos.md +319 -0
- package/habilidades/mobile-react-native/SKILL.md +176 -0
- package/habilidades/mobile-react-native/recursos/ejemplos-completos.md +216 -0
- package/habilidades/mongodb-experto/SKILL.md +302 -0
- package/habilidades/monitoring-alertas/SKILL.md +201 -0
- package/habilidades/monitoring-alertas/recursos/instrumentacion-y-alertas.md +301 -0
- package/habilidades/nestjs-experto/SKILL.md +307 -0
- package/habilidades/nestjs-experto/recursos/guards-interceptors.md +339 -0
- package/habilidades/nestjs-experto/recursos/modulos-di.md +287 -0
- package/habilidades/nestjs-experto/recursos/testing-nestjs.md +354 -0
- package/habilidades/nextjs-experto/SKILL.md +335 -0
- package/habilidades/nextjs-patrones/SKILL.md +303 -0
- package/habilidades/nextjs-testing/SKILL.md +331 -0
- package/habilidades/node-experto/.evolved.json +9 -0
- package/habilidades/node-experto/SKILL.md +266 -0
- package/habilidades/node-experto/recursos/patrones-completos.md +283 -0
- package/habilidades/notificaciones-multicanal/SKILL.md +159 -0
- package/habilidades/notificaciones-multicanal/recursos/config-template.json +115 -0
- package/habilidades/notificaciones-multicanal/recursos/configuracion-y-templates.md +303 -0
- package/habilidades/nuevo-proyecto/SKILL.md +204 -0
- package/habilidades/orquestacion-async/SKILL.md +303 -0
- package/habilidades/paid-media-tracking/SKILL.md +269 -0
- package/habilidades/paid-media-tracking/recursos/auditoria-tracking.md +220 -0
- package/habilidades/paid-media-tracking/recursos/google-ads-api.md +215 -0
- package/habilidades/patrones-python/SKILL.md +228 -0
- package/habilidades/patrones-python/evals/evals.json +56 -0
- package/habilidades/patrones-python/recursos/patrones-avanzados.md +469 -0
- package/habilidades/patrones-python/recursos/referencia-completa.md +202 -0
- package/habilidades/perfil-usuario/SKILL.md +200 -0
- package/habilidades/perfil-usuario/evals/evals.json +55 -0
- package/habilidades/performance-baseline/SKILL.md +297 -0
- package/habilidades/php-experto/SKILL.md +291 -0
- package/habilidades/php-patrones/SKILL.md +306 -0
- package/habilidades/php-testing/SKILL.md +280 -0
- package/habilidades/planear-fase/SKILL.md +269 -0
- package/habilidades/postgresql-experto/SKILL.md +151 -0
- package/habilidades/postgresql-experto/evals/evals.json +53 -0
- package/habilidades/postgresql-experto/recursos/referencia-completa.md +215 -0
- package/habilidades/prevencion-racionalizacion/SKILL.md +175 -0
- package/habilidades/prevencion-sobreingenieria/SKILL.md +323 -0
- package/habilidades/privacy-memoria/SKILL.md +141 -0
- package/habilidades/privacy-memoria/evals/evals.json +43 -0
- package/habilidades/prompt-engineering/SKILL.md +518 -0
- package/habilidades/prompt-engineering/recursos/patrones-avanzados.md +467 -0
- package/habilidades/rag-arquitectura/SKILL.md +338 -0
- package/habilidades/rails-experto/SKILL.md +237 -0
- package/habilidades/rails-experto/recursos/active-record.md +260 -0
- package/habilidades/rails-experto/recursos/hotwire-turbo.md +293 -0
- package/habilidades/rails-experto/recursos/testing-rspec.md +362 -0
- package/habilidades/react-experto/SKILL.md +209 -0
- package/habilidades/react-experto/evals/evals.json +55 -0
- package/habilidades/react-experto/recursos/patrones-y-ejemplos-completos.md +240 -0
- package/habilidades/react-optimizacion/SKILL.md +174 -0
- package/habilidades/react-optimizacion/recursos/patrones-avanzados.md +138 -0
- package/habilidades/redis-experto/SKILL.md +305 -0
- package/habilidades/release-semver/.evolved.json +9 -0
- package/habilidades/release-semver/SKILL.md +248 -0
- package/habilidades/release-semver/scripts/generar-changelog.sh +238 -0
- package/habilidades/rust-experto/SKILL.md +400 -0
- package/habilidades/rust-patrones/SKILL.md +296 -0
- package/habilidades/rust-testing/SKILL.md +311 -0
- package/habilidades/seguridad-skills-ia/SKILL.md +262 -0
- package/habilidades/sql-optimizacion/SKILL.md +200 -0
- package/habilidades/sql-optimizacion/evals/evals.json +54 -0
- package/habilidades/sql-optimizacion/recursos/patrones-sql-avanzados.md +131 -0
- package/habilidades/sre-patrones/SKILL.md +333 -0
- package/habilidades/sre-patrones/recursos/chaos-engineering.md +241 -0
- package/habilidades/sre-patrones/recursos/oncall-design.md +236 -0
- package/habilidades/stripe-pagos/SKILL.md +550 -0
- package/habilidades/stripe-pagos/recursos/errores-reintentos.md +390 -0
- package/habilidades/stripe-pagos/recursos/stripe-connect.md +290 -0
- package/habilidades/structured-outputs/SKILL.md +343 -0
- package/habilidades/swift-experto/SKILL.md +320 -0
- package/habilidades/swift-experto/recursos/keychain-y-wrappers.md +110 -0
- package/habilidades/swift-patrones/SKILL.md +313 -0
- package/habilidades/swift-patrones/recursos/tca-ejemplo-completo.md +113 -0
- package/habilidades/swift-testing/SKILL.md +254 -0
- package/habilidades/swift-testing/recursos/xcuitest-planes.md +143 -0
- package/habilidades/swl-dashboard/SKILL.md +370 -0
- package/habilidades/swl-markitdown/SKILL.md +285 -0
- package/habilidades/swl-markitdown/evals/evals.json +52 -0
- package/habilidades/swl-revisar-impacto/SKILL.md +233 -0
- package/habilidades/tailwind-experto/SKILL.md +240 -0
- package/habilidades/tailwind-experto/recursos/referencia-completa.md +184 -0
- package/habilidades/tdd-workflow/SKILL.md +293 -0
- package/habilidades/terraform-experto/SKILL.md +321 -0
- package/habilidades/testing-python/SKILL.md +340 -0
- package/habilidades/testing-python/recursos/ejemplos-completos.md +167 -0
- package/habilidades/threat-model-lite/SKILL.md +246 -0
- package/habilidades/tracing-processor/SKILL.md +212 -0
- package/habilidades/tracking-measurement/SKILL.md +239 -0
- package/habilidades/tracking-measurement/recursos/consent-mode.md +231 -0
- package/habilidades/tracking-measurement/recursos/gtm-datalayer.md +216 -0
- package/habilidades/tracking-measurement/recursos/meta-capi.md +262 -0
- package/habilidades/typescript-avanzado/SKILL.md +144 -0
- package/habilidades/typescript-avanzado/evals/evals.json +55 -0
- package/habilidades/typescript-avanzado/recursos/patrones-y-ejemplos-completos.md +298 -0
- package/habilidades/typescript-diagnosticos/SKILL.md +513 -0
- package/habilidades/ux-diseno/SKILL.md +116 -0
- package/habilidades/ux-diseno/evals/evals.json +43 -0
- package/habilidades/ux-diseno/recursos/patrones-ux-referencia.md +214 -0
- package/habilidades/validacion-ci-sistema/SKILL.md +136 -0
- package/habilidades/validacion-ci-sistema/recursos/validadores-completos.md +369 -0
- package/habilidades/validacion-ci-sistema/scripts/validar-sistema.sh +286 -0
- package/habilidades/verificacion-evidencia/SKILL.md +160 -0
- package/habilidades/verificar-trabajo/SKILL.md +303 -0
- package/habilidades/verificar-trabajo/recursos/plantilla-verificacion.md +60 -0
- package/habilidades/wiki-conocimiento/SKILL.md +276 -0
- package/habilidades/wireframes-flujos/SKILL.md +212 -0
- package/habilidades/wireframes-flujos/recursos/referencia-completa.md +192 -0
- package/habilidades/workflow-claude-code/SKILL.md +260 -0
- package/habilidades/workflow-claude-code/recursos/referencia-completa.md +109 -0
- package/hooks/_run-hook.sh +57 -0
- package/hooks/actualizar-perfil-usuario.js +364 -0
- package/hooks/agente-lifecycle.js +71 -0
- package/hooks/aiisms-detector.js +173 -0
- package/hooks/audit-trail.js +204 -0
- package/hooks/auto-background.js +97 -0
- package/hooks/auto-consolidacion.js +178 -0
- package/hooks/auto-evolucion.js +666 -0
- package/hooks/auto-restaurar-settings.js +360 -0
- package/hooks/calidad-pre-commit.js +929 -0
- package/hooks/calidad-typescript.js +511 -0
- package/hooks/captura-feedback-usuario.js +148 -0
- package/hooks/check-update.js +211 -0
- package/hooks/clasificador-mensajes.js +271 -0
- package/hooks/degradacion-instintos.js +272 -0
- package/hooks/escaneo-secretos.js +389 -0
- package/hooks/extraccion-aprendizajes.js +763 -0
- package/hooks/grafo-contexto.js +129 -0
- package/hooks/graph-update.js +67 -0
- package/hooks/guardrail-modelo.js +247 -0
- package/hooks/inbox-aviso.js +75 -0
- package/hooks/inyeccion-contexto.js +246 -0
- package/hooks/lib/abort-registry.js +214 -0
- package/hooks/lib/agent-backend.js +210 -0
- package/hooks/lib/agent-comms.js +263 -0
- package/hooks/lib/agent-issue-codes.js +284 -0
- package/hooks/lib/agent-matcher.js +189 -0
- package/hooks/lib/async-hook-registry.js +252 -0
- package/hooks/lib/atomic-write.js +130 -0
- package/hooks/lib/auto-consolidator.js +335 -0
- package/hooks/lib/canary-skills.js +187 -0
- package/hooks/lib/consolidation-lock.js +291 -0
- package/hooks/lib/context-builder.js +430 -0
- package/hooks/lib/context-compressor.js +657 -0
- package/hooks/lib/convergence-detector.js +105 -0
- package/hooks/lib/delegation-tracker.js +198 -0
- package/hooks/lib/detectar-package-manager.js +423 -0
- package/hooks/lib/edit-accumulator.js +171 -0
- package/hooks/lib/error-classifier.js +308 -0
- package/hooks/lib/event-bus.js +112 -0
- package/hooks/lib/evolution-tracker.js +442 -0
- package/hooks/lib/execution-state.js +316 -0
- package/hooks/lib/fingerprint-id.js +135 -0
- package/hooks/lib/gateway-notify.js +116 -0
- package/hooks/lib/graph-security.js +75 -0
- package/hooks/lib/guardrail-metrics.js +202 -0
- package/hooks/lib/hook-circuit-breaker.js +206 -0
- package/hooks/lib/loop-detector.js +267 -0
- package/hooks/lib/mcp-health.js +184 -0
- package/hooks/lib/mcp-pool.js +436 -0
- package/hooks/lib/memory-search.js +506 -0
- package/hooks/lib/merkle-audit.js +96 -0
- package/hooks/lib/model-router.js +222 -0
- package/hooks/lib/normalize-error.js +324 -0
- package/hooks/lib/normalize-input.js +65 -0
- package/hooks/lib/nudge-tracker.js +306 -0
- package/hooks/lib/otlp-exporter.js +365 -0
- package/hooks/lib/performance-marks.js +239 -0
- package/hooks/lib/privacy-filter.js +128 -0
- package/hooks/lib/prompt-injection-scanner.js +209 -0
- package/hooks/lib/provenance-tracker.js +183 -0
- package/hooks/lib/rate-limit-tracker.js +253 -0
- package/hooks/lib/reflect-classifier.js +164 -0
- package/hooks/lib/resource-quota.js +122 -0
- package/hooks/lib/retry-jitter.js +165 -0
- package/hooks/lib/risk-engine.js +368 -0
- package/hooks/lib/run-log.js +408 -0
- package/hooks/lib/session-fts.js +379 -0
- package/hooks/lib/session-store.js +293 -0
- package/hooks/lib/singleton-guard.js +159 -0
- package/hooks/lib/skill-auditor.js +588 -0
- package/hooks/lib/sync-status.js +228 -0
- package/hooks/lib/taint-tracker.js +107 -0
- package/hooks/lib/task-service.js +295 -0
- package/hooks/lib/tech-skills-map.js +146 -0
- package/hooks/lib/telegram-cliente.js +159 -0
- package/hooks/lib/telegram-config.js +170 -0
- package/hooks/lib/token-budget.js +156 -0
- package/hooks/lib/token-estimator.js +420 -0
- package/hooks/lib/toon-compressor.js +245 -0
- package/hooks/lib/usage-model.js +183 -0
- package/hooks/lib/variable-resolver.js +230 -0
- package/hooks/linea-estado.js +324 -0
- package/hooks/metricas-evolucion.js +209 -0
- package/hooks/monitor-contexto.js +325 -0
- package/hooks/notificacion-sesion-stop.js +198 -0
- package/hooks/notificacion-telegram-notification.js +4 -0
- package/hooks/notificacion-telegram-subagent.js +4 -0
- package/hooks/notificacion-telegram.js +267 -0
- package/hooks/preservar-estado-pre-compact.js +150 -0
- package/hooks/proteccion-rutas.js +366 -0
- package/hooks/registro-turnos.js +209 -0
- package/hooks/resumen-sesion.js +249 -0
- package/hooks/risk-scoring.js +323 -0
- package/hooks/rotar-audit-auto.js +122 -0
- package/hooks/sugerir-regenerar-inventario.js +170 -0
- package/hooks/telemetria-agentes.js +167 -0
- package/hooks/tracking-costos.js +688 -0
- package/instintos/global.yaml +8 -0
- package/instintos/perfil-usuario.yaml +53 -0
- package/instintos/prompt-appendices.yaml +57 -0
- package/instintos/proyecto.yaml +372 -0
- package/manifiestos/gateway-config.json +77 -0
- package/manifiestos/handoff-context.json +223 -0
- package/manifiestos/hook-profiles.json +44 -0
- package/manifiestos/hooks-config.json +360 -0
- package/manifiestos/modulos.json +1173 -0
- package/manifiestos/perfiles.json +404 -0
- package/package.json +86 -0
- package/plantillas/ESTADO.md +109 -0
- package/plantillas/HOJA-RUTA.md +143 -0
- package/plantillas/PROYECTO.md +122 -0
- package/plantillas/REQUISITOS.md +132 -0
- package/plantillas/auditor-veto-template.md +105 -0
- package/plantillas/github-workflows/README.md +47 -0
- package/plantillas/github-workflows/release-please.yml +44 -0
- package/plantillas/github-workflows/swl-ci.yml +107 -0
- package/plantillas/github-workflows/swl-security.yml +51 -0
- package/plantillas/mcp-mineru.json +13 -0
- package/plantillas/research/ARQUITECTURA.md +220 -0
- package/plantillas/research/FUNCIONALIDADES.md +175 -0
- package/plantillas/research/RESUMEN.md +165 -0
- package/plantillas/research/STACK.md +233 -0
- package/plantillas/research/TRAMPAS.md +299 -0
- package/plantillas/skill-evals-template.json +44 -0
- package/plugin.json +343 -0
- package/reglas/accesibilidad.md +269 -0
- package/reglas/api-diseno.md +400 -0
- package/reglas/arquitectura.md +352 -0
- package/reglas/brevedad-output.md +124 -0
- package/reglas/cloud-infra.md +247 -0
- package/reglas/docs.md +245 -0
- package/reglas/estilo-codigo.md +201 -0
- package/reglas/git-workflow.md +245 -0
- package/reglas/gobernanza.md +271 -0
- package/reglas/harness-claude-code.md +213 -0
- package/reglas/hooks.md +186 -0
- package/reglas/lenguajes/csharp/estilo-codigo.md +231 -0
- package/reglas/lenguajes/csharp/hooks.md +281 -0
- package/reglas/lenguajes/csharp/patrones.md +226 -0
- package/reglas/lenguajes/csharp/seguridad.md +258 -0
- package/reglas/lenguajes/csharp/testing.md +176 -0
- package/reglas/lenguajes/go/estilo-codigo.md +195 -0
- package/reglas/lenguajes/go/hooks.md +249 -0
- package/reglas/lenguajes/go/patrones.md +249 -0
- package/reglas/lenguajes/go/seguridad.md +225 -0
- package/reglas/lenguajes/go/testing.md +272 -0
- package/reglas/lenguajes/java/estilo-codigo.md +217 -0
- package/reglas/lenguajes/java/hooks.md +251 -0
- package/reglas/lenguajes/java/patrones.md +226 -0
- package/reglas/lenguajes/java/seguridad.md +233 -0
- package/reglas/lenguajes/java/testing.md +238 -0
- package/reglas/lenguajes/kotlin/estilo-codigo.md +208 -0
- package/reglas/lenguajes/kotlin/hooks.md +245 -0
- package/reglas/lenguajes/kotlin/patrones.md +201 -0
- package/reglas/lenguajes/kotlin/seguridad.md +202 -0
- package/reglas/lenguajes/kotlin/testing.md +236 -0
- package/reglas/lenguajes/nextjs/estilo-codigo.md +175 -0
- package/reglas/lenguajes/nextjs/hooks.md +186 -0
- package/reglas/lenguajes/nextjs/patrones.md +225 -0
- package/reglas/lenguajes/nextjs/seguridad.md +216 -0
- package/reglas/lenguajes/nextjs/testing.md +193 -0
- package/reglas/lenguajes/php/estilo-codigo.md +228 -0
- package/reglas/lenguajes/php/hooks.md +165 -0
- package/reglas/lenguajes/php/patrones.md +233 -0
- package/reglas/lenguajes/php/seguridad.md +186 -0
- package/reglas/lenguajes/php/testing.md +205 -0
- package/reglas/lenguajes/rust/estilo-codigo.md +207 -0
- package/reglas/lenguajes/rust/hooks.md +240 -0
- package/reglas/lenguajes/rust/patrones.md +250 -0
- package/reglas/lenguajes/rust/seguridad.md +221 -0
- package/reglas/lenguajes/rust/testing.md +194 -0
- package/reglas/lenguajes/swift/estilo-codigo.md +238 -0
- package/reglas/lenguajes/swift/hooks.md +257 -0
- package/reglas/lenguajes/swift/patrones.md +235 -0
- package/reglas/lenguajes/swift/seguridad.md +248 -0
- package/reglas/lenguajes/swift/testing.md +242 -0
- package/reglas/markitdown.md +60 -0
- package/reglas/memoria-consolidada.md +209 -0
- package/reglas/patrones.md +225 -0
- package/reglas/performance.md +195 -0
- package/reglas/pruebas.md +159 -0
- package/reglas/seguridad-agentes.md +351 -0
- package/reglas/seguridad.md +151 -0
- package/reglas/skills-estandar.md +373 -0
- package/reglas/testing.md +193 -0
- package/schemas/agent-contract.json +176 -0
- package/schemas/agent-frontmatter.schema.json +149 -0
- package/schemas/agent-message.schema.json +53 -0
- package/schemas/agent-output-implementacion.schema.json +85 -0
- package/schemas/agent-output-planificacion.schema.json +113 -0
- package/schemas/agent-output-review.schema.json +78 -0
- package/schemas/diary-entry.schema.json +80 -0
- package/schemas/hook-profiles.schema.json +39 -0
- package/schemas/hooks-config.schema.json +74 -0
- package/schemas/instinct.schema.json +115 -0
- package/schemas/modulos.schema.json +29 -0
- package/schemas/perfiles.schema.json +28 -0
- package/schemas/plugin.schema.json +64 -0
- package/schemas/skill-evals.schema.json +95 -0
- package/schemas/skill-frontmatter.schema.json +170 -0
- package/scripts/actualizar.js +145 -0
- package/scripts/audit-skills.sh +78 -0
- package/scripts/auditar-agentes-gaps.js +149 -0
- package/scripts/auditar-cobertura-frameworks.js +241 -0
- package/scripts/auditar-skills-gaps.js +206 -0
- package/scripts/bootstrap-instintos.js +259 -0
- package/scripts/check-update.js +109 -0
- package/scripts/comandos/agents.js +105 -0
- package/scripts/comandos/info.js +108 -0
- package/scripts/comandos/install-asistido.js +186 -0
- package/scripts/comandos/skills.js +211 -0
- package/scripts/configurar-branch-protection.js +418 -0
- package/scripts/daemon-swl.py +388 -0
- package/scripts/desinstalar.js +130 -0
- package/scripts/doctor.js +559 -0
- package/scripts/field-report.js +199 -0
- package/scripts/generar-inventario.js +317 -0
- package/scripts/inbox-tmux-inject.js +161 -0
- package/scripts/inferir-herramientas-permitidas.js +586 -0
- package/scripts/inicializar.js +133 -0
- package/scripts/instalador.js +1031 -0
- package/scripts/instalar-git-hook.js +122 -0
- package/scripts/lib/agp-frontmatter.js +222 -0
- package/scripts/lib/append-con-marcadores.js +199 -0
- package/scripts/lib/artefactos-python.js +43 -0
- package/scripts/lib/audit-query.js +221 -0
- package/scripts/lib/autostart-linux.js +347 -0
- package/scripts/lib/autostart-macos.js +360 -0
- package/scripts/lib/autostart-windows.js +307 -0
- package/scripts/lib/budget-enforcer.js +252 -0
- package/scripts/lib/claude-sessions.js +285 -0
- package/scripts/lib/configurar-ci.js +380 -0
- package/scripts/lib/console-span-exporter.js +92 -0
- package/scripts/lib/contadores-inventario.js +217 -0
- package/scripts/lib/dashboard-widgets.js +290 -0
- package/scripts/lib/detectar-runtime.js +279 -0
- package/scripts/lib/detectar-stack.js +187 -0
- package/scripts/lib/diary-entry.js +234 -0
- package/scripts/lib/drift-detector.js +545 -0
- package/scripts/lib/estado.js +124 -0
- package/scripts/lib/gestor-componentes.js +243 -0
- package/scripts/lib/gitignore-manifest.js +305 -0
- package/scripts/lib/graph-analyze.py +556 -0
- package/scripts/lib/graph-builder.py +485 -0
- package/scripts/lib/graph-cluster.py +259 -0
- package/scripts/lib/health-row.js +168 -0
- package/scripts/lib/hooks-settings.js +789 -0
- package/scripts/lib/manifiestos.js +138 -0
- package/scripts/lib/mc-client.js +137 -0
- package/scripts/lib/notificaciones-telegram.js +1107 -0
- package/scripts/lib/npm-version.js +261 -0
- package/scripts/lib/paquetes-conocidos.js +50 -0
- package/scripts/lib/preservar-usuario.js +586 -0
- package/scripts/lib/prompt-builder.js +264 -0
- package/scripts/lib/resolver-externo.js +332 -0
- package/scripts/lib/schedule-parser.js +305 -0
- package/scripts/lib/scoring-instintos.js +240 -0
- package/scripts/lib/seguridad.js +160 -0
- package/scripts/lib/selector-interactivo.js +152 -0
- package/scripts/lib/semantic-search.js +242 -0
- package/scripts/lib/skill-discovery.js +234 -0
- package/scripts/lib/skill-metrics.js +246 -0
- package/scripts/lib/skill-normalizer.js +112 -0
- package/scripts/lib/skills-hub.js +340 -0
- package/scripts/lib/span-schema.js +134 -0
- package/scripts/lib/tool-cost-analyzer.js +255 -0
- package/scripts/lib/tracing-processor-interface.js +286 -0
- package/scripts/lib/transformadores/base.js +80 -0
- package/scripts/lib/transformadores/claude.js +124 -0
- package/scripts/lib/transformadores/codex.js +115 -0
- package/scripts/lib/transformadores/copilot.js +106 -0
- package/scripts/lib/transformadores/gemini.js +74 -0
- package/scripts/lib/transformadores/index.js +35 -0
- package/scripts/lib/transformadores/opencode.js +75 -0
- package/scripts/lib/ui.js +259 -0
- package/scripts/limpiar-artefactos-python.js +131 -0
- package/scripts/mcp-orchestrator.py +386 -0
- package/scripts/mcp-pool-manager.py +352 -0
- package/scripts/mcp-telemetry.py +378 -0
- package/scripts/poblar-evolvable.js +226 -0
- package/scripts/publicar.js +287 -0
- package/scripts/reflect-skills.js +403 -0
- package/scripts/rotar-audit-logs.js +185 -0
- package/scripts/run-skill-evals.js +242 -0
- package/scripts/smoke-test.js +374 -0
- package/scripts/token-analysis.py +471 -0
- package/scripts/validar-manifest.js +195 -0
- package/scripts/validar-memoria.js +321 -0
- package/scripts/validar-tests-aislamiento.js +184 -0
- package/scripts/validar-tokens-test.js +208 -0
- package/scripts/validar.js +147 -0
- package/scripts/validate-markdown.py +339 -0
- package/scripts/validate-skills.py +385 -0
- package/scripts/vendor/claude-usage/README.md +116 -0
- package/scripts/vendor/claude-usage/cli.py +334 -0
- package/scripts/vendor/claude-usage/dashboard.py +795 -0
- package/scripts/vendor/claude-usage/scanner.py +467 -0
- package/scripts/vendor/markitdown/cli.py +194 -0
- package/scripts/verificar-evolucion.js +289 -0
- package/scripts/verificar-release.js +494 -0
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: contenedores-docker
|
|
3
|
+
description: Docker y containerización. Dockerfiles optimizados con multi-stage builds, docker-compose, volúmenes, networking, health checks, security scanning, build caching, distroless images. Anti-patrones comunes.
|
|
4
|
+
version: "1.0.0"
|
|
5
|
+
herramientasPermitidas: [Read]
|
|
6
|
+
exclusiones:
|
|
7
|
+
- "No cargar para orquestación Kubernetes (Deployments, Services, Helm, HPA) — para Kubernetes cargar `kubernetes-orquestacion`."
|
|
8
|
+
- "No cargar para infraestructura como código con Terraform o Pulumi — para IaC cargar `terraform-experto`."
|
|
9
|
+
- "No cargar para CI/CD pipelines (GitHub Actions, GitLab CI, build triggers) — para pipelines cargar `ci-cd-pipelines`."
|
|
10
|
+
- "No cargar para registros de contenedores en cloud (ECR, GCR, ACR) y sus políticas de acceso — para cloud cargar `cloud-aws`, `azure-cloud` o `gcp-cloud`."
|
|
11
|
+
evolvable: true # default para skill estandar
|
|
12
|
+
---
|
|
13
|
+
# Docker y Containerización — Producción
|
|
14
|
+
|
|
15
|
+
## Cuándo NO cargar
|
|
16
|
+
|
|
17
|
+
- La tarea es orquestación de contenedores con Kubernetes: Deployments, Services, Helm, HPA — cargar `kubernetes-orquestacion`.
|
|
18
|
+
- El trabajo es infraestructura como código con Terraform o Pulumi — cargar `terraform-experto`.
|
|
19
|
+
- La tarea es configurar pipelines CI/CD: GitHub Actions, GitLab CI, build triggers automáticos — cargar `ci-cd-pipelines`.
|
|
20
|
+
- El trabajo es con registros de contenedores en cloud (ECR, GCR, ACR) y sus políticas IAM — cargar `cloud-aws`, `azure-cloud` o `gcp-cloud`.
|
|
21
|
+
|
|
22
|
+
Docker en producción requiere imágenes seguras, pequeñas y reproducibles.
|
|
23
|
+
Este skill cubre desde Dockerfiles hasta orquestación con Compose.
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## Reglas Obligatorias
|
|
28
|
+
|
|
29
|
+
1. **SIEMPRE multi-stage build** — imagen final < 200MB si posible.
|
|
30
|
+
2. **NUNCA correr como root** — definir `USER` no-root en el Dockerfile.
|
|
31
|
+
3. **SIEMPRE `.dockerignore`** — sin él, el contexto incluye `.git`, `.env`, `node_modules`.
|
|
32
|
+
4. **SIEMPRE `HEALTHCHECK`** — el orquestador necesita saber si el contenedor está sano.
|
|
33
|
+
5. **NUNCA secrets en `ARG` o `ENV`** del Dockerfile — son visibles en `docker history`.
|
|
34
|
+
6. **SIEMPRE tag de versión exacta** en producción — NUNCA `latest`.
|
|
35
|
+
7. **`CMD` en forma exec (array)** — `CMD ["ejecutable", "arg"]`, no shell string.
|
|
36
|
+
8. **Copiar dependencias ANTES que código** — maximiza el caché de build.
|
|
37
|
+
9. **Limpiar apt-get en la misma capa de RUN** — `rm -rf /var/lib/apt/lists/*`.
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## Dockerfile Base — Python API
|
|
42
|
+
|
|
43
|
+
```dockerfile
|
|
44
|
+
# Etapa 1: Dependencias (caché eficiente)
|
|
45
|
+
FROM python:3.12-slim AS deps
|
|
46
|
+
|
|
47
|
+
RUN apt-get update && apt-get install -y --no-install-recommends \
|
|
48
|
+
build-essential libpq-dev \
|
|
49
|
+
&& rm -rf /var/lib/apt/lists/*
|
|
50
|
+
|
|
51
|
+
WORKDIR /app
|
|
52
|
+
COPY pyproject.toml uv.lock* requirements*.txt ./
|
|
53
|
+
RUN pip install --no-cache-dir --upgrade pip && \
|
|
54
|
+
pip install --no-cache-dir -r requirements.txt
|
|
55
|
+
|
|
56
|
+
# Etapa 2: Build
|
|
57
|
+
FROM deps AS builder
|
|
58
|
+
COPY . .
|
|
59
|
+
RUN python -m compileall -q /app
|
|
60
|
+
|
|
61
|
+
# Etapa 3: Producción (imagen final mínima)
|
|
62
|
+
FROM python:3.12-slim AS production
|
|
63
|
+
|
|
64
|
+
RUN groupadd --gid 1001 appuser && \
|
|
65
|
+
useradd --uid 1001 --gid appuser --shell /bin/bash --create-home appuser
|
|
66
|
+
|
|
67
|
+
WORKDIR /app
|
|
68
|
+
|
|
69
|
+
COPY --from=builder --chown=appuser:appuser /usr/local/lib/python3.12/site-packages \
|
|
70
|
+
/usr/local/lib/python3.12/site-packages
|
|
71
|
+
COPY --from=builder --chown=appuser:appuser /app /app
|
|
72
|
+
|
|
73
|
+
RUN apt-get update && apt-get install -y --no-install-recommends \
|
|
74
|
+
libpq5 curl \
|
|
75
|
+
&& rm -rf /var/lib/apt/lists/*
|
|
76
|
+
|
|
77
|
+
USER appuser
|
|
78
|
+
|
|
79
|
+
ENV PYTHONDONTWRITEBYTECODE=1 \
|
|
80
|
+
PYTHONUNBUFFERED=1 \
|
|
81
|
+
PYTHONFAULTHANDLER=1 \
|
|
82
|
+
PORT=8000
|
|
83
|
+
|
|
84
|
+
EXPOSE 8000
|
|
85
|
+
|
|
86
|
+
HEALTHCHECK --interval=30s --timeout=10s --start-period=60s --retries=3 \
|
|
87
|
+
CMD curl -f http://localhost:8000/health || exit 1
|
|
88
|
+
|
|
89
|
+
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000", \
|
|
90
|
+
"--workers", "2", "--log-level", "info"]
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
---
|
|
94
|
+
|
|
95
|
+
## Anti-patrones Comunes
|
|
96
|
+
|
|
97
|
+
| Anti-patrón | Consecuencia | Corrección |
|
|
98
|
+
|-------------|-------------|------------|
|
|
99
|
+
| `FROM python:3.12` (imagen completa) | Imagen 1GB+ innecesaria | `python:3.12-slim` o `distroless` |
|
|
100
|
+
| Correr como `root` en contenedor | Escalación de privilegios | `USER 1001` en Dockerfile |
|
|
101
|
+
| `COPY . .` antes de dependencias | Invalidar caché en cada cambio | Copiar deps primero |
|
|
102
|
+
| Sin `.dockerignore` | Contexto enorme, secretos incluidos | `.dockerignore` siempre |
|
|
103
|
+
| `apt-get` sin limpiar | Imagen más grande | Limpiar en misma `RUN` |
|
|
104
|
+
| Secrets en `ARG` o `ENV` | Visibles en `docker history` | Runtime env o secrets |
|
|
105
|
+
| Latest tag en producción | No reproducible | Tag de versión exacta |
|
|
106
|
+
| Sin `HEALTHCHECK` | Orquestador no sabe si está sano | `HEALTHCHECK` siempre |
|
|
107
|
+
| `CMD` como shell string | Signals no llegan al proceso | Forma exec (array) |
|
|
108
|
+
| Múltiples procesos en un contenedor | Viola responsabilidad única | Un proceso por contenedor |
|
|
109
|
+
|
|
110
|
+
---
|
|
111
|
+
|
|
112
|
+
## Checklist de Imagen Productiva
|
|
113
|
+
|
|
114
|
+
- [ ] Multi-stage build — imagen final < 200MB si posible
|
|
115
|
+
- [ ] Usuario no-root definido
|
|
116
|
+
- [ ] Variables sensibles fuera de la imagen
|
|
117
|
+
- [ ] `HEALTHCHECK` definido
|
|
118
|
+
- [ ] `.dockerignore` presente y completo
|
|
119
|
+
- [ ] Dependencias del sistema limpiadas en misma capa de RUN
|
|
120
|
+
- [ ] Tag de versión semántica (no `latest`) en producción
|
|
121
|
+
- [ ] Escaneo de vulnerabilidades en CI/CD
|
|
122
|
+
- [ ] `CMD` en forma exec (array), no shell
|
|
123
|
+
- [ ] `PYTHONUNBUFFERED=1` y `PYTHONDONTWRITEBYTECODE=1` para Python
|
|
124
|
+
|
|
125
|
+
---
|
|
126
|
+
|
|
127
|
+
Para ejemplos completos de multi-stage Node.js/Angular, .dockerignore, docker-compose, networking, volúmenes, secrets, security scanning en CI y optimización de build cache, ver [recursos/ejemplos-y-configuraciones.md](recursos/ejemplos-y-configuraciones.md).
|
|
128
|
+
|
|
129
|
+
## Gotchas / Errores comunes no obvios
|
|
130
|
+
|
|
131
|
+
**`COPY . .` antes de `RUN pip install` invalida el caché de build en cada cambio de código fuente**: Docker invalida el caché de una capa cuando cambia cualquier archivo copiado — si el código fuente cambia en cada commit, la capa de instalación de dependencias nunca se cachea. Causa: el orden de las instrucciones en el Dockerfile determina la eficiencia del caché. Fix: copiar PRIMERO los archivos de dependencias (`pyproject.toml`, `requirements.txt`, `package.json`) e instalar, luego copiar el código fuente — las dependencias solo se reinstalan cuando sus archivos de definición cambian.
|
|
132
|
+
|
|
133
|
+
**`CMD ["python", "app.py"]` en lugar de `CMD ["gunicorn", ...]` en producción deja el proceso de Python sin manejo de señales SIGTERM**: cuando Kubernetes envía `SIGTERM` para terminar gracefully un pod, el proceso debe recibirlo y terminar limpiamente. Python corriendo con `python app.py` puede no propagar la señal correctamente si usa threads. Causa: `CMD` en forma exec pasa la señal al proceso directamente, pero si el proceso no maneja `SIGTERM`, el contenedor espera el `SIGKILL` tras el `terminationGracePeriodSeconds`. Fix: usar un servidor WSGI/ASGI (`gunicorn`, `uvicorn`) que maneja `SIGTERM` gracefully, o implementar el signal handler en la aplicación.
|
|
134
|
+
|
|
135
|
+
**Secrets pasados como `ARG` en el Dockerfile son visibles en `docker history` aunque se eliminen en una capa posterior**: `ARG SECRET_KEY` seguido de `RUN rm -f /app/.env` no elimina el valor del ARG del historial de la imagen — `docker history --no-trunc imagen` muestra los valores de los ARG. Causa: `docker history` registra los comandos de cada capa, incluyendo los valores de ARG usados. Fix: NUNCA pasar secretos como `ARG` o `ENV` en el Dockerfile; para secrets en build-time usar `--secret` de Docker BuildKit: `RUN --mount=type=secret,id=api_key cat /run/secrets/api_key`.
|
|
136
|
+
|
|
137
|
+
**`.dockerignore` mal configurado incluye archivos `.env` o `node_modules` en el contexto de build, ralentizando el daemon y exponiendo secretos**: si `.dockerignore` no existe o no excluye `node_modules`, el contexto de build puede ser de cientos de MB — todo se transfiere al daemon antes del build. Causa: el contexto de build incluye todo el directorio por defecto. Fix: crear `.dockerignore` con al menos `.git`, `node_modules`, `__pycache__`, `.env*`, `*.pyc`, `dist`, `build`, y verificar el tamaño del contexto con `docker build` mirando la línea "Sending build context to Docker daemon X.XX MB".
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
# ═══════════════════════════════════════════════════════════════════════════════
|
|
2
|
+
# Dockerfile multi-stage para aplicaciones Python (FastAPI / Django)
|
|
3
|
+
# Optimizado para producción: imagen pequeña, sin root, sin caché innecesario.
|
|
4
|
+
#
|
|
5
|
+
# USO:
|
|
6
|
+
# docker build -t mi-app:1.0.0 .
|
|
7
|
+
# docker build --target deps -t mi-app:deps . # solo la etapa de dependencias
|
|
8
|
+
#
|
|
9
|
+
# VARIABLES DE BUILD (--build-arg):
|
|
10
|
+
# PYTHON_VERSION Versión de Python (default: 3.12)
|
|
11
|
+
# APP_PORT Puerto expuesto (default: 8000)
|
|
12
|
+
# APP_USER_UID UID del usuario sin privilegios (default: 1001)
|
|
13
|
+
#
|
|
14
|
+
# INSTRUCCIÓN: Reemplazar todos los valores entre [corchetes] con los reales.
|
|
15
|
+
# ═══════════════════════════════════════════════════════════════════════════════
|
|
16
|
+
|
|
17
|
+
ARG PYTHON_VERSION=3.12
|
|
18
|
+
ARG APP_PORT=8000
|
|
19
|
+
ARG APP_USER_UID=1001
|
|
20
|
+
|
|
21
|
+
# ─────────────────────────────────────────────────────────────────────────────
|
|
22
|
+
# Etapa 1: deps — instalar dependencias Python (máximo cache hit en rebuilds)
|
|
23
|
+
# ─────────────────────────────────────────────────────────────────────────────
|
|
24
|
+
FROM python:${PYTHON_VERSION}-slim AS deps
|
|
25
|
+
|
|
26
|
+
# Dependencias del sistema mínimas (solo las necesarias para compilar wheels)
|
|
27
|
+
# INSTRUCCIÓN: ajustar según las librerías Python que uses
|
|
28
|
+
# psycopg2 → libpq-dev
|
|
29
|
+
# Pillow → libjpeg-dev zlib1g-dev
|
|
30
|
+
# lxml → libxml2-dev libxslt-dev
|
|
31
|
+
# cryptography → libssl-dev
|
|
32
|
+
RUN apt-get update \
|
|
33
|
+
&& apt-get install -y --no-install-recommends \
|
|
34
|
+
build-essential \
|
|
35
|
+
libpq-dev \
|
|
36
|
+
&& rm -rf /var/lib/apt/lists/*
|
|
37
|
+
|
|
38
|
+
WORKDIR /app
|
|
39
|
+
|
|
40
|
+
# Copiar SOLO los archivos de dependencias primero.
|
|
41
|
+
# Esto permite que Docker reutilice la capa de pip install si el código cambia
|
|
42
|
+
# pero las dependencias no cambian.
|
|
43
|
+
COPY pyproject.toml uv.lock* requirements*.txt ./
|
|
44
|
+
|
|
45
|
+
# Actualizar pip e instalar dependencias sin caché
|
|
46
|
+
RUN pip install --no-cache-dir --upgrade pip==24.* \
|
|
47
|
+
&& pip install --no-cache-dir -r requirements.txt
|
|
48
|
+
|
|
49
|
+
# ─────────────────────────────────────────────────────────────────────────────
|
|
50
|
+
# Etapa 2: builder — copiar código y precompilar bytecode
|
|
51
|
+
# ─────────────────────────────────────────────────────────────────────────────
|
|
52
|
+
FROM deps AS builder
|
|
53
|
+
|
|
54
|
+
# Copiar el código fuente DESPUÉS de instalar dependencias (mejor cache hit)
|
|
55
|
+
COPY . .
|
|
56
|
+
|
|
57
|
+
# Precompilar .pyc — reduce el tiempo de arranque del contenedor en producción
|
|
58
|
+
# -q suprime output, -b escribe .pyc junto a los .py
|
|
59
|
+
RUN python -m compileall -q /app
|
|
60
|
+
|
|
61
|
+
# ─────────────────────────────────────────────────────────────────────────────
|
|
62
|
+
# Etapa 3: production — imagen final mínima sin herramientas de build
|
|
63
|
+
# ─────────────────────────────────────────────────────────────────────────────
|
|
64
|
+
FROM python:${PYTHON_VERSION}-slim AS production
|
|
65
|
+
|
|
66
|
+
ARG APP_PORT
|
|
67
|
+
ARG APP_USER_UID
|
|
68
|
+
|
|
69
|
+
# Instalar SOLO dependencias de runtime (sin herramientas de compilación)
|
|
70
|
+
# INSTRUCCIÓN: ajustar según las librerías que uses en runtime
|
|
71
|
+
RUN apt-get update \
|
|
72
|
+
&& apt-get install -y --no-install-recommends \
|
|
73
|
+
libpq5 \
|
|
74
|
+
curl \
|
|
75
|
+
&& rm -rf /var/lib/apt/lists/* \
|
|
76
|
+
&& apt-get clean
|
|
77
|
+
|
|
78
|
+
# ── Seguridad: usuario sin privilegios ────────────────────────────────────────
|
|
79
|
+
# NUNCA correr como root en producción
|
|
80
|
+
RUN groupadd --gid ${APP_USER_UID} appuser \
|
|
81
|
+
&& useradd \
|
|
82
|
+
--uid ${APP_USER_UID} \
|
|
83
|
+
--gid ${APP_USER_UID} \
|
|
84
|
+
--no-create-home \
|
|
85
|
+
--shell /sbin/nologin \
|
|
86
|
+
appuser
|
|
87
|
+
|
|
88
|
+
WORKDIR /app
|
|
89
|
+
|
|
90
|
+
# Copiar dependencias instaladas y código compilado desde las etapas anteriores
|
|
91
|
+
COPY --from=builder /usr/local/lib/python*/site-packages /usr/local/lib/python3.12/site-packages/
|
|
92
|
+
COPY --from=builder /usr/local/bin /usr/local/bin/
|
|
93
|
+
COPY --from=builder /app /app
|
|
94
|
+
|
|
95
|
+
# Establecer permisos correctos ANTES de cambiar de usuario
|
|
96
|
+
RUN chown -R appuser:appuser /app
|
|
97
|
+
|
|
98
|
+
# Cambiar al usuario sin privilegios
|
|
99
|
+
USER appuser
|
|
100
|
+
|
|
101
|
+
# ── Variables de entorno de runtime ───────────────────────────────────────────
|
|
102
|
+
# INSTRUCCIÓN: estas son las variables mínimas recomendadas para Python en producción
|
|
103
|
+
ENV PYTHONDONTWRITEBYTECODE=1 \
|
|
104
|
+
PYTHONUNBUFFERED=1 \
|
|
105
|
+
PYTHONFAULTHANDLER=1 \
|
|
106
|
+
PYTHONHASHSEED=random \
|
|
107
|
+
# FastAPI/Uvicorn
|
|
108
|
+
PORT=${APP_PORT} \
|
|
109
|
+
# INSTRUCCIÓN: agregar variables de entorno propias de la aplicación
|
|
110
|
+
# Las variables con valores sensibles deben venir de secrets, NO hardcodeadas aquí
|
|
111
|
+
APP_ENV=production
|
|
112
|
+
|
|
113
|
+
EXPOSE ${APP_PORT}
|
|
114
|
+
|
|
115
|
+
# ── Health check ──────────────────────────────────────────────────────────────
|
|
116
|
+
# INSTRUCCIÓN: reemplazar /health con el endpoint real de health check
|
|
117
|
+
# interval: frecuencia del check
|
|
118
|
+
# timeout: tiempo máximo de respuesta
|
|
119
|
+
# start_period: tiempo antes del primer check (para que la app arranque)
|
|
120
|
+
# retries: intentos fallidos antes de marcar como unhealthy
|
|
121
|
+
HEALTHCHECK \
|
|
122
|
+
--interval=30s \
|
|
123
|
+
--timeout=10s \
|
|
124
|
+
--start-period=15s \
|
|
125
|
+
--retries=3 \
|
|
126
|
+
CMD curl -f http://localhost:${APP_PORT}/health || exit 1
|
|
127
|
+
|
|
128
|
+
# ── Comando de inicio ─────────────────────────────────────────────────────────
|
|
129
|
+
# INSTRUCCIÓN: ajustar según el framework que uses
|
|
130
|
+
#
|
|
131
|
+
# FastAPI con Uvicorn:
|
|
132
|
+
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000", "--workers", "2"]
|
|
133
|
+
#
|
|
134
|
+
# FastAPI con Gunicorn + Uvicorn workers (para producción con múltiples CPUs):
|
|
135
|
+
# CMD ["gunicorn", "app.main:app", "--workers", "4", "--worker-class", "uvicorn.workers.UvicornWorker", "--bind", "0.0.0.0:8000"]
|
|
136
|
+
#
|
|
137
|
+
# Django con Gunicorn:
|
|
138
|
+
# CMD ["gunicorn", "[nombre_proyecto].wsgi:application", "--bind", "0.0.0.0:8000", "--workers", "4"]
|
|
139
|
+
|
|
140
|
+
# ═══════════════════════════════════════════════════════════════════════════════
|
|
141
|
+
# .dockerignore recomendado (crear en la raíz del proyecto):
|
|
142
|
+
# ───────────────────────────────────────────────────────────────────────────────
|
|
143
|
+
# __pycache__/
|
|
144
|
+
# *.pyc
|
|
145
|
+
# *.pyo
|
|
146
|
+
# .pytest_cache/
|
|
147
|
+
# .mypy_cache/
|
|
148
|
+
# .ruff_cache/
|
|
149
|
+
# .git/
|
|
150
|
+
# .gitignore
|
|
151
|
+
# .env
|
|
152
|
+
# .env.*
|
|
153
|
+
# !.env.example
|
|
154
|
+
# tests/
|
|
155
|
+
# docs/
|
|
156
|
+
# *.md
|
|
157
|
+
# docker-compose*.yml
|
|
158
|
+
# Dockerfile*
|
|
159
|
+
# .github/
|
|
160
|
+
# ═══════════════════════════════════════════════════════════════════════════════
|
|
@@ -0,0 +1,327 @@
|
|
|
1
|
+
# Docker — Ejemplos y Configuraciones Completas
|
|
2
|
+
|
|
3
|
+
Referencia extendida de la skill `contenedores-docker`. Contiene Dockerfiles completos,
|
|
4
|
+
docker-compose, networking, volúmenes, security scanning y optimización de caché.
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Dockerfile — Node.js + Angular (Multi-stage)
|
|
9
|
+
|
|
10
|
+
```dockerfile
|
|
11
|
+
# Etapa 1: Dependencias npm
|
|
12
|
+
FROM node:20-alpine AS npm-deps
|
|
13
|
+
WORKDIR /app
|
|
14
|
+
COPY package.json package-lock.json ./
|
|
15
|
+
RUN npm ci --only=production
|
|
16
|
+
|
|
17
|
+
# Etapa 2: Build Angular
|
|
18
|
+
FROM node:20-alpine AS angular-builder
|
|
19
|
+
WORKDIR /app
|
|
20
|
+
COPY package.json package-lock.json ./
|
|
21
|
+
RUN npm ci
|
|
22
|
+
COPY . .
|
|
23
|
+
RUN npm run build -- --configuration=production --output-path=dist
|
|
24
|
+
|
|
25
|
+
# Etapa 3: Nginx para servir el SPA
|
|
26
|
+
FROM nginx:1.25-alpine AS production
|
|
27
|
+
|
|
28
|
+
COPY nginx.conf /etc/nginx/nginx.conf
|
|
29
|
+
COPY --from=angular-builder /app/dist /usr/share/nginx/html
|
|
30
|
+
|
|
31
|
+
RUN chown -R nginx:nginx /usr/share/nginx/html && \
|
|
32
|
+
chown -R nginx:nginx /var/cache/nginx && \
|
|
33
|
+
touch /var/run/nginx.pid && \
|
|
34
|
+
chown nginx:nginx /var/run/nginx.pid
|
|
35
|
+
|
|
36
|
+
USER nginx
|
|
37
|
+
|
|
38
|
+
EXPOSE 80
|
|
39
|
+
|
|
40
|
+
HEALTHCHECK --interval=30s --timeout=5s \
|
|
41
|
+
CMD curl -f http://localhost/health || exit 1
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## .dockerignore completo
|
|
47
|
+
|
|
48
|
+
```dockerignore
|
|
49
|
+
# Control de versiones
|
|
50
|
+
.git
|
|
51
|
+
.gitignore
|
|
52
|
+
|
|
53
|
+
# Dependencias locales
|
|
54
|
+
node_modules
|
|
55
|
+
__pycache__
|
|
56
|
+
*.pyc
|
|
57
|
+
*.pyo
|
|
58
|
+
.venv
|
|
59
|
+
venv
|
|
60
|
+
env
|
|
61
|
+
|
|
62
|
+
# Tests y documentacion
|
|
63
|
+
tests/
|
|
64
|
+
docs/
|
|
65
|
+
*.md
|
|
66
|
+
!README.md
|
|
67
|
+
|
|
68
|
+
# Archivos de configuracion de desarrollo
|
|
69
|
+
.env
|
|
70
|
+
.env.*
|
|
71
|
+
*.env
|
|
72
|
+
docker-compose.override.yml
|
|
73
|
+
.editorconfig
|
|
74
|
+
.eslintrc*
|
|
75
|
+
.prettierrc*
|
|
76
|
+
|
|
77
|
+
# IDE
|
|
78
|
+
.vscode
|
|
79
|
+
.idea
|
|
80
|
+
*.swp
|
|
81
|
+
|
|
82
|
+
# Build outputs locales
|
|
83
|
+
dist/
|
|
84
|
+
build/
|
|
85
|
+
.angular/
|
|
86
|
+
coverage/
|
|
87
|
+
.pytest_cache/
|
|
88
|
+
|
|
89
|
+
# CI/CD
|
|
90
|
+
.github/
|
|
91
|
+
.gitlab-ci.yml
|
|
92
|
+
Dockerfile*
|
|
93
|
+
docker-compose*.yml
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
## docker-compose — Entorno de Desarrollo Completo
|
|
99
|
+
|
|
100
|
+
```yaml
|
|
101
|
+
version: '3.9'
|
|
102
|
+
|
|
103
|
+
services:
|
|
104
|
+
api:
|
|
105
|
+
build:
|
|
106
|
+
context: .
|
|
107
|
+
dockerfile: Dockerfile
|
|
108
|
+
target: deps
|
|
109
|
+
command: uvicorn app.main:app --host 0.0.0.0 --port 8000 --reload
|
|
110
|
+
volumes:
|
|
111
|
+
- .:/app
|
|
112
|
+
- /app/.venv
|
|
113
|
+
ports:
|
|
114
|
+
- "8000:8000"
|
|
115
|
+
environment:
|
|
116
|
+
- DATABASE_URL=postgresql+asyncpg://postgres:postgres@db:5432/appdb
|
|
117
|
+
- REDIS_URL=redis://redis:6379/0
|
|
118
|
+
- DEBUG=true
|
|
119
|
+
env_file:
|
|
120
|
+
- .env.local
|
|
121
|
+
depends_on:
|
|
122
|
+
db:
|
|
123
|
+
condition: service_healthy
|
|
124
|
+
redis:
|
|
125
|
+
condition: service_healthy
|
|
126
|
+
networks:
|
|
127
|
+
- app-network
|
|
128
|
+
restart: unless-stopped
|
|
129
|
+
|
|
130
|
+
db:
|
|
131
|
+
image: postgres:15-alpine
|
|
132
|
+
volumes:
|
|
133
|
+
- postgres_data:/var/lib/postgresql/data
|
|
134
|
+
- ./scripts/init.sql:/docker-entrypoint-initdb.d/init.sql:ro
|
|
135
|
+
environment:
|
|
136
|
+
POSTGRES_DB: appdb
|
|
137
|
+
POSTGRES_USER: postgres
|
|
138
|
+
POSTGRES_PASSWORD: postgres
|
|
139
|
+
ports:
|
|
140
|
+
- "5432:5432"
|
|
141
|
+
healthcheck:
|
|
142
|
+
test: ["CMD-SHELL", "pg_isready -U postgres -d appdb"]
|
|
143
|
+
interval: 10s
|
|
144
|
+
timeout: 5s
|
|
145
|
+
retries: 5
|
|
146
|
+
start_period: 30s
|
|
147
|
+
networks:
|
|
148
|
+
- app-network
|
|
149
|
+
|
|
150
|
+
redis:
|
|
151
|
+
image: redis:7-alpine
|
|
152
|
+
command: redis-server --appendonly yes --requirepass "${REDIS_PASSWORD:-dev_password}"
|
|
153
|
+
volumes:
|
|
154
|
+
- redis_data:/data
|
|
155
|
+
ports:
|
|
156
|
+
- "6379:6379"
|
|
157
|
+
healthcheck:
|
|
158
|
+
test: ["CMD", "redis-cli", "ping"]
|
|
159
|
+
interval: 10s
|
|
160
|
+
timeout: 3s
|
|
161
|
+
retries: 3
|
|
162
|
+
networks:
|
|
163
|
+
- app-network
|
|
164
|
+
|
|
165
|
+
nginx:
|
|
166
|
+
image: nginx:1.25-alpine
|
|
167
|
+
volumes:
|
|
168
|
+
- ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
|
|
169
|
+
- ./nginx/ssl:/etc/nginx/ssl:ro
|
|
170
|
+
ports:
|
|
171
|
+
- "80:80"
|
|
172
|
+
- "443:443"
|
|
173
|
+
depends_on:
|
|
174
|
+
- api
|
|
175
|
+
networks:
|
|
176
|
+
- app-network
|
|
177
|
+
|
|
178
|
+
volumes:
|
|
179
|
+
postgres_data:
|
|
180
|
+
driver: local
|
|
181
|
+
redis_data:
|
|
182
|
+
driver: local
|
|
183
|
+
|
|
184
|
+
networks:
|
|
185
|
+
app-network:
|
|
186
|
+
driver: bridge
|
|
187
|
+
ipam:
|
|
188
|
+
config:
|
|
189
|
+
- subnet: 172.20.0.0/16
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
---
|
|
193
|
+
|
|
194
|
+
## Networking en Docker
|
|
195
|
+
|
|
196
|
+
```bash
|
|
197
|
+
# Crear red personalizada
|
|
198
|
+
docker network create --driver bridge --subnet 172.21.0.0/16 mi-red
|
|
199
|
+
|
|
200
|
+
# Inspeccionar red
|
|
201
|
+
docker network inspect mi-red
|
|
202
|
+
|
|
203
|
+
# MAL: usar --link (obsoleto)
|
|
204
|
+
docker run --link db:database api
|
|
205
|
+
|
|
206
|
+
# BIEN: red compartida
|
|
207
|
+
docker run --network mi-red --name api mi-imagen-api
|
|
208
|
+
docker run --network mi-red --name db postgres:15
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
---
|
|
212
|
+
|
|
213
|
+
## Volúmenes — Persistencia Correcta
|
|
214
|
+
|
|
215
|
+
```yaml
|
|
216
|
+
# 1. Named volumes (RECOMENDADO para datos de BD)
|
|
217
|
+
volumes:
|
|
218
|
+
postgres_data:
|
|
219
|
+
|
|
220
|
+
# 2. Bind mounts (SOLO para desarrollo — hot reload)
|
|
221
|
+
volumes:
|
|
222
|
+
- ./src:/app/src
|
|
223
|
+
|
|
224
|
+
# 3. tmpfs (datos efimeros)
|
|
225
|
+
tmpfs:
|
|
226
|
+
- /tmp
|
|
227
|
+
- /run
|
|
228
|
+
|
|
229
|
+
# MAL: montar directorio completo en produccion
|
|
230
|
+
volumes:
|
|
231
|
+
- .:/app # Incluye .git, node_modules, .env!
|
|
232
|
+
|
|
233
|
+
# BIEN: montar solo lo necesario
|
|
234
|
+
volumes:
|
|
235
|
+
- ./config:/app/config:ro
|
|
236
|
+
- ./logs:/app/logs
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
---
|
|
240
|
+
|
|
241
|
+
## Variables de Entorno y Secrets
|
|
242
|
+
|
|
243
|
+
```bash
|
|
244
|
+
# MAL: secrets en variables de entorno del Dockerfile
|
|
245
|
+
ENV DATABASE_PASSWORD=supersecreta123
|
|
246
|
+
|
|
247
|
+
# MAL: pasar secrets en build args
|
|
248
|
+
docker build --build-arg DB_PASS=secreto .
|
|
249
|
+
|
|
250
|
+
# BIEN: runtime environment variables
|
|
251
|
+
docker run -e DATABASE_URL="postgresql://..." mi-imagen
|
|
252
|
+
|
|
253
|
+
# BIEN: Docker Secrets (en Swarm)
|
|
254
|
+
docker secret create db_password ./db_password.txt
|
|
255
|
+
|
|
256
|
+
# BIEN: En docker-compose con .env
|
|
257
|
+
env_file:
|
|
258
|
+
- .env
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
---
|
|
262
|
+
|
|
263
|
+
## Security Scanning — Pipeline de CI
|
|
264
|
+
|
|
265
|
+
```yaml
|
|
266
|
+
# .github/workflows/security.yml
|
|
267
|
+
name: Security Scan
|
|
268
|
+
|
|
269
|
+
on: [push, pull_request]
|
|
270
|
+
|
|
271
|
+
jobs:
|
|
272
|
+
scan:
|
|
273
|
+
runs-on: ubuntu-latest
|
|
274
|
+
steps:
|
|
275
|
+
- uses: actions/checkout@v4
|
|
276
|
+
|
|
277
|
+
- name: Build imagen
|
|
278
|
+
run: docker build -t mi-app:${{ github.sha }} .
|
|
279
|
+
|
|
280
|
+
- name: Trivy scan
|
|
281
|
+
uses: aquasecurity/trivy-action@master
|
|
282
|
+
with:
|
|
283
|
+
image-ref: mi-app:${{ github.sha }}
|
|
284
|
+
format: 'sarif'
|
|
285
|
+
output: 'trivy-results.sarif'
|
|
286
|
+
severity: 'CRITICAL,HIGH'
|
|
287
|
+
exit-code: '1'
|
|
288
|
+
|
|
289
|
+
- name: Hadolint
|
|
290
|
+
uses: hadolint/hadolint-action@v3.1.0
|
|
291
|
+
with:
|
|
292
|
+
dockerfile: Dockerfile
|
|
293
|
+
|
|
294
|
+
- name: Dockle
|
|
295
|
+
run: |
|
|
296
|
+
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \
|
|
297
|
+
goodwithtech/dockle:latest --exit-code 1 mi-app:${{ github.sha }}
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
---
|
|
301
|
+
|
|
302
|
+
## Optimización de Build Cache
|
|
303
|
+
|
|
304
|
+
```dockerfile
|
|
305
|
+
# ORDEN CRITICO para maximizar cache:
|
|
306
|
+
# 1. Lo que cambia MENOS al inicio
|
|
307
|
+
# 2. Lo que cambia MAS al final
|
|
308
|
+
|
|
309
|
+
# MAL: copiar todo antes de instalar dependencias
|
|
310
|
+
COPY . .
|
|
311
|
+
RUN pip install -r requirements.txt
|
|
312
|
+
|
|
313
|
+
# BIEN: dependencias antes que codigo
|
|
314
|
+
COPY requirements.txt .
|
|
315
|
+
RUN pip install -r requirements.txt
|
|
316
|
+
COPY . .
|
|
317
|
+
|
|
318
|
+
# BuildKit — cache de montaje
|
|
319
|
+
# syntax=docker/dockerfile:1
|
|
320
|
+
FROM python:3.12-slim
|
|
321
|
+
|
|
322
|
+
RUN --mount=type=cache,target=/root/.cache/pip \
|
|
323
|
+
pip install -r requirements.txt
|
|
324
|
+
|
|
325
|
+
RUN --mount=type=cache,target=/var/cache/apt \
|
|
326
|
+
apt-get update && apt-get install -y libpq-dev
|
|
327
|
+
```
|