{"id":3303,"date":"2026-01-21T02:17:23","date_gmt":"2026-01-21T00:17:23","guid":{"rendered":"https:\/\/www.sinetiqueta.com\/?p=3303"},"modified":"2026-01-21T02:29:19","modified_gmt":"2026-01-21T00:29:19","slug":"guia-de-recuperacion-de-la-contrasena-de-portainer-ce-en-omv","status":"publish","type":"post","link":"https:\/\/www.sinetiqueta.com\/?p=3303","title":{"rendered":"Gu\u00eda de recuperaci\u00f3n de la contrase\u00f1a de Portainer-CE en OMV"},"content":{"rendered":"\n<p><em>Una cr\u00f3nica en primera persona sobre c\u00f3mo casi destruyo mi servidor dom\u00e9stico intentando resetear una contrase\u00f1a<\/em><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Cap\u00edtulo 1: El problema inocente<\/strong><\/h2>\n\n\n\n<p>Todo comenz\u00f3 un martes por la tarde. Necesitaba acceder a Portainer en mi OpenMediaVault (OMV) para gestionar unos contenedores, pero por m\u00e1s que intentaba, la contrase\u00f1a no funcionaba. \u00abNo pasa nada\u00bb, pens\u00e9, \u00abun simple reset y listo\u00bb.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Cap\u00edtulo 2: La falsa seguridad del grupo root<\/strong><\/h2>\n\n\n\n<p>Mi primer error fue asumir que ser usuario del grupo&nbsp;<code>root<\/code>&nbsp;en OMV me daba superpoderes. En la interfaz web de OMV, yo era administrador. En la terminal, tras a\u00f1adir mi usuario al grupo root, me sent\u00eda invencible.<\/p>\n\n\n\n<p>bash<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><em># Cre\u00eda que esto me hac\u00eda root<\/em>\nusermod -aG root mi_usuario<\/pre>\n\n\n\n<p>La realidad fue cruel:&nbsp;<strong>Linux no funciona as\u00ed<\/strong>. Ser parte del grupo root no te da privilegios de superusuario. Necesitas&nbsp;<code>sudo<\/code>&nbsp;o convertirte realmente en root:<\/p>\n\n\n\n<p>bash<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><em># La realidad<\/em>\nsudo -i\n<em># O<\/em>\nsu -<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Cap\u00edtulo 3: El caos de los contenedores duplicados<\/strong><\/h2>\n\n\n\n<p>Al investigar mi sistema, descubr\u00ed algo aterrador:<\/p>\n\n\n\n<p>bash<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">docker ps -a | grep portainer<\/pre>\n\n\n\n<p>Hab\u00eda&nbsp;<strong>dos instancias de Portainer<\/strong>&nbsp;corriendo. \u00bfC\u00f3mo llegaron ah\u00ed? No lo s\u00e9. Pero ambas compart\u00edan el mismo volumen&nbsp;<code>portainer_data<\/code>. Esto explicaba por qu\u00e9 cada reset era in\u00fatil: una instancia pisaba los cambios de la otra.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Cap\u00edtulo 4: La eliminaci\u00f3n desesperada<\/strong><\/h2>\n\n\n\n<p>Frustrado, decid\u00ed tomar medidas dr\u00e1sticas:<\/p>\n\n\n\n<p>bash<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><em># \u00a1Error! Esto detuvo TODOS mis contenedores<\/em>\ndocker stop $(docker ps -aq)\n\n<em># \u00a1Error mayor! Esto los elimin\u00f3 a TODOS<\/em>\ndocker rm $(docker ps -aq)<\/pre>\n\n\n\n<p>En mi defensa, estaba estresado. Pero las consecuencias fueron inmediatas: mi servidor de Jellyfin dej\u00f3 de servir pel\u00edculas, mi instancia de Nextcloud dej\u00f3 de sincronizar archivos, y mi reverse proxy dej\u00f3 de funcionar.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Cap\u00edtulo 5: La traici\u00f3n de las im\u00e1genes hu\u00e9rfanas<\/strong><\/h2>\n\n\n\n<p>Tras el desastre, intent\u00e9 limpiar las im\u00e1genes:<\/p>\n\n\n\n<p>bash<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><em># \u00a1CUIDADO CON ESTO!<\/em>\ndocker image prune -a -f<\/pre>\n\n\n\n<p>Este comando elimin\u00f3 im\u00e1genes \u00abno utilizadas\u00bb. El problema: algunas de mis contenedores usaban im\u00e1genes antiguas que no estaban etiquetadas como&nbsp;<code>latest<\/code>. Perd\u00ed la capacidad de recrear ciertos contenedores exactamente como estaban.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Cap\u00edtulo 6: El misterio del puerto 9000<\/strong><\/h2>\n\n\n\n<p>Con Portainer reinstalado, intent\u00e9 acceder:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Intent\u00e9\u00a0<code>https:\/\/mi-omv:9443<\/code>\u00a0&#8211; nada<\/li>\n\n\n\n<li>Intent\u00e9\u00a0<code>https:\/\/mi-omv:9000<\/code>\u00a0&#8211; nada<\/li>\n\n\n\n<li>Intent\u00e9\u00a0<code>http:\/\/mi-omv:9443<\/code>\u00a0&#8211; nada<\/li>\n<\/ul>\n\n\n\n<p>La soluci\u00f3n era simple pero contraintuitiva:&nbsp;<strong>Portainer por defecto usa HTTP en el puerto 9000<\/strong>:<\/p>\n\n\n\n<p>text<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">http:\/\/mi-omv:9000<\/pre>\n\n\n\n<p>Una vez dentro, la pantalla de creaci\u00f3n de usuario apareci\u00f3 milagrosamente.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Cap\u00edtulo 7: El costo real<\/strong><\/h2>\n\n\n\n<p>Despu\u00e9s de 4 horas de trabajo, logr\u00e9:<\/p>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li>Recuperar Portainer \u2713<\/li>\n\n\n\n<li>Perder 3 contenedores cr\u00edticos \u2717<\/li>\n\n\n\n<li>Interrumpir servicios por 2 horas \u2717<\/li>\n\n\n\n<li>Perder configuraciones personalizadas \u2717<\/li>\n<\/ol>\n\n\n\n<p>Los vol\u00famenes de datos segu\u00edan intactos, pero las configuraciones de los contenedores (puertos mapeados, variables de entorno, redes) hab\u00edan desaparecido.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Lecciones aprendidas (la manera dif\u00edcil)<\/strong><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>1. Nunca uses comandos de destrucci\u00f3n masiva<\/strong><\/h3>\n\n\n\n<p>bash<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><em># &#x274c; NUNCA HAGAS ESTO<\/em>\ndocker stop $(docker ps -aq)\ndocker rm $(docker ps -aq)\ndocker system prune -a\n\n<em># &#x2705; HAZ ESTO EN CAMBIO<\/em>\ndocker stop nombre_contenedor\ndocker rm nombre_contenedor\ndocker image prune --filter \"until=24h\"<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>2. Etiqueta TODO como si tu vida dependiera de ello<\/strong><\/h3>\n\n\n\n<p>bash<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><em># Al crear contenedores<\/em>\ndocker run -d \\\n  --name mi_contenedor \\\n  --label \"backup=critical\" \\\n  --label \"owner=yo\" \\\n  --label \"do_not_delete=true\" \\\n  mi_imagen:tag\n\n<em># Luego puedes filtrar por etiquetas<\/em>\ndocker ps -a --filter \"label=backup=critical\"<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>3. Crea un sistema de backup ANTES de necesitarlo<\/strong><\/h3>\n\n\n\n<p>bash<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">#!\/bin\/bash\n<em># backup_docker.sh<\/em>\nFECHA=$(date +%Y%m%d_%H%M%S)\nBACKUP_DIR=\"\/srv\/backups\/docker_${FECHA}\"\nmkdir -p $BACKUP_DIR\n\n<em># Backup de configuraciones<\/em>\ndocker inspect $(docker ps -aq) &gt; \"$BACKUP_DIR\/containers.json\"\ndocker network ls -q | xargs docker network inspect &gt; \"$BACKUP_DIR\/networks.json\"\n\n<em># Backup de vol\u00famenes<\/em>\ndocker volume ls --format \"{{.Name}}\" | while read VOL; do\n  docker run --rm -v $VOL:\/data -v $BACKUP_DIR:\/backup alpine \\\n    tar czf \/backup\/${VOL}.tar.gz -C \/data .\ndone\n\necho \"Backup en: $BACKUP_DIR\"<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>4. Usa Docker Compose para TODO<\/strong><\/h3>\n\n\n\n<p>yaml<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><em># docker-compose.yml<\/em>\nversion: '3.8'\nservices:\n  portainer:\n    image: portainer\/portainer-ce:latest\n    container_name: portainer\n    restart: unless-stopped\n    ports:\n      - \"9000:9000\"\n    volumes:\n      - \/var\/run\/docker.sock:\/var\/run\/docker.sock\n      - portainer_data:\/data\n    labels:\n      - \"backup=daily\"\n      - \"critical=yes\"\n\nvolumes:\n  portainer_data:<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>5. Documenta tu infraestructura<\/strong><\/h3>\n\n\n\n<p>markdown<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"># MI INFRAESTRUCTURA DOCKER.md\n\n## Contenedores cr\u00edticos:\n1. <strong>**Portainer**<\/strong> - Gesti\u00f3n Docker\n   - Puerto: 9000 (HTTP)\n   - Volumen: portainer_data\n   - Comando recreaci\u00f3n: docker-compose up -d\n\n2. <strong>**Jellyfin**<\/strong> - Servidor multimedia\n   - Puerto: 8096\n   - Volumen: jellyfin_config, jellyfin_cache\n   - Variables: PUID=1000, PGID=100<\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Mi gu\u00eda definitiva para resetear Portainer en OMV<\/strong><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Paso 1: Diagn\u00f3stico seguro<\/strong><\/h3>\n\n\n\n<p>bash<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><em># Ver TODO sin tocar nada<\/em>\ndocker ps -a --format \"table {{.Names}}\\t{{.Image}}\\t{{.Status}}\"\ndocker volume ls\ndocker network ls<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Paso 2: Backup selectivo<\/strong><\/h3>\n\n\n\n<p>bash<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><em># Backup SOLO de Portainer<\/em>\ndocker run --rm \\\n  -v portainer_data:\/source \\\n  -v $(pwd):\/backup \\\n  alpine tar czf \/backup\/portainer_backup_$(date +%Y%m%d).tar.gz -C \/source .<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Paso 3: Eliminaci\u00f3n quir\u00fargica<\/strong><\/h3>\n\n\n\n<p>bash<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><em># Detener solo Portainer<\/em>\ndocker stop portainer 2&gt;\/dev\/null || true\n\n<em># Eliminar solo Portainer<\/em>\ndocker rm portainer 2&gt;\/dev\/null || true\n\n<em># Eliminar solo su volumen<\/em>\ndocker volume rm portainer_data 2&gt;\/dev\/null || true<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Paso 4: Reinstalaci\u00f3n limpia<\/strong><\/h3>\n\n\n\n<p>bash<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">docker volume create portainer_data\ndocker run -d \\\n  -p 9000:9000 \\\n  --name portainer \\\n  --restart unless-stopped \\\n  -v \/var\/run\/docker.sock:\/var\/run\/docker.sock \\\n  -v portainer_data:\/data \\\n  portainer\/portainer-ce:latest<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Paso 5: Verificaci\u00f3n<\/strong><\/h3>\n\n\n\n<p>bash<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><em># Esperar 30 segundos<\/em>\nsleep 30\n\n<em># Verificar<\/em>\ncurl -s http:\/\/localhost:9000 | grep -i portainer &amp;&amp; \\\n  echo \"&#x2705; Portainer funcionando\" || echo \"&#x274c; Error\"<\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Reflexi\u00f3n final<\/strong><\/h2>\n\n\n\n<p>Aprend\u00ed m\u00e1s sobre Docker en esas 4 horas de crisis que en 6 meses de uso normal. El costo fue alto: perd\u00ed tiempo, paciencia y algo de fe en mis habilidades t\u00e9cnicas.<\/p>\n\n\n\n<p>Pero hoy tengo:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Un sistema de backup automatizado<\/li>\n\n\n\n<li>Todos mis contenedores en Docker Compose<\/li>\n\n\n\n<li>Documentaci\u00f3n actualizada<\/li>\n\n\n\n<li>Scripts de recuperaci\u00f3n para cada servicio<\/li>\n<\/ul>\n\n\n\n<p><strong>La moraleja<\/strong>: En administraci\u00f3n de sistemas, la paranoia es una virtud. El comando que escribes a las 2 AM, frustrado y con sue\u00f1o, puede destruir lo que construiste en meses.<\/p>\n\n\n\n<p>Mi consejo para ti, que lees esto:&nbsp;<strong>Haz backup hoy. Etiqueta todo. Documenta cada cambio.<\/strong>&nbsp;Tu yo del futuro te lo agradecer\u00e1.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><em>\u00bfCometiste errores similares? \u00bfTienes mejores pr\u00e1cticas que compartir? Este art\u00edculo es mi confesi\u00f3n p\u00fablica y mi contribuci\u00f3n a la comunidad. Que mi dolor sea tu aprendizaje.<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Una cr\u00f3nica en primera persona sobre c\u00f3mo casi destruyo mi servidor dom\u00e9stico intentando resetear una contrase\u00f1a Cap\u00edtulo 1: El problema inocente Todo comenz\u00f3 un martes por la tarde. Necesitaba acceder a Portainer en mi OpenMediaVault (OMV) para gestionar unos contenedores,&#8230; <a href=\"https:\/\/www.sinetiqueta.com\/?p=3303\" class=\"readmore\">Leer m\u00e1s<span class=\"screen-reader-text\">Gu\u00eda de recuperaci\u00f3n de la contrase\u00f1a de Portainer-CE en OMV<\/span><span class=\"fa fa-angle-double-right\" aria-hidden=\"true\"><\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":3304,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[324,376,496],"tags":[144,497],"class_list":["post-3303","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-openmediavault","category-portainer","category-portainer-ce","tag-contrasena","tag-password","content-layout-excerpt-thumb"],"jetpack_featured_media_url":"https:\/\/www.sinetiqueta.com\/wp-content\/uploads\/2026\/01\/ChatGPT-Image-Jan-21-2026-01_15_45-AM.png","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.sinetiqueta.com\/index.php?rest_route=\/wp\/v2\/posts\/3303","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.sinetiqueta.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.sinetiqueta.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.sinetiqueta.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.sinetiqueta.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=3303"}],"version-history":[{"count":2,"href":"https:\/\/www.sinetiqueta.com\/index.php?rest_route=\/wp\/v2\/posts\/3303\/revisions"}],"predecessor-version":[{"id":3306,"href":"https:\/\/www.sinetiqueta.com\/index.php?rest_route=\/wp\/v2\/posts\/3303\/revisions\/3306"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.sinetiqueta.com\/index.php?rest_route=\/wp\/v2\/media\/3304"}],"wp:attachment":[{"href":"https:\/\/www.sinetiqueta.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3303"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.sinetiqueta.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3303"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.sinetiqueta.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3303"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}