maintenant

io.github.kOlapsis由 GitHub 帳號 kOlapsis 發布v1.11.0更新於 Nov 2, 2026

Docker monitoring for AI agents: logs, history, alerts. Can ack alerts; never touches containers.

已驗證Streamable HTTP可網頁執行雲端與基礎設施安全與監控

概覽

AI 產生的概覽

maintenant 自架 Docker/Kubernetes 監控工具內建的 MCP 伺服器,讓助理讀取日誌、指標、告警歷史並確認告警。

可以做什麼
  • 讀取容器與主機狀態:日誌、健康檢查、重啟迴圈、CPU、記憶體、網路與磁碟指標
  • 查詢監控資料:端點檢查歷史、TLS 憑證、心跳、排程工作、映像更新與 CVE
  • 處理告警佇列:列出作用中的告警、確認告警、建立事件
  • 跨主機與 Kubernetes 工作負載查詢監控器已發現的物件
適用情境
適合已經用 maintenant 監控自有基礎設施、希望 AI 代理在告警觸發後自行追查日誌、指標與同主機其他告警的情況,而不只是收到一個紅燈提示。
執行需求
需要一個執行中的 maintenant 實例(Docker 映像、Kubernetes 資訊清單或裸機 Linux 安裝)並啟用 MCP 伺服器。本機使用透過 docker exec 走 stdio;遠端用戶端使用 Streamable HTTP 端點並需 OAuth2 用戶端 id 與密鑰。資訊清單未宣告任何 API 金鑰。
安裝前請注意
其 UI 與 API 本身沒有身分驗證,必須放在具驗證的反向代理之後或僅綁定本機。MCP 伺服器可確認告警、建立事件,會改變狀態。掛載 Docker socket 與主機 /proc 代表對主機有廣泛讀取權限。預設每小時傳送匿名遙測,可用 MAINTENANT_DISABLE_TELEMETRY 關閉。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 maintenant,將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Web executable,透過 Streamable HTTP。 遠端服務在工作區中設定後即可從網頁執行環境執行。

其他 MCP 客戶端

參照 儲存庫 中的啟動說明。

README

[maintenant, infrastructure monitoring in one container]

maintenant

Drop a container. Your stack is monitored.
When something breaks, fixed rules catch it, the alert is pushed to you, and your AI agent investigates through the built-in MCP server.

Docker, Kubernetes, uptime, TLS, cron jobs, live logs, image updates, CVEs: auto-discovered, alerting on every one of them,
from a single Go binary that fits in a few tens of MB of RAM when freshly started (about 100 MB after several days on a busy host). No PromQL, no exporters, no dashboards to build.

Try the live demo →
A Pro instance monitoring a real stack, read-only. Nothing to install, nothing to sign up for.

[Release] [Docker] [License] [Stars]

Live demo  •  Quick Start  •  Why maintenant  •  Agents  •  Features  •  Documentation  •  Editions  •  Pricing


Quick Start

yaml
# docker-compose.ymlservices:  maintenant:    image: ghcr.io/kolapsis/maintenant:latest    ports:      # ⚠️  SECURITY: publishes the UI/API (no authentication of their own) on      # every interface; put an auth reverse proxy in front, or bind "127.0.0.1:8080:8080". See https://docs.maintenant.dev/security/#reverse-proxy-setup.      - "8080:8080"    read_only: true    security_opt:      - no-new-privileges:true    tmpfs:      - /tmp:noexec,nosuid,size=64m    volumes:      - /var/run/docker.sock:/var/run/docker.sock:ro      - /proc:/host/proc:ro      - /etc/os-release:/host/etc/os-release:ro      - maintenant-data:/data    environment:      MAINTENANT_ADDR: "0.0.0.0:8080"      MAINTENANT_DB: "/data/maintenant.db"    restart: unless-stopped
volumes:  maintenant-data:
bash
docker compose up -d

Open http://localhost:8080. Your containers are already there, with their health, restart loops, resources and logs. Nothing to configure.

Docker socket access is automatic: the entrypoint reads the mounted socket's group and grants it to the unprivileged user, on Compose and on Swarm (where docker stack deploy silently ignores group_add). A socket owned by group root needs DOCKER_GID=0. If containers do not show up, see Troubleshooting.

Kubernetes

bash
kubectl create namespace maintenantkubectl apply -f deploy/kubernetes/

In-cluster API auto-detected, read-only RBAC, namespace filtering, workloads (Deployments, DaemonSets, StatefulSets) as first-class citizens. Kubernetes guide.

Bare Linux, no Docker at all (systemd, amd64 and arm64, statically linked)

bash
curl -fsSL https://install.maintenant.dev | sudo bash

Endpoints, certificates and heartbeats work without any container runtime. Container monitoring switches on by itself the moment a runtime shows up. Install documentation for pinned versions, air-gapped installs and supply-chain verification.

Cloud: one cloud-init file boots a hardened host with maintenant running on Hetzner Cloud, DigitalOcean, Scaleway, OVHcloud or Vultr.


Why maintenant?

Monitoring your own infrastructure with the standard stack means running Prometheus, Grafana, Alertmanager, node-exporter, cAdvisor, blackbox-exporter, a certificate exporter, Loki, Promtail, Trivy and something for image updates. Ten-odd components, each with its own config, upgrades and dashboards, to answer one question: is my stack up, and what is burning?

maintenant answers that question with one container.

Built into maintenantWhat you would assemble instead
Container state, health checks, restart loopscAdvisor + node-exporter + alert rules you write
CPU, memory, network and disk, per container and per hostcAdvisor + node-exporter + Grafana dashboards you build
HTTP / TCP endpoint checks, declared as Docker labelsblackbox-exporter + a config file per target
TLS certificate expiry and chain validationssl_exporter
Cron and heartbeat deadlinesPushgateway + alert rules you write
Live container logs, stdout/stderr demuxedDozzle, or Loki + Promtail
Image update detection, with compose-aware update and rollback commandsDiun or Watchtower
Network exposure audit: 0.0.0.0 binds, exposed database ports, host network, privileged containersnothing standard
CVE enrichment and per-container risk score (Personal)Trivy + its exporter
Alerts routed to Discord, webhooks, email, Telegram, Slack and Teams, with escalation (Pro)Alertmanager
Public status page with incidents and subscribersCachet, Uptime Kuma, or a SaaS
One real-time dashboard for all of the aboveGrafana + dashboards you build and maintain

Do I still need Prometheus? maintenant monitors your infrastructure. Prometheus monitors your application. There is no PromQL here, no custom exporters, no panels to design: maintenant already knows what a container, a certificate, an endpoint, a cron job and a CVE are, and starts watching them the moment they appear. If you ship business metrics and write your own queries, keep Prometheus for that. The two answer different questions, and plenty of people run both.

Against the tools usually stacked up next to it:

maintenantUptime KumaPortainerDozzle
Container auto-discoveryYesNoYesYes
MCP server, agent-readyBuilt inThird-partySeparateNo
Live container logsYesNoYesYes
HTTP/TCP endpoint checksYesYesNoNo
Cron/heartbeat monitoringYesYesNoNo
SSL certificate trackingYesYesNoNo
CPU/memory/network metricsYesNoLimitedNo
Image update detectionYesNoYesNo
Network security insightsYesNoNoNo
CVE enrichment, risk scoringPersonalNoNoNo
Public status pageYesYesNoNo
Alerting with routingYesYesLimitedNo
Kubernetes nativeYesNoYesNo
Single binary, zero depsYesNode.jsDocker APIDocker API
Runs without a runtimeYesNoNoNo

One container. One dashboard. Everything monitored.


Screenshots

[Dashboard]
Dashboard: uptime, response times, resources, unified monitors
[Unified alerts]
Unified alerts across every source
[Security posture]
Security posture with CVE enrichment and risk scoring (Personal)
More screenshots
[Containers]
Container auto-discovery
[System resources]
Resources per container and per host
[Endpoints]
Endpoint monitoring
[Heartbeats]
Heartbeat and cron monitoring
[Certificates]
TLS certificate tracking
[Updates]
Update intelligence
[Network security insights]
Network security insights
[AI assistant over MCP]
Your AI assistant, plugged in over MCP
[Status page, all operational]
Status page, all operational
[Status page, degraded]
Status page, degraded

Agents

maintenant watches, your AI agent investigates. The loop has three steps:

  1. Detect. Fixed rules decide that something is down: consecutive failures, thresholds, missed deadlines, restart loops. No model is involved, so an alert is never invented and nothing is spent while everything is fine.
  2. Push. The alert leaves as a webhook: alert.fired when it starts, alert.resolved when it recovers, with the host it belongs to (agent_id) and a link back to it.
  3. Investigate. Your agent receives the alert and queries maintenant's built-in MCP server: the container's logs, the endpoint's check history, CPU and memory, the other active alerts on the same host. You get a diagnosis, not just a red light.
mermaid
flowchart LR    S[containers, endpoints,<br>certificates, cron jobs, hosts] --> M[maintenant<br>rules fire an alert]    M -- webhook --> A[your agent<br>Claude Code, OpenCode, n8n]    A -- MCP: logs, history,<br>active alerts --> M

With Claude Code. A small receiver (Python, standard library only) runs on the host next to maintenant. Each fired alert starts a headless Claude Code session that can only call maintenant's read-only MCP tools, and the diagnosis lands in reports/<alert-id>.md:

bash
export RECEIVER_TOKEN=$(openssl rand -hex 32)python3 examples/agent-webhook/receiver.py      # listens on 127.0.0.1:9099
bash
# what the receiver runs for each alertclaude -p "maintenant just fired this alert: {...} Investigate it read-only." \  --setting-sources project --mcp-config mcp.json --strict-mcp-config --tools "" \  --allowedTools mcp__maintenant__list_alerts mcp__maintenant__get_container_logs \                 mcp__maintenant__get_endpoint_history mcp__maintenant__get_resources

mcp.json reaches maintenant over stdio with docker exec -i maintenant /app/maintenant --mcp-stdio, so no MCP port is opened: start maintenant with MAINTENANT_MCP_SOCKET=true to serve the local socket it relays to. Point a webhook channel at the receiver with an Authorization: Bearer <token> header and route alerts to it with a trigger. The AI agents guide walks through the setup.

With OpenCode, the same receiver calls opencode run instead of claude -p, with maintenant declared as a local MCP server in opencode.json. With n8n, a Webhook trigger feeds an AI Agent node whose MCP Client tool points at your instance's /mcp endpoint.

MCP server

Built-in Model Context Protocol server with 51 tools. Ask your AI assistant what is burning, read a container's logs, check the alert queue, acknowledge an alert, open an incident. stdio and Streamable HTTP transports, OAuth2 with a client id and secret for remote clients (Claude web, mobile and Desktop).


Features

Every section links to its full documentation.

Container monitoring

Zero-config auto-discovery for Docker, Docker Swarm and Kubernetes. Every container is tracked the moment it starts: state changes, health checks, restart loops, live log streaming with stdout/stderr demux. Compose projects are grouped automatically. Read-only: maintenant observes, it never touches your containers.

Multi-host monitoring

One central server, lightweight read-only agents on your other hosts, a persistent mutually-authenticated gRPC stream between them. No shared database, no message queue, no PKI to run: an agent enrolls with a one-time token and an Ed25519 keypair generated locally, and every stream is challenge-response authenticated. Revoke it from the UI at any time.

bash
# On each remote host, one command, generated for you in the UIdocker run -d --name maintenant-agent --restart unless-stopped \  -v /var/run/docker.sock:/var/run/docker.sock:ro \  -v /proc:/host/proc:ro \  -v /etc/os-release:/host/etc/os-release:ro \  -v maintenant-agent-data:/var/lib/maintenant \  ghcr.io/kolapsis/maintenant:latest \  --mode=agent --server=grpcs://monitoring.example.com \  --enrollment-token=mnt_enr_XXXXXXXXXXXXXXXX --label="prod-worker-01"

Agents detect their local runtime (Docker, Swarm or Kubernetes), stream container state, endpoints, certificates, host CPU/memory/disk, and reconnect on their own, replaying what they saw while disconnected as history. Every entity is attributed to its host, so nothing gets mixed across machines. Personal: up to 20 remote machines. Pro: unlimited.

Update intelligence

Scans OCI registries: newer versions for fixed tags, and for floating tags like latest a comparison between the digest your container runs and the one the tag points at now. You know which images have an update before you docker pull blindly. Update and rollback commands for Compose, plain Docker, Swarm and Kubernetes, with the right cd into the Compose project. No Diun, no Watchtower, no extra container: it is part of the monitor.

Host OS end-of-support

Every monitored host reports its distribution and version; maintenant checks it against the support cycles of Debian, Ubuntu, RHEL, Rocky, Alma, Alpine and SLES and alerts 30 days before the free security support ends, then again once it has. Dates ship with the binary and refresh daily from endoflife.date when the network allows.

Endpoint monitoring

HTTP and TCP checks declared as Docker labels, picked up when the container starts, or added by hand. Endpoints can also be derived from Traefik and Caddy labels (opt-in). Response times, uptime history, 90-day sparklines, failure and recovery thresholds.

yaml
labels:  maintenant.endpoint.http: "https://api:3000/health"  maintenant.endpoint.interval: "15s"  maintenant.endpoint.failure-threshold: "3"

Heartbeat and cron monitoring

Create a monitor, get a URL, add one curl to the job. maintenant tracks start and finish, duration, exit code, and alerts when the deadline is missed. Outbound heartbeats let two maintenant instances watch each other, so a dead monitor does not go unnoticed.

bash
curl -fsS -o /dev/null https://now.example.com/ping/{token}/$?

TLS certificate monitoring

Auto-detected from your HTTPS endpoints, plus standalone monitors for any domain. Full chain validation, alerts at 30, 14, 7, 3 and 1 day before expiry, OCSP stapling checks (Personal).

Resource metrics

Real-time CPU, memory, network and disk I/O per container and per host, top-consumers view for instant triage, per-container thresholds with debounce. History: 7 days on Community, 30 on Personal, 90 on Pro.

Network security insights

Flags what should not be there: ports bound to 0.0.0.0, exposed database ports, host-network mode, privileged containers, Kubernetes Services of type NodePort or LoadBalancer, and database ports exposed through them. Personal adds CVE enrichment (each image is mapped to its software ecosystem through OCI manifest inspection), a risk score per container and a unified security posture dashboard.

Alert engine

One alert pipeline for every source: container restart loops, unhealthy checks and stopped containers, endpoint failures, missed heartbeats, expiring or invalid certificates, CPU and memory thresholds, available updates, Swarm and Kubernetes health, agents going offline, hosts whose OS loses support. Channels are silent by default and routed through triggers (severity, source, scope). Alerts can be acknowledged. Silence rules for planned maintenance, three delivery attempts per notification.

Channels: Discord and webhooks (Community), email and Telegram (Personal), Slack and Microsoft Teams (Pro). Pro adds escalation policies of up to five levels that page the on-call, then the backup, then the lead, plus maintenance windows.

Public status page

Real-time status page with severity aggregation across every monitor, live over SSE. Personal adds incident timelines, Pro adds email subscribers (double opt-in, through your own SMTP server), maintenance windows and branding.


Configuration

Everything is driven by Docker labels and a handful of environment variables. No YAML to maintain.

  • Environment variables: bind address, database, base URL, PostgreSQL DSN, MCP, Kubernetes namespaces, license key, telemetry.
  • Docker labels reference: endpoints, TLS, alert severity, restart thresholds, update tracking, grouping, ignore.
  • REST API under /api/v1/, plus an SSE event stream.
Full stack example
yaml
services:  maintenant:    image: ghcr.io/kolapsis/maintenant:latest    ports:      # ⚠️  SECURITY: publishes the UI/API (no authentication of their own) on      # every interface; put an auth reverse proxy in front, or bind "127.0.0.1:8080:8080". See https://docs.maintenant.dev/security/#reverse-proxy-setup.      - "8080:8080"    read_only: true    security_opt:      - no-new-privileges:true    tmpfs:      - /tmp:noexec,nosuid,size=64m    volumes:      - /var/run/docker.sock:/var/run/docker.sock:ro      - /proc:/host/proc:ro      - /etc/os-release:/host/etc/os-release:ro      - maintenant-data:/data    environment:      MAINTENANT_ADDR: "0.0.0.0:8080"      MAINTENANT_DB: "/data/maintenant.db"
  api:    image: myapp:latest    labels:      maintenant.group: "production"      maintenant.endpoint.http: "http://api:3000/health"      maintenant.endpoint.interval: "15s"      maintenant.alert.severity: "critical"
  postgres:    image: postgres:16    labels:      maintenant.endpoint.tcp: "postgres:5432"      maintenant.alert.severity: "critical"
  redis:    image: redis:7-alpine    labels:      maintenant.endpoint.tcp: "redis:6379"
volumes:  maintenant-data:

Security model

  • No built-in authentication, by design. Like Dozzle and Prometheus, maintenant sits behind your reverse proxy and auth middleware (Traefik or Caddy, Authelia or Authentik). /ping/{token} and /status/ are meant to stay public. Reverse proxy setup.
  • Read-only everywhere. Docker socket mounted :ro, read-only RBAC on Kubernetes, read-only agents. maintenant never starts, stops or modifies a container. A socket proxy is supported if you would rather not mount the socket at all.
  • Hardened container. Drops to nobody (uid 65534) once it has fixed the ownership of its volume, read_only root filesystem, no-new-privileges.
  • Anonymous, opt-out telemetry. One snapshot per hour: counts of monitored objects, edition, storage engine, version and runtime figures (OS, architecture, CPU cores, memory). No hostnames, IPs, names, URLs or keys, ever. MAINTENANT_DISABLE_TELEMETRY=1 turns it off with no background goroutine and no outbound packet. Exact payload and details.

Architecture

  • One binary, three modes. Go backend, Vue 3 frontend embedded via embed.FS, SQLite inside. The same file runs embedded (single host, default), server (central ingestion) and agent (remote host).
  • Zero dependencies. SQLite is the only datastore. No Redis, no queue, nothing to administer. A fleet operator may back the server on a PostgreSQL they already run; agents always stay on SQLite.
  • Runtime optional. Endpoints, certificates and heartbeats run without any Docker socket or Kubernetes API. Container monitoring resumes on its own when a runtime becomes reachable.
  • Real-time. SSE pushes every state change to the browser and to the status page instantly.
  • Light on memory. A freshly started instance fits in a few tens of MB; plan on about 100 MB after several days on a busy host. Runs on a Raspberry Pi, a €4 VPS or a NAS.

Full write-up in the architecture documentation.


Editions

Community is free forever and runs production infrastructure every day: it is the full product on a single host, not a crippled trial. Personal is bought once. Pro is what a team needs.

CommunityPersonalPro
PriceFree, Apache-2.0€149 once, for life€29/mo or €290/yr, 14-day trial
Hosts1up to 20 remote machinesunlimited
Endpoints10unlimitedunlimited
Heartbeats5unlimitedunlimited
Certificates5unlimitedunlimited
Resource history7 days30 days90 days
Alert channelsDiscord, webhooks+ email, Telegram, advanced filters+ Slack, Teams, escalation, maintenance windows
Securitynetwork insights+ CVE enrichment, risk scoring, security posture, OCSPsame
Status page3 componentsunlimited, incident timelines+ subscriber notifications, branding
Useanythingyour own infrastructure+ running it for others, email support

Personal covers one person on infrastructure they own or run for themselves, freelancers included, and ships with one year of updates (then €59 per extra year; every version released inside a paid year stays licensed for life). Pro adds the right to monitor other people's infrastructure. Volume pricing and custom agreements: [email protected].

Paid editions are the same binary, self-hosted the same way. The key is verified against the license server and the signed answer is cached: the instance falls back to Community only after 60 days without reaching the server, so a few weeks offline change nothing. Your monitoring data never leaves your infrastructure.

bash
MAINTENANT_LICENSE_KEY=your-license-key   # Personal or Pro, restart, done

Buy Personal, €149 once →  ·  Start a 14-day Pro trial →
Stripe worldwide, Mollie in the EU (SEPA, iDEAL, Bancontact). VAT invoices. Cancel Pro anytime.


Support the project

maintenant is built by one developer in Bordeaux, France. No VC, no ads, no acquisition exit. 100% of revenue funds full-time development. Ranked by impact:

  1. Buy a licence. Personal if the infrastructure is yours, Pro if you run it for others. Unlocks features and pays for the roadmap. See editions →
  2. Sponsor. Any amount, one-off or monthly, credited below. GitHub Sponsors →
  3. Spread the word. Star the repo, share on HN, Lobsters, Reddit or LinkedIn. Discoverability is oxygen for indie projects.
  4. Tell me how you use it. Two minutes, read by the developer, quoted only with your permission. Give feedback →

Backers

Every Personal owner, Pro subscriber and GitHub sponsor keeps this project independent. Thank you.

[GitHub Sponsors]

Want your company logo here? Become a corporate sponsor: visibility for you, runway for the project.


Contributing

Code contributions are welcome. Open an issue first for bigger changes; small fixes, typos and docs, just send the PR.


License

Copyright 2025-2026 Benjamin Touchard / kOlapsis, Bordeaux, France.

The core is licensed under the Apache License 2.0. The code that Personal and Pro keys unlock, under internal/commercial/ and frontend/src/commercial/, is source-available under the Maintenant Commercial Source License: free to read and contribute to, production use requires a matching licence key. See NOTICE and COMMERCIAL-LICENSE.md.


[France 2030]
Lauréat de l'AAP Hyper Open X. Ce projet a été financé par le gouvernement dans le cadre de France 2030.
Winner of the Hyper Open X call for projects, funded by the French government under France 2030.

來源:README.md,提交 c6fda86

工具

0
SourceWeft 尚未讀取此伺服器的工具。

版本歷史

2
  1. v1.11.0最新Oct 26, 2026
  2. v1.10.1Oct 23, 2026

評分

已滿足適用檢查項的 50%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通必需25 分

    請保持端點能夠回應 MCP 握手;SourceWeft 每 30 天探測一次。

  • 已宣告認證方式必需10 分

    請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。

  • 已列出工具15 分

    請讓伺服器在無憑證時回應 tools/list,或發布可在沙箱中無憑證啟動的軟體包。

  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分