Una crónica en primera persona sobre cómo casi destruyo mi servidor doméstico intentando resetear una contraseña
Capítulo 1: El problema inocente
Todo comenzó un martes por la tarde. Necesitaba acceder a Portainer en mi OpenMediaVault (OMV) para gestionar unos contenedores, pero por más que intentaba, la contraseña no funcionaba. «No pasa nada», pensé, «un simple reset y listo».
Capítulo 2: La falsa seguridad del grupo root
Mi primer error fue asumir que ser usuario del grupo root en OMV me daba superpoderes. En la interfaz web de OMV, yo era administrador. En la terminal, tras añadir mi usuario al grupo root, me sentía invencible.
bash
# Creía que esto me hacía root usermod -aG root mi_usuario
La realidad fue cruel: Linux no funciona así. Ser parte del grupo root no te da privilegios de superusuario. Necesitas sudo o convertirte realmente en root:
bash
# La realidad sudo -i # O su -
Capítulo 3: El caos de los contenedores duplicados
Al investigar mi sistema, descubrí algo aterrador:
bash
docker ps -a | grep portainer
Había dos instancias de Portainer corriendo. ¿Cómo llegaron ahí? No lo sé. Pero ambas compartían el mismo volumen portainer_data. Esto explicaba por qué cada reset era inútil: una instancia pisaba los cambios de la otra.
Capítulo 4: La eliminación desesperada
Frustrado, decidí tomar medidas drásticas:
bash
# ¡Error! Esto detuvo TODOS mis contenedores docker stop $(docker ps -aq) # ¡Error mayor! Esto los eliminó a TODOS docker rm $(docker ps -aq)
En mi defensa, estaba estresado. Pero las consecuencias fueron inmediatas: mi servidor de Jellyfin dejó de servir películas, mi instancia de Nextcloud dejó de sincronizar archivos, y mi reverse proxy dejó de funcionar.
Capítulo 5: La traición de las imágenes huérfanas
Tras el desastre, intenté limpiar las imágenes:
bash
# ¡CUIDADO CON ESTO! docker image prune -a -f
Este comando eliminó imágenes «no utilizadas». El problema: algunas de mis contenedores usaban imágenes antiguas que no estaban etiquetadas como latest. Perdí la capacidad de recrear ciertos contenedores exactamente como estaban.
Capítulo 6: El misterio del puerto 9000
Con Portainer reinstalado, intenté acceder:
- Intenté
https://mi-omv:9443– nada - Intenté
https://mi-omv:9000– nada - Intenté
http://mi-omv:9443– nada
La solución era simple pero contraintuitiva: Portainer por defecto usa HTTP en el puerto 9000:
text
http://mi-omv:9000
Una vez dentro, la pantalla de creación de usuario apareció milagrosamente.
Capítulo 7: El costo real
Después de 4 horas de trabajo, logré:
- Recuperar Portainer ✓
- Perder 3 contenedores críticos ✗
- Interrumpir servicios por 2 horas ✗
- Perder configuraciones personalizadas ✗
Los volúmenes de datos seguían intactos, pero las configuraciones de los contenedores (puertos mapeados, variables de entorno, redes) habían desaparecido.
Lecciones aprendidas (la manera difícil)
1. Nunca uses comandos de destrucción masiva
bash
# ❌ NUNCA HAGAS ESTO docker stop $(docker ps -aq) docker rm $(docker ps -aq) docker system prune -a # ✅ HAZ ESTO EN CAMBIO docker stop nombre_contenedor docker rm nombre_contenedor docker image prune --filter "until=24h"
2. Etiqueta TODO como si tu vida dependiera de ello
bash
# Al crear contenedores docker run -d \ --name mi_contenedor \ --label "backup=critical" \ --label "owner=yo" \ --label "do_not_delete=true" \ mi_imagen:tag # Luego puedes filtrar por etiquetas docker ps -a --filter "label=backup=critical"
3. Crea un sistema de backup ANTES de necesitarlo
bash
#!/bin/bash
# backup_docker.sh
FECHA=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR="/srv/backups/docker_${FECHA}"
mkdir -p $BACKUP_DIR
# Backup de configuraciones
docker inspect $(docker ps -aq) > "$BACKUP_DIR/containers.json"
docker network ls -q | xargs docker network inspect > "$BACKUP_DIR/networks.json"
# Backup de volúmenes
docker volume ls --format "{{.Name}}" | while read VOL; do
docker run --rm -v $VOL:/data -v $BACKUP_DIR:/backup alpine \
tar czf /backup/${VOL}.tar.gz -C /data .
done
echo "Backup en: $BACKUP_DIR"
4. Usa Docker Compose para TODO
yaml
# docker-compose.yml
version: '3.8'
services:
portainer:
image: portainer/portainer-ce:latest
container_name: portainer
restart: unless-stopped
ports:
- "9000:9000"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- portainer_data:/data
labels:
- "backup=daily"
- "critical=yes"
volumes:
portainer_data:
5. Documenta tu infraestructura
markdown
# MI INFRAESTRUCTURA DOCKER.md ## Contenedores críticos: 1. **Portainer** - Gestión Docker - Puerto: 9000 (HTTP) - Volumen: portainer_data - Comando recreación: docker-compose up -d 2. **Jellyfin** - Servidor multimedia - Puerto: 8096 - Volumen: jellyfin_config, jellyfin_cache - Variables: PUID=1000, PGID=100
Mi guía definitiva para resetear Portainer en OMV
Paso 1: Diagnóstico seguro
bash
# Ver TODO sin tocar nada
docker ps -a --format "table {{.Names}}\t{{.Image}}\t{{.Status}}"
docker volume ls
docker network ls
Paso 2: Backup selectivo
bash
# Backup SOLO de Portainer docker run --rm \ -v portainer_data:/source \ -v $(pwd):/backup \ alpine tar czf /backup/portainer_backup_$(date +%Y%m%d).tar.gz -C /source .
Paso 3: Eliminación quirúrgica
bash
# Detener solo Portainer docker stop portainer 2>/dev/null || true # Eliminar solo Portainer docker rm portainer 2>/dev/null || true # Eliminar solo su volumen docker volume rm portainer_data 2>/dev/null || true
Paso 4: Reinstalación limpia
bash
docker volume create portainer_data docker run -d \ -p 9000:9000 \ --name portainer \ --restart unless-stopped \ -v /var/run/docker.sock:/var/run/docker.sock \ -v portainer_data:/data \ portainer/portainer-ce:latest
Paso 5: Verificación
bash
# Esperar 30 segundos sleep 30 # Verificar curl -s http://localhost:9000 | grep -i portainer && \ echo "✅ Portainer funcionando" || echo "❌ Error"
Reflexión final
Aprendí más sobre Docker en esas 4 horas de crisis que en 6 meses de uso normal. El costo fue alto: perdí tiempo, paciencia y algo de fe en mis habilidades técnicas.
Pero hoy tengo:
- Un sistema de backup automatizado
- Todos mis contenedores en Docker Compose
- Documentación actualizada
- Scripts de recuperación para cada servicio
La moraleja: En administración de sistemas, la paranoia es una virtud. El comando que escribes a las 2 AM, frustrado y con sueño, puede destruir lo que construiste en meses.
Mi consejo para ti, que lees esto: Haz backup hoy. Etiqueta todo. Documenta cada cambio. Tu yo del futuro te lo agradecerá.
¿Cometiste errores similares? ¿Tienes mejores prácticas que compartir? Este artículo es mi confesión pública y mi contribución a la comunidad. Que mi dolor sea tu aprendizaje.
