{"id":1561,"date":"2026-09-11T19:13:39","date_gmt":"2026-09-11T22:13:39","guid":{"rendered":"https:\/\/www.linuxpro.com.br\/?p=1561"},"modified":"2026-09-11T19:18:32","modified_gmt":"2026-09-11T22:18:32","slug":"gatus-no-ubuntu-monitoramento-como-codigo-com-docker","status":"publish","type":"post","link":"https:\/\/www.linuxpro.com.br\/es\/2026\/09\/gatus-no-ubuntu-monitoramento-como-codigo-com-docker\/","title":{"rendered":"Gatus en Ubuntu: monitorizaci\u00f3n como c\u00f3digo con Docker"},"content":{"rendered":"<p><img fetchpriority=\"high\" decoding=\"async\" src=\"\/wp-content\/uploads\/2026\/09\/gatus-ubuntu-status-page-v1.webp\" alt=\"Mascote LinuxPro acompanhando um painel de monitoramento do Gatus\" width=\"1440\" height=\"810\" loading=\"eager\"><\/p>\n<p>Um endpoint pode continuar \u201cde p\u00e9\u201d para o servidor e, ainda assim, falhar para quem usa o produto. O <strong>Gatus<\/strong> \u00e9 um monitoramento <em>self-hosted<\/em> orientado a desenvolvedores: voc\u00ea descreve em YAML o que precisa ser verificado, ele executa as sondas, mant\u00e9m uma p\u00e1gina de status e pode alertar quando uma condi\u00e7\u00e3o deixa de ser verdadeira. Neste primeiro artigo, a meta \u00e9 simples: subir o Gatus no Ubuntu com Docker, persistir o hist\u00f3rico em SQLite e criar o primeiro check. As op\u00e7\u00f5es mais avan\u00e7adas ficam para um pr\u00f3ximo guia.<\/p>\n<h2>O que \u00e9 o Gatus<\/h2>\n<p>Gatus \u00e9 um projeto open source sob licen\u00e7a Apache-2.0, desenvolvido em Go. Ele verifica servi\u00e7os por HTTP, ICMP, TCP e DNS e n\u00e3o se limita a \u201ca URL respondeu?\u201d: as condi\u00e7\u00f5es podem validar c\u00f3digo HTTP, tempo de resposta, corpo retornado, expira\u00e7\u00e3o de certificado e outros valores da sonda. O resultado aparece em um dashboard\/p\u00e1gina de status e pode alimentar alertas.<\/p>\n<p>O ponto central \u00e9 a <strong>configura\u00e7\u00e3o como c\u00f3digo<\/strong>. Em vez de cadastrar checks apenas em uma interface, os endpoints vivem em YAML. Isso facilita revis\u00e3o em pull request, hist\u00f3rico no Git e repeti\u00e7\u00e3o da mesma pol\u00edtica entre ambientes. Se sua prefer\u00eancia for uma interface para criar monitores manualmente, leia tamb\u00e9m nosso guia de <a href=\"\/2026\/09\/uptime-kuma-no-linux-monitoramento-self-hosted-com-docker-e-nginx\">Uptime Kuma no Linux<\/a>.<\/p>\n<h2>Go: por que a linguagem importa<\/h2>\n<p>O c\u00f3digo do Gatus \u00e9 escrito em <strong>Go<\/strong>. Na pr\u00e1tica, isso explica por que ele pode ser distribu\u00eddo como um execut\u00e1vel \u00fanico e por que a imagem oficial faz uma compila\u00e7\u00e3o Go antes de iniciar um bin\u00e1rio no cont\u00eainer. Para quem opera o servi\u00e7o com Docker, n\u00e3o h\u00e1 runtime Go para instalar no Ubuntu: a imagem j\u00e1 entrega a aplica\u00e7\u00e3o. Para quem escolher a instala\u00e7\u00e3o sem cont\u00eainer, o pr\u00f3prio projeto documenta <code>go install github.com\/TwiN\/gatus\/v5@latest<\/code>.<\/p>\n<p>Isso n\u00e3o \u00e9 garantia autom\u00e1tica de baixo consumo em qualquer cen\u00e1rio: quantidade de endpoints, intervalo das sondas, reten\u00e7\u00e3o do hist\u00f3rico e banco escolhido continuam definindo a carga. Mas a aus\u00eancia de uma VM de linguagem no processo de produ\u00e7\u00e3o torna o modelo operacional direto.<\/p>\n<h2>Por que ele encontra falhas antes do usu\u00e1rio<\/h2>\n<p>M\u00e9tricas de uma aplica\u00e7\u00e3o podem parecer normais quando nenhum cliente est\u00e1 chegando at\u00e9 ela. Se um balanceador, DNS ou rota externa falha, talvez nem exista tr\u00e1fego para gerar erro. O Gatus faz uma requisi\u00e7\u00e3o ativa no intervalo configurado e avalia a resposta. Assim, ele pode avisar que o fluxo p\u00fablico est\u00e1 quebrado antes de o primeiro chamado chegar.<\/p>\n<p>N\u00e3o \u00e9 substituto de m\u00e9tricas, logs e tracing. Para CPU, mem\u00f3ria, disco e investiga\u00e7\u00e3o de um servidor Linux, complemente a estrat\u00e9gia com <a href=\"\/2026\/09\/monitorando-servidores-linux-com-prometheus\">Prometheus e Node Exporter<\/a>. Pense no Gatus como uma verifica\u00e7\u00e3o sint\u00e9tica de disponibilidade e de contrato: \u201ceste endpoint importante devolve o que prometeu?\u201d.<\/p>\n<h2>Instale Docker, Compose e Nginx no Ubuntu<\/h2>\n<p>Em um Ubuntu novo, instale o Docker pelo reposit\u00f3rio oficial e o Nginx pelo APT. Se a m\u00e1quina j\u00e1 executa cont\u00eaineres, revise os pacotes instalados antes de trocar <code>docker.io<\/code>, <code>containerd<\/code> ou <code>runc<\/code>: misturar origens pode causar conflito.<\/p>\n<pre><code class=\"language-bash\">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\n\nsudo 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\nsudo 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>O teste <code>hello-world<\/code> confirma que o daemon est\u00e1 funcionando. Mantenha <code>sudo<\/code> nos comandos Docker ou trate a entrada no grupo <code>docker<\/code> como acesso administrativo ao host.<\/p>\n<h2>Antes de instalar<\/h2>\n<p>Este guia usa Docker Engine e o plugin Docker Compose no Ubuntu. Se ainda n\u00e3o os tiver, siga a instala\u00e7\u00e3o pelo reposit\u00f3rio oficial do Docker no nosso artigo de <a href=\"\/2026\/09\/uptime-kuma-no-linux-monitoramento-self-hosted-com-docker-e-nginx\">Uptime Kuma<\/a>. Usaremos a porta <code>8080<\/code> ligada somente a <code>127.0.0.1<\/code>: isso \u00e9 seguro para o primeiro teste no servidor e evita publicar o painel sem HTTPS e controle de acesso.<\/p>\n<p>O README oficial tamb\u00e9m documenta a instala\u00e7\u00e3o via Go com <code>go install github.com\/TwiN\/gatus\/v5@latest<\/code>. Vamos deliberadamente usar Docker neste post para manter a instala\u00e7\u00e3o curta e reprodut\u00edvel. A instala\u00e7\u00e3o via Go, proxy reverso, autentica\u00e7\u00e3o e bancos externos merecem um tutorial separado.<\/p>\n<h2>Suba o Gatus com Docker Compose<\/h2>\n<p>Crie os diret\u00f3rios. O diret\u00f3rio <code>config<\/code> guarda a defini\u00e7\u00e3o version\u00e1vel dos checks; <code>data<\/code> receber\u00e1 o SQLite, que preserva o hist\u00f3rico ap\u00f3s reinicializa\u00e7\u00f5es.<\/p>\n<pre><code class=\"language-bash\">sudo install -d -m 0755 \/opt\/gatus\/config \/opt\/gatus\/data\nsudo chown -R \"$USER\":\"$USER\" \/opt\/gatus\ncd \/opt\/gatus<\/code><\/pre>\n<p>Crie <code>compose.yaml<\/code>:<\/p>\n<pre><code class=\"language-yaml\">services:\n  gatus:\n    image: ghcr.io\/twin\/gatus:stable\n    container_name: gatus\n    restart: unless-stopped\n    ports:\n      - \"127.0.0.1:8080:8080\"\n    environment:\n      GATUS_CONFIG_PATH: \/config\/config.yaml\n    volumes:\n      - .\/config:\/config:ro\n      - .\/data:\/data<\/code><\/pre>\n<p>A tag <code>stable<\/code> \u00e9 a indicada pelo in\u00edcio r\u00e1pido oficial, mas ela acompanha mudan\u00e7as. Para produ\u00e7\u00e3o, teste uma release e fixe uma tag de vers\u00e3o conhecida quando sua pol\u00edtica exigir previsibilidade.<\/p>\n<h2>Escreva o primeiro monitor<\/h2>\n<p>Crie <code>\/opt\/gatus\/config\/config.yaml<\/code>. Este exemplo monitora a p\u00e1gina inicial e exige HTTP 200, resposta em menos de dois segundos e certificado v\u00e1lido por mais de sete dias:<\/p>\n<pre><code class=\"language-yaml\">storage:\n  type: sqlite\n  path: \/data\/data.db\n\nendpoints:\n  - name: LinuxPro\n    group: site-publico\n    url: \"https:\/\/www.linuxpro.com.br\/\"\n    interval: 5m\n    conditions:\n      - \"[STATUS] == 200\"\n      - \"[RESPONSE_TIME] &lt; 2000\"\n      - \"[CERTIFICATE_EXPIRATION] &gt; 168h\"<\/code><\/pre>\n<p>Altere URL, nome e limites para o seu servi\u00e7o. Um limite de dois segundos pode n\u00e3o fazer sentido para toda aplica\u00e7\u00e3o; o objetivo \u00e9 transformar uma expectativa real em uma condi\u00e7\u00e3o. Para uma API JSON, o Gatus tamb\u00e9m permite validar um campo do corpo, por exemplo <code>[BODY].status == UP<\/code>, quando esse contrato existir.<\/p>\n<h2>Escolha do banco: mem\u00f3ria, SQLite ou PostgreSQL<\/h2>\n<p>O Gatus aceita <strong>tr\u00eas<\/strong> tipos de armazenamento: <code>memory<\/code>, <code>sqlite<\/code> e <code>postgres<\/code>. <strong>MySQL\/MariaDB n\u00e3o \u00e9 um backend suportado<\/strong> pelo Gatus neste momento; n\u00e3o adianta subir um cont\u00eainer MySQL e apontar a configura\u00e7\u00e3o para ele.<\/p>\n<ul>\n<li><strong>Memory:<\/strong> \u00e9 o padr\u00e3o e serve apenas para demonstra\u00e7\u00e3o. Todo hist\u00f3rico some ao reiniciar o processo.<\/li>\n<li><strong>SQLite:<\/strong> \u00e9 a melhor escolha para uma \u00fanica inst\u00e2ncia, poucos ou m\u00e9dios conjuntos de endpoints e opera\u00e7\u00e3o simples. O Compose deste guia j\u00e1 o usa; mantenha <code>.\/data<\/code> em disco local e fa\u00e7a backup do arquivo <code>data.db<\/code>.<\/li>\n<li><strong>PostgreSQL:<\/strong> escolha quando o hist\u00f3rico crescer, quando j\u00e1 existir PostgreSQL gerenciado pela equipe ou quando precisar separar o banco do cont\u00eainer da aplica\u00e7\u00e3o. Para dashboards grandes, o Gatus oferece <code>storage.caching: true<\/code> em SQLite e PostgreSQL.<\/li>\n<\/ul>\n<p>O Compose inicial deste artigo \u00e9 o cen\u00e1rio SQLite: o volume <code>.\/data:\/data<\/code> e <code>storage.type: sqlite<\/code> no YAML s\u00e3o o \u201cdocker-compose para SQLite\u201d. N\u00e3o remova essas duas partes, ou voc\u00ea volta ao armazenamento em mem\u00f3ria.<\/p>\n<h2>Docker Compose com PostgreSQL<\/h2>\n<p>Quando SQLite deixar de ser suficiente, use um banco PostgreSQL isolado na mesma rede Docker. Crie um arquivo <code>.env<\/code> com uma senha forte e n\u00e3o o envie ao Git:<\/p>\n<pre><code class=\"language-bash\">POSTGRES_DB=gatus\nPOSTGRES_USER=gatus\nPOSTGRES_PASSWORD=troque-por-uma-senha-longa<\/code><\/pre>\n<p>Depois substitua o <code>compose.yaml<\/code> pelo exemplo abaixo. PostgreSQL n\u00e3o publica porta no host: somente o cont\u00eainer Gatus conversa com ele.<\/p>\n<pre><code class=\"language-yaml\">services:\n  postgres:\n    image: postgres:18\n    restart: unless-stopped\n    env_file: .env\n    volumes:\n      - postgres-data:\/var\/lib\/postgresql\n    networks: [gatus-internal]\n\n  gatus:\n    image: ghcr.io\/twin\/gatus:stable\n    container_name: gatus\n    restart: unless-stopped\n    depends_on: [postgres]\n    env_file: .env\n    ports:\n      - \"127.0.0.1:8080:8080\"\n    environment:\n      GATUS_CONFIG_PATH: \/config\/config.yaml\n    volumes:\n      - .\/config:\/config:ro\n    networks: [gatus-internal]\n\nvolumes:\n  postgres-data:\n\nnetworks:\n  gatus-internal:<\/code><\/pre>\n<p>Altere tamb\u00e9m o trecho <code>storage<\/code> de <code>config\/config.yaml<\/code>. Se a senha tiver caracteres reservados em URL, ela precisa ser codificada para uso na URL de conex\u00e3o.<\/p>\n<pre><code class=\"language-yaml\">storage:\n  type: postgres\n  path: \"postgres:\/\/${POSTGRES_USER}:${POSTGRES_PASSWORD}@postgres:5432\/${POSTGRES_DB}?sslmode=disable\"\n  caching: true<\/code><\/pre>\n<p>O <code>sslmode=disable<\/code> \u00e9 apropriado apenas para essa rede Docker interna. Para PostgreSQL fora do host ou gerenciado, exija TLS e use a URL de conex\u00e3o fornecida pelo servi\u00e7o.<\/p>\n<h2>Inicie e valide<\/h2>\n<pre><code class=\"language-bash\">cd \/opt\/gatus\nsudo docker compose up -d\nsudo docker compose ps\nsudo docker compose logs --tail=100\ncurl -I http:\/\/127.0.0.1:8080<\/code><\/pre>\n<p>O <code>curl<\/code> confirma que o servi\u00e7o est\u00e1 escutando localmente. Para abrir o painel sem expor a porta, crie um t\u00fanel SSH a partir da sua m\u00e1quina:<\/p>\n<pre><code class=\"language-bash\">ssh -L 8080:127.0.0.1:8080 usuario@seu-servidor<\/code><\/pre>\n<p>Depois acesse <code>http:\/\/localhost:8080<\/code> no navegador local. N\u00e3o abra <code>8080<\/code> no firewall s\u00f3 para facilitar: quando voc\u00ea decidir disponibilizar uma status page ou administra\u00e7\u00e3o, publique-a atr\u00e1s de HTTPS, autentica\u00e7\u00e3o e um proxy reverso configurado para o seu ambiente.<\/p>\n<h2>Publique o painel com Nginx<\/h2>\n<p>O Compose mant\u00e9m o Gatus em <code>127.0.0.1:8080<\/code>. Para acess\u00e1-lo por um dom\u00ednio, coloque Nginx na frente e use HTTPS. Em <code>\/etc\/nginx\/sites-available\/gatus<\/code>, adapte dom\u00ednio e caminhos do certificado:<\/p>\n<pre><code class=\"language-nginx\">server {\n    listen 80;\n    server_name status.exemplo.com;\n    return 301 https:\/\/$host$request_uri;\n}\n\nserver {\n    listen 443 ssl;\n    server_name status.exemplo.com;\n\n    ssl_certificate \/etc\/letsencrypt\/live\/status.exemplo.com\/fullchain.pem;\n    ssl_certificate_key \/etc\/letsencrypt\/live\/status.exemplo.com\/privkey.pem;\n\n    location \/ {\n        proxy_pass http:\/\/127.0.0.1:8080;\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<pre><code class=\"language-bash\">sudo ln -s \/etc\/nginx\/sites-available\/gatus \/etc\/nginx\/sites-enabled\/gatus\nsudo nginx -t\nsudo systemctl reload nginx<\/code><\/pre>\n<p>Emita o certificado antes de ativar o bloco HTTPS e n\u00e3o exponha o dashboard administrativo sem prote\u00e7\u00e3o. O Gatus oferece Basic Auth e OIDC na pr\u00f3pria configura\u00e7\u00e3o; use uma delas quando a p\u00e1gina n\u00e3o for p\u00fablica. Para a implementa\u00e7\u00e3o de Nginx no Ubuntu, consulte tamb\u00e9m nosso guia de <a href=\"\/2026\/09\/nginx-varias-versoes-php-debian-ubuntu\">Nginx e v\u00e1rias vers\u00f5es de PHP<\/a>.<\/p>\n<h2>Gatus e IA: um uso pr\u00e1tico, sem hype<\/h2>\n<p>O Gatus n\u00e3o \u00e9 uma ferramenta de IA e n\u00e3o \u201cconserta\u201d c\u00f3digo gerado por IA. A utilidade aqui \u00e9 outra: mudan\u00e7as ficam mais frequentes quando equipes usam assist\u00eancia de IA, e uma sonda sint\u00e9tica pode verificar o caminho cr\u00edtico ap\u00f3s o deploy. Al\u00e9m de testar <code>200<\/code>, valide um campo JSON, uma resposta esperada ou um limite de tempo. O pr\u00f3prio projeto discute esse papel de preven\u00e7\u00e3o no contexto de mudan\u00e7as aceleradas por IA.<\/p>\n<p>N\u00e3o transforme uma sonda em a\u00e7\u00e3o destrutiva. Se criar checks que fazem POST para testar um fluxo, a opera\u00e7\u00e3o precisa ser idempotente, isolada e n\u00e3o pode alterar dados reais de produ\u00e7\u00e3o. O YAML \u00e9 um contrato operacional: revise-o como revisaria c\u00f3digo.<\/p>\n<h2>O que fica para o pr\u00f3ximo passo<\/h2>\n<p>Depois que o primeiro endpoint estiver saud\u00e1vel, avance pouco a pouco: adicione DNS ou TCP, configure alertas, use uma p\u00e1gina p\u00fablica separada e leve o YAML ao Git. Antes de guardar tokens de webhook ou senhas em configura\u00e7\u00e3o, retire-os do reposit\u00f3rio e use o mecanismo de segredos adotado pela sua equipe.<\/p>\n<p>Para detalhes completos de condi\u00e7\u00f5es, alertas, armazenamento e seguran\u00e7a, consulte a <a href=\"https:\/\/gatus.io\/docs\">documenta\u00e7\u00e3o do Gatus<\/a> e o <a href=\"https:\/\/github.com\/TwiN\/gatus\">reposit\u00f3rio oficial<\/a>. Acompanhe tamb\u00e9m as <a href=\"https:\/\/github.com\/TwiN\/gatus\/releases\">releases<\/a> antes de atualizar a imagem. Com um arquivo curto e um check bem pensado, o Gatus j\u00e1 impede que o usu\u00e1rio seja o seu primeiro monitor.<\/p>\n<p style=\"font-size:.9em;opacity:.75\">Leitura relacionada: <a href=\"https:\/\/gatus.io\/blogs\/how-gatus-can-help-prevent-disasters-in-the-era-of-ai\">How Gatus Can Help Prevent Disasters in the Era of AI<\/a>, no blog oficial do projeto.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Conoce Gatus, levanta un monitor self-hosted con Docker en Ubuntu y define el primer check en YAML.<\/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,467,58,126,203,465,5],"class_list":["post-1561","post","type-post","status-publish","format-standard","hentry","category-infra","category-linux","category-servidores","category-ubuntu","tag-docker","tag-gatus","tag-go","tag-monitoramento","tag-self-hosted","tag-status-page","tag-ubuntu"],"_links":{"self":[{"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/posts\/1561","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=1561"}],"version-history":[{"count":2,"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/posts\/1561\/revisions"}],"predecessor-version":[{"id":1563,"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/posts\/1561\/revisions\/1563"}],"wp:attachment":[{"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/media?parent=1561"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/categories?post=1561"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/tags?post=1561"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}