{"id":1557,"date":"2026-09-11T18:49:17","date_gmt":"2026-09-11T21:49:17","guid":{"rendered":"https:\/\/www.linuxpro.com.br\/?p=1557"},"modified":"2026-09-11T18:54:03","modified_gmt":"2026-09-11T21:54:03","slug":"uptime-kuma-no-linux-monitoramento-self-hosted-com-docker-e-nginx","status":"publish","type":"post","link":"https:\/\/www.linuxpro.com.br\/es\/2026\/09\/uptime-kuma-no-linux-monitoramento-self-hosted-com-docker-e-nginx\/","title":{"rendered":"Uptime Kuma en Linux: monitorizaci\u00f3n autoalojada con Docker y Nginx"},"content":{"rendered":"<p><img fetchpriority=\"high\" decoding=\"async\" src=\"\/wp-content\/uploads\/2026\/09\/uptime-kuma-linux-monitoramento-v1.webp\" alt=\"Mascote LinuxPro acompanhando o painel do Uptime Kuma em uma sala de servidores\" width=\"1440\" height=\"810\" loading=\"eager\"><\/p>\n<p>Cuando un sitio, una API o un servidor deja de responder, descubrirlo por el usuario llega demasiado tarde. O <strong>Uptime Kuma<\/strong> es una herramienta de monitorizaci\u00f3n <em>self-hosted<\/em> con interfaz web: ejecuta comprobaciones a intervalos regulares, registra el hist\u00f3rico y env\u00eda alertas cuando un servicio cambia de estado. En esta gu\u00eda, lo instalaremos con Docker Compose, lo publicaremos con Nginx y configuraremos los primeros monitores con seguridad.<\/p>\n<h2>Por qu\u00e9 usar Uptime Kuma<\/h2>\n<p>Kuma tiene sentido cuando necesitas saber r\u00e1pidamente si algo que consume el usuario sigue accesible: un sitio web, una API, un puerto TCP, una resoluci\u00f3n DNS o la finalizaci\u00f3n de un trabajo. Re\u00fane la comprobaci\u00f3n, el historial, el cambio de estado, la notificaci\u00f3n y una p\u00e1gina de estado en una interfaz sencilla. Como es <em>self-hosted<\/em>, las URL, las credenciales de notificaci\u00f3n y el historial permanecen en tu infraestructura, en lugar de en una cuenta de monitorizaci\u00f3n de terceros.<\/p>\n<p>Esto no lo convierte en un sustituto universal. El tiempo de actividad no es observabilidad completa: un endpoint puede responder y aun as\u00ed estar lento, sin espacio en disco o con una cola acumulada. La mejor elecci\u00f3n es usarlo como la capa de disponibilidad y alerta r\u00e1pida, junto con m\u00e9tricas y registros cuando la operaci\u00f3n necesite un diagn\u00f3stico profundo.<\/p>\n<h2>En qu\u00e9 lenguaje est\u00e1 desarrollado<\/h2>\n<p>Uptime Kuma es una aplicaci\u00f3n para <strong>Node.js<\/strong>, predominantemente en JavaScript. La interfaz web utiliza <strong>Vue 3<\/strong> e <strong>Vite<\/strong>; el repositorio tambi\u00e9n incluye TypeScript en la cadena de desarrollo. Por eso la ejecuci\u00f3n sin Docker exige Node.js 20.4 o superior, pero la ruta con contenedor evita instalar Node y dependencias del proyecto directamente en el host.<\/p>\n<h2>Qu\u00e9 monitoriza Uptime Kuma<\/h2>\n<p>El proyecto es una alternativa ligera para acompanhar la disponibilidad de servicios sin externalizar el panel. Admite monitores HTTP(S), TCP, b\u00fasqueda de palabras clave y consulta JSON en HTTP(S), WebSocket, ping, DNS, <em>push<\/em>, servidores Steam y contenedores Docker. Tambi\u00e9n ofrece p\u00e1ginas p\u00fablicas de estado, gr\u00e1fica de latencia, informaci\u00f3n de certificado, soporte para proxy, autenticaci\u00f3n de dos factores e integraciones de notificaci\u00f3n.<\/p>\n<p>No sustituye a m\u00e9tricas detalladas: para CPU, memoria, disco y series temporales de servidores, comb\u00ednalo con <a href=\"\/es\/2026\/09\/monitorando-servidores-linux-com-prometheus\/\">Prometheus y Node Exporter<\/a>. Kuma responde a otra pregunta: \u201c\u00bfeste endpoint est\u00e1 accesible ahora y alguien fue avisado?\u201d.<\/p>\n<h2>Instala Docker, Compose y Nginx en Ubuntu<\/h2>\n<p>Los comandos siguientes son para Ubuntu 22.04 LTS, 24.04 LTS o posterior soportado por Docker. Utilizan el repositorio oficial de Docker, que ofrece el Engine y el plugin moderno <code data-no-translation=\"\">docker compose<\/code>. En una m\u00e1quina que ya ejecuta contenedores, no elimines ni sustituyas paquetes sin revisar el impacto: la documentaci\u00f3n de Docker lista <code data-no-translation=\"\">docker.io<\/code>, <code data-no-translation=\"\">docker-compose<\/code>, <code data-no-translation=\"\">containerd<\/code> e <code data-no-translation=\"\">runc<\/code> entre los paquetes que pueden entrar en conflicto con la instalaci\u00f3n oficial.<\/p>\n<p>En un host nuevo, instala los requisitos previos, Nginx y la clave del repositorio:<\/p>\n<pre data-no-translation=\"\"><code class=\"language-bash\" data-no-translation=\"\">sudo apt update\nsudo apt install -y ca-certificates curl nginx\nsudo install -m 0755 -d \/etc\/apt\/keyrings\nsudo curl -fsSL https:\/\/download.docker.com\/linux\/ubuntu\/gpg \n  -o \/etc\/apt\/keyrings\/docker.asc\nsudo chmod a+r \/etc\/apt\/keyrings\/docker.asc<\/code><\/pre>\n<p>A\u00f1ade la fuente APT. El comando lee autom\u00e1ticamente el nombre clave y la arquitectura de la instalaci\u00f3n actual:<\/p>\n<pre data-no-translation=\"\"><code class=\"language-bash\" data-no-translation=\"\">sudo tee \/etc\/apt\/sources.list.d\/docker.sources &lt;&lt;EOF\nTypes: deb\nURIs: https:\/\/download.docker.com\/linux\/ubuntu\nSuites: $(. \/etc\/os-release &amp;&amp; echo \"${UBUNTU_CODENAME:-$VERSION_CODENAME}\")\nComponents: stable\nArchitectures: $(dpkg --print-architecture)\nSigned-By: \/etc\/apt\/keyrings\/docker.asc\nEOF\n\nsudo apt update<\/code><\/pre>\n<p>Instale Docker Engine, Compose y habilite los servicios:<\/p>\n<pre data-no-translation=\"\"><code class=\"language-bash\" data-no-translation=\"\">sudo apt install -y docker-ce docker-ce-cli containerd.io \n  docker-buildx-plugin docker-compose-plugin\nsudo systemctl enable --now docker nginx\nsudo docker run hello-world\ndocker compose version<\/code><\/pre>\n<p>El primer comando de prueba descarga una imagen peque\u00f1a y se cierra; confirma que el daemon funciona. Mant\u00e9ngase <code data-no-translation=\"\">sudo<\/code> en los comandos de Docker o configure el acceso posterior a la instalaci\u00f3n de forma consciente: pertenecer al grupo <code data-no-translation=\"\">docker<\/code> equivale, en la pr\u00e1ctica, a tener poder administrativo sobre el host. Antes de exponer puertos de contenedores, revise tambi\u00e9n el cortafuegos: las reglas publicadas por Docker pueden sortear las reglas de UFW.<\/p>\n<h2>Antes de empezar<\/h2>\n<p>Necesita un host Linux con Docker Engine y el plugin Docker Compose. El ejemplo usa un directorio propio en <code data-no-translation=\"\">\/opt<\/code>, un volumen local para los datos y el puerto del servicio limitado a <code data-no-translation=\"\">127.0.0.1<\/code>. As\u00ed, la interfaz no queda abierta directamente en internet; Nginx ser\u00e1 la \u00fanica puerta de entrada.<\/p>\n<p>La base de datos de Uptime Kuma se encuentra en el directorio de datos. No coloque ese directorio en NFS: el proyecto no lo admite, porque los bloqueos de archivo necesarios para SQLite no son adecuados en ese escenario. Incluya <code data-no-translation=\"\">\/opt\/uptime-kuma\/data<\/code> en la copia de seguridad del servidor.<\/p>\n<h2>Levanta Uptime Kuma con Docker Compose<\/h2>\n<p>Cree el directorio y el archivo <code data-no-translation=\"\">compose.yaml<\/code>:<\/p>\n<pre data-no-translation=\"\"><code class=\"language-bash\" data-no-translation=\"\">sudo install -d -m 0755 \/opt\/uptime-kuma\nsudoedit \/opt\/uptime-kuma\/compose.yaml<\/code><\/pre>\n<p>Use esta configuraci\u00f3n. La etiqueta <code data-no-translation=\"\">:2<\/code> sigue la versi\u00f3n m\u00e1s reciente de la l\u00ednea 2 y es la recomendada por el proyecto. Para fijar una versi\u00f3n concreta, use una etiqueta <code data-no-translation=\"\">2.x.x<\/code>. No use <code data-no-translation=\"\">:latest<\/code> como atajo para la versi\u00f3n 2: ese nombre est\u00e1 obsoleto y a\u00fan apunta a la rama 1.<\/p>\n<pre data-no-translation=\"\"><code class=\"language-yaml\" data-no-translation=\"\">services:\n  uptime-kuma:\n    image: louislam\/uptime-kuma:2\n    container_name: uptime-kuma\n    restart: unless-stopped\n    volumes:\n      - .\/data:\/app\/data\n    ports:\n      - \"127.0.0.1:3001:3001\"<\/code><\/pre>\n<p>Inicie y confirme el estado:<\/p>\n<pre data-no-translation=\"\"><code class=\"language-bash\" data-no-translation=\"\">cd \/opt\/uptime-kuma\nsudo docker compose up -d\nsudo docker compose ps\ncurl -I http:\/\/127.0.0.1:3001<\/code><\/pre>\n<p>En la primera apertura, cree la cuenta administrativa. Guarde esa contrase\u00f1a en un gestor de contrase\u00f1as y active 2FA en los ajustes. Para seguir el inicio, use <code data-no-translation=\"\">sudo docker compose logs -f<\/code>.<\/p>\n<h2>Publica con Nginx y HTTPS<\/h2>\n<p>Elija un subdominio, por ejemplo <code data-no-translation=\"\">status-admin.exemplo.com<\/code>, y apunte el DNS al servidor. Uptime Kuma debe quedar en la ra\u00edz de ese subdominio; no admite la instalaci\u00f3n en un subdirectorio como <code data-no-translation=\"\">exemplo.com\/kuma\/<\/code>.<\/p>\n<p>Primero, emita un certificado TLS para el subdominio mediante el m\u00e9todo empleado en su servidor. <strong>No abra la interfaz ni cree la cuenta administrativa antes de que HTTPS est\u00e9 activo<\/strong>: el inicio de sesi\u00f3n por HTTP expone la credencial. Despu\u00e9s, cree el <em>server block<\/em> final. Ajuste las rutas del certificado a su entorno; la compatibilidad con WebSocket es importante para que la interfaz se actualice en tiempo real:<\/p>\n<pre data-no-translation=\"\"><code class=\"language-nginx\" data-no-translation=\"\">server {\n    listen 80;\n    server_name status-admin.exemplo.com;\n    return 301 https:\/\/$host$request_uri;\n}\n\nserver {\n    listen 443 ssl;\n    server_name status-admin.exemplo.com;\n\n    ssl_certificate \/etc\/letsencrypt\/live\/status-admin.exemplo.com\/fullchain.pem;\n    ssl_certificate_key \/etc\/letsencrypt\/live\/status-admin.exemplo.com\/privkey.pem;\n\n    location \/ {\n        proxy_pass http:\/\/127.0.0.1:3001;\n        proxy_http_version 1.1;\n        proxy_set_header Upgrade $http_upgrade;\n        proxy_set_header Connection \"upgrade\";\n        proxy_set_header Host $host;\n        proxy_set_header X-Real-IP $remote_addr;\n        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n        proxy_set_header X-Forwarded-Proto $scheme;\n    }\n}<\/code><\/pre>\n<p>Pruebe antes de recargar:<\/p>\n<pre data-no-translation=\"\"><code class=\"language-bash\" data-no-translation=\"\">sudo nginx -t\nsudo systemctl reload nginx<\/code><\/pre>\n<p>Valide <code data-no-translation=\"\">https:\/\/status-admin.exemplo.com<\/code> y solo entonces haga el primer inicio de sesi\u00f3n. Al activar la opci\u00f3n <em>Trust Proxy<\/em> en Kuma, h\u00e1galo solamente si toda solicitud llega a trav\u00e9s de un proxy inverso que usted controla; de lo contrario, los encabezados reenviados pueden falsificar la IP de origen. Para una revisi\u00f3n de Nginx en Debian o Ubuntu, consulte nuestra gu\u00eda sobre <a href=\"\/es\/2026\/09\/nginx-varias-versoes-php-debian-ubuntu\/\">Nginx y versiones de PHP<\/a>.<\/p>\n<h2>Crea monitores que realmente avisen algo \u00fatil<\/h2>\n<p>En el panel, haga clic en <strong>Add New Monitor<\/strong>. Comience con pocas comprobaciones que representen un recorrido real:<\/p>\n<ul>\n<li><strong>HTTP(S):<\/strong> la URL p\u00fablica del sitio o de la API. Defina los c\u00f3digos HTTP aceptados seg\u00fan la aplicaci\u00f3n.<\/li>\n<li><strong>Keyword:<\/strong> una p\u00e1gina de salud que deba contener un marcador conocido, como <code data-no-translation=\"\">ok<\/code>.<\/li>\n<li><strong>TCP:<\/strong> el puerto de un servicio que debe aceptar conexiones, como SMTP o una aplicaci\u00f3n interna.<\/li>\n<li><strong>DNS:<\/strong> un registro cr\u00edtico, \u00fatil para detectar errores de resoluci\u00f3n o cambios inesperados.<\/li>\n<li><strong>Push:<\/strong> trabajos de copia de seguridad, sincronizaci\u00f3n o mantenimiento: el job llama a la URL exclusiva proporcionada por Kuma al finalizar. Si la se\u00f1al no llega dentro de la ventana configurada, el monitor entrar\u00e1 en estado de alerta.<\/li>\n<\/ul>\n<p>Evita intervalos agresivos por defecto. Un monitor con muchos falsos positivos se ignora r\u00e1pidamente. Define el timeout, los reintentos y el intervalo seg\u00fan la criticidad y la capacidad del servicio monitorizado.<\/p>\n<h2>Configura notificaciones antes del fallo<\/h2>\n<p>Abre <strong>Settings \u2192 Notifications<\/strong>, registra el canal elegido y utiliza el bot\u00f3n de prueba. Uptime Kuma dispone de integraciones para SMTP, Telegram, Discord, Slack, Gotify, Pushover y muchos otros servicios. Despu\u00e9s, asocia la notificaci\u00f3n a cada monitor: crear el canal por s\u00ed solo no env\u00eda alertas.<\/p>\n<p>Empieza con una ruta que alguien realmente supervise. Para servicios cr\u00edticos, utiliza m\u00e1s de un destino y documenta qui\u00e9n responde a cada tipo de alerta.<\/p>\n<h2>P\u00e1gina p\u00fablica de estado, sin exponer la administraci\u00f3n<\/h2>\n<p>En <strong>Status Pages<\/strong>, crea una p\u00e1gina con los monitores que pueden mostrarse al p\u00fablico. Est\u00e1 separada del panel administrativo: publique solo lo que sea apropiado revelar. Una p\u00e1gina de estado es \u00fatil para reducir llamadas durante una indisponibilidad, pero no debe listar servicios internos, direcciones privadas o detalles de infraestructura.<\/p>\n<h2>Actualizaci\u00f3n y copia de seguridad<\/h2>\n<p>Realice una copia de seguridad del directorio de datos antes de actualizar. En una ventana de mantenimiento, el flujo b\u00e1sico es:<\/p>\n<pre data-no-translation=\"\"><code class=\"language-bash\" data-no-translation=\"\">cd \/opt\/uptime-kuma\nsudo docker compose pull\nsudo docker compose up -d --force-recreate\nsudo docker compose logs --tail=100<\/code><\/pre>\n<p>Consulte las <a href=\"https:\/\/github.com\/louislam\/uptime-kuma\/releases\">notas de la versi\u00f3n oficiales<\/a> antes de actualizar, sobre todo en cambios de versi\u00f3n principal. El proyecto mantiene tambi\u00e9n una <a href=\"https:\/\/github.com\/louislam\/uptime-kuma\/wiki\/Migration-From-v1-To-v2\">gu\u00eda espec\u00edfica para la migraci\u00f3n de v1 a v2<\/a>.<\/p>\n<h2>Medidas de seguridad<\/h2>\n<ul>\n<li>No publique el puerto <code data-no-translation=\"\">3001<\/code> directamente; mant\u00e9ngalo detr\u00e1s de <code data-no-translation=\"\">127.0.0.1<\/code> HTTPS y autenticaci\u00f3n.<\/li>\n<li>Use contrase\u00f1a exclusiva, 2FA y actualizaciones peri\u00f3dicas.<\/li>\n<li>Proteja la copia de seguridad de <code data-no-translation=\"\">data<\/code>: puede contener URL, tokens de notificaci\u00f3n e informaci\u00f3n sobre su infraestructura.<\/li>\n<li>El monitor de contenedores puede requerir acceso al socket Docker. Este socket controla el daemon; no lo monte sin comprender el impacto y nunca trate esa instancia como un panel p\u00fablico.<\/li>\n<\/ul>\n<h2>Alternativas: cu\u00e1l usar en cada escenario<\/h2>\n<ul>\n<li><strong><a href=\"https:\/\/github.com\/TwiN\/gatus\">Gatus<\/a>:<\/strong> monitorizaci\u00f3n <em>self-hosted<\/em> escrito en Go y definido en un archivo de configuraci\u00f3n. Es una buena opci\u00f3n para equipos que prefieren revisar los checks en Git y aplicar la configuraci\u00f3n como c\u00f3digo.<\/li>\n<li><strong><a href=\"https:\/\/prometheus.io\/docs\/prometheus\/latest\/configuration\/configuration\/#blackbox_config\">Prometheus con Blackbox Exporter<\/a>:<\/strong> recopila m\u00e9tricas de probes HTTP, TCP, ICMP y DNS e integra alertas en el ecosistema Prometheus. El\u00edgelo cuando los datos deben convertirse en series temporales, cuadros de mando y reglas m\u00e1s sofisticadas.<\/li>\n<li><strong><a href=\"https:\/\/www.zabbix.com\/\">Zabbix<\/a>:<\/strong> plataforma m\u00e1s amplia para hosts, red, descubrimiento y plantillas. Sirve para inventarios m\u00e1s grandes; para pocos endpoints, suele requerir m\u00e1s operaci\u00f3n que Kuma.<\/li>\n<li><strong><a href=\"https:\/\/cachethq.io\/\">Cachet<\/a>:<\/strong> est\u00e1 enfocado en la comunicaci\u00f3n de incidentes y en una p\u00e1gina p\u00fablica de estado. Puede complementar a un monitor, pero no debe elegirse por s\u00ed solo esperando el mismo conjunto de probes que Kuma.<\/li>\n<\/ul>\n<p>En resumen: elige Kuma por su interfaz r\u00e1pida y su conjunto de checks listos; Gatus para configuraci\u00f3n versionada; Prometheus\/Blackbox para m\u00e9tricas y alertas como c\u00f3digo; y Zabbix cuando la necesidad es monitorizar toda la infraestructura.<\/p>\n<h2>D\u00f3nde encaja Kuma en tu operaci\u00f3n<\/h2>\n<p>Uptime Kuma es excelente como capa sencilla de disponibilidad y alerta: un panel para sus endpoints, jobs y p\u00e1ginas de estado. Para una monitorizaci\u00f3n profunda de hosts, completa la estrategia con <a href=\"\/es\/2026\/09\/monitorando-servidores-linux-com-prometheus\/\">Prometheus<\/a>; para conocer alternativas tradicionales, consulta las historias de <a href=\"\/es\/2026\/09\/a-historia-do-nagios\/\">Nagios<\/a> y de <a href=\"\/es\/2026\/09\/a-historia-do-zabbix\/\">Zabbix<\/a>. La instalaci\u00f3n oficial, la configuraci\u00f3n avanzada de proxy y el c\u00f3digo fuente est\u00e1n en el <a href=\"https:\/\/github.com\/louislam\/uptime-kuma\">repositorio de Uptime Kuma<\/a>.<\/p>","protected":false},"excerpt":{"rendered":"<p>Instala Uptime Kuma con Docker Compose, publ\u00edcalo con Nginx y configura alertas, status page y backup con seguridad.<\/p>","protected":false},"author":0,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[21,2,120,3],"tags":[156,126,240,466,203,465,5,464],"class_list":["post-1557","post","type-post","status-publish","format-standard","hentry","category-infra","category-linux","category-servidores","category-ubuntu","tag-docker","tag-monitoramento","tag-nginx","tag-node-js","tag-self-hosted","tag-status-page","tag-ubuntu","tag-uptime-kuma"],"_links":{"self":[{"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/posts\/1557","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/types\/post"}],"replies":[{"embeddable":true,"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/comments?post=1557"}],"version-history":[{"count":2,"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/posts\/1557\/revisions"}],"predecessor-version":[{"id":1559,"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/posts\/1557\/revisions\/1559"}],"wp:attachment":[{"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/media?parent=1557"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/categories?post=1557"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/tags?post=1557"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}