| Día 01 |
Crear usuarios de servicio sin shell interactiva |
Completado |
| Día 02 |
Crear un usuario con fecha de expiración |
Completado |
| Día 03 |
Deshabilitar el acceso SSH directo como root |
Completado |
| Día 04 |
Permisos de ejecución y propiedad de archivos |
Completado |
| Día 05 |
SELinux |
Completado |
| Día 06 |
Crear un Cron Job con Cronie |
Completado |
| Día 07 |
Autenticación SSH sin contraseña (password-less) |
Completado |
| Día 08 |
Instalar Ansible con pip3 disponible para todos los usuarios |
Completado |
| Día 09 |
Troubleshooting: MariaDB no inicia por directorio faltante |
Completado |
| Día 10 |
Script de backup para sitio web estatico |
Completado |
| Día 11 |
Instalar y configurar Apache Tomcat |
Completado |
| Día 12 |
Troubleshooting de Apache: Puerto ocupado por otro proceso + Guia iptables |
Completado |
| Día 13 |
Implementar iptables para restringir acceso a Apache |
Completado |
| Día 14 |
Troubleshooting de Apache: Servicio caido por conflicto de puerto |
Completado |
| Día 15 |
Instalar y configurar Nginx con SSL (Self-Signed Certificate) |
Completado |
| Día 16 |
Configurar Nginx como Load Balancer |
Completado |
| Día 17 |
Configurar PostgreSQL: Crear usuario y base de datos |
Completado |
| Día 18 |
Instalar y configurar LAMP Stack (Linux, Apache, MariaDB, PHP) |
Completado |
| Día 19 |
Configurar Apache para servir múltiples sitios con Alias |
Completado |
| Día 20 |
Configurar Nginx + PHP-FPM para servir una aplicacion PHP |
Completado |
| Día 21 |
Crear un repositorio Git bare en un servidor |
Completado |
| Día 22 |
Clonar un repositorio Git bare en el mismo servidor |
Completado |
| Día 23 |
Fork de un repositorio Git en Gitea |
Completado |
| Día 24 |
Crear branches en un repositorio Git |
Completado |
| Día 25 |
Flujo completo de branch: crear, commitear, mergear y pushear |
Completado |
| Día 26 |
Agregar un remote adicional en Git y pushear a él |
Completado |
| Día 27 |
Revertir el último commit con git revert |
Completado |
| Día 28 |
Cherry-pick: copiar un commit específico entre branches |
Completado |
| Día 29 |
Flujo de Pull Request en Gitea: rama feature → master |
Completado |
| Día 30 |
Limpiar historial de commits con git reset |
Completado |
| Día 31 |
Restaurar un stash específico con git stash apply |
Completado |
| Día 32 |
Rebase de feature branch sobre master |
Completado |
| Día 33 |
Resolver conflictos de merge durante git pull --rebase |
Completado |
| Día 34 |
Crear un post-update hook para tagging automático en Git |
Completado |
| Día 35 |
Instalar Docker CE e iniciar el servicio |
Completado |
| Día 36 |
Desplegar contenedor Nginx con Docker |
Completado |
| Día 37 |
Copiar archivos a un contenedor con docker cp |
Completado |
| Día 38 |
Pull de imagen Docker y re-tagging |
Completado |
| Día 39 |
Crear imagen Docker desde un contenedor |
Completado |
| Día 40 |
Docker EXEC: instalar y configurar Apache en un contenedor |
Completado |
| Día 41 |
Escribir un Dockerfile |
Completado |
| Día 42 |
Crear una Docker Network |
Completado |
| Día 43 |
Docker Port Mapping |
Completado |
| Día 44 |
Escribir un Docker Compose File |
Completado |
| Día 45 |
Resolver errores en un Dockerfile |
Completado |
| Día 46 |
Desplegar PHP + MariaDB con Docker Compose |
Completado |
| Día 47 |
Dockerizar una app Flask en Python |
Completado |
| Día 48 |
Desplegar un Pod en un cluster de Kubernetes |
Completado |
| Día 49 |
Desplegar aplicaciones con Deployments en Kubernetes |
Completado |
| Día 50 |
Resource Requests y Limits en Pods de Kubernetes |
Completado |
| Día 51 |
Rolling Update en Kubernetes Deployments |
Completado |
| Día 52 |
Rollback de un Deployment a la versión anterior |
Completado |
| Día 53 |
Troubleshooting: VolumeMount mal alineado en Nginx + PHP-FPM |
Completado |
| Día 54 |
Shared Volumes en Kubernetes (emptyDir) |
Completado |
| Día 55 |
Sidecar Containers (patrón native con initContainers) |
Completado |
| Día 56 |
Deployment + Service NodePort para nginx |
Completado |
| Día 57 |
Variables de entorno en Pods y $(VAR) substitution |
Completado |
| Día 58 |
Deployment Grafana — autopsia de labels y selectors |
Completado |
| Día 59 |
Troubleshooting Deployment: typo en image + ConfigMap inexistente |
Completado |
| Día 60 |
Persistent Volumes en Kubernetes (PV + PVC + Pod + Service) |
Completado |
| Día 61 |
Init Containers en Kubernetes |
Completado |
| Día 62 |
Manejo de Secrets en Kubernetes |
Completado |
| Día 63 |
Deploy Iron Gallery — stack multi-componente (app + DB + 2 services + namespace) |
Completado |
| Día 64 |
Troubleshooting Python Flask en K8s — dos bugs simultáneos (image typo + port mismatch) |
Completado |
| Día 65 |
Deploy de Redis en K8s con ConfigMap montado como volumen |
Completado |