kOlapsis/maintenant

GitHub: kOlapsis/maintenant

一站式轻量监控平台,单容器部署即可自动发现并监控 Docker/Kubernetes 集群的容器状态、服务可用性、证书、资源指标和安全风险。

Stars: 164 | Forks: 8

maintenant — Unified monitoring

maintenant

监控一切,无需费心管理。
丢下一个容器,你的整个技术栈在几秒钟内即可被监控。

Release Docker License

文档  •  快速开始  •  功能  •  配置  •  API

## 为什么选择 maintenant? 大多数自托管用户需要折腾 3-5 种工具来监控他们的技术栈:一个用于容器,一个用于可用性,一个用于证书,一个用于指标,还有一个用于状态页面。maintenant 可以替代所有这些工具。 | | maintenant | Uptime Kuma | Portainer | Dozzle | | ---------------------------- |:----------:|:-----------:|:----------:|:----------:| | 容器自动发现 | **是** | 否 | 是 | 是 | | HTTP/TCP 端点检查 | **是** | 是 | 否 | 否 | | Cron/心跳监控 | **是** | 是 | 否 | 否 | | SSL 证书追踪 | **是** | 是 | 否 | 否 | | CPU/内存/网络指标 | **是** | 否 | 有限 | 否 | | 镜像更新检测 | **是** | 否 | 是 | 否 | | 网络安全洞察 | **是** | 否 | 否 | 否 | | 公开状态页面 | **是** | 是 | 否 | 否 | | 告警 (webhook, Discord) | **是** | 是 | 有限 | 否 | | Kubernetes 原生 | **是** | 否 | 是 | 否 | | 单二进制,零依赖 | **是** | Node.js | Docker API | Docker API | **一个容器。一个仪表盘。监控一切。** ## 截图
Dashboard
Dashboard — Uptime, response times, resources, unified monitors
Containers
Container auto-discovery
Endpoints
Endpoint monitoring
Certificates
TLS certificate tracking
Updates
Update intelligence
Status Page — All OK
Status page — All operational
Status Page — Degraded
Status page — Degraded state
## 快速开始 ### Docker (30 秒) ``` # docker-compose.yml services: maintenant: image: ghcr.io/kolapsis/maintenant:latest ports: - "8080:8080" volumes: - /var/run/docker.sock:/var/run/docker.sock:ro - /proc:/host/proc:ro - maintenant-data:/data environment: MAINTENANT_ADDR: "0.0.0.0:8080" MAINTENANT_DB: "/data/maintenant.db" restart: unless-stopped volumes: maintenant-data: ``` ``` docker compose up -d ``` 打开 **http://localhost:8080** —— 你的容器已经在那里了。无需配置。 ### Kubernetes ``` kubectl apply -f deploy/kubernetes/ ``` maintenant 自动检测集群内 API。开箱即用的只读 RBAC、namespace 过滤、工作负载级别监控。 ## 功能 ### 容器监控 Docker 和 Kubernetes 的零配置自动发现。每个容器在启动的那一刻即被追踪 —— 状态变更、健康检查、重启循环、带有 stdout/stderr 多路分离的日志流。Compose 项目会自动分组。Kubernetes 工作负载(Deployments, DaemonSets, StatefulSets)均是一等公民。 ### 端点监控 直接将 HTTP 或 TCP 检查定义为 Docker labels —— 无需配置文件,无需在 UI 中点击。maintenant 会在容器启动时自动识别它们。响应时间、运行时间历史、90 天趋势线、可配置的故障/恢复阈值。 ``` labels: maintenant.endpoint.http: "https://api:3000/health" maintenant.endpoint.interval: "15s" maintenant.endpoint.failure-threshold: "3" ``` ### 心跳 & Cron 监控 创建一个监控器,获取一个唯一 URL,在你的 cron 作业中添加一个 `curl` 命令。maintenant 追踪开始/结束时间、持续时间、退出代码,并在作业错过截止时间时发出警报。 ``` # 适用于任何 cron job 的单行命令 curl -fsS -o /dev/null https://now.example.com/ping/{uuid}/$? ``` ### SSL/TLS 证书监控 从你的 HTTPS 端点自动检测,以及针对任何域名的独立监控。在过期前 30、14、7、3 和 1 天发出警报。完整的证书链验证。 ### 资源指标 每个容器的实时 CPU、内存、网络 I/O 和磁盘 I/O。1 小时到 30 天的历史图表 (Pro)。针对每个容器的告警阈值带有防抖动机制以避免干扰。顶级资源消耗视图,用于即时分类。 ### 网络安全洞察 自动检测容器中危险的网络配置。标记绑定到 `0.0.0.0` 的端口、暴露的数据库端口、host-network 模式、特权容器以及 Kubernetes 特有的风险(NodePort, 无 NetworkPolicy 的 LoadBalancer)。每个容器镜像都通过 OCI manifest 检查映射到其软件生态系统,以提供与 CVE 相关的上下文。 ### 更新智能 知道你的镜像何时有可用更新。扫描 OCI registry,比较 digest。带有正确 `--project-directory` 标志的 Compose 感知更新和回滚命令。停止盲目运行 `docker pull`。 ### 告警引擎 跨所有监控源的统一告警。包含 Webhook 和 Discord 频道。用于计划维护的静默规则。投递时的指数退避重试。maintenant Pro 提供 Slack, Teams 和 email 频道。 ### 公开状态页面 为你的用户提供一个简洁、实时的状态页面。组件分组、实时 SSE 更新、跨所有监控器的严重性聚合。 ### MCP Server 内置 [Model Context Protocol](https://modelcontextprotocol.io/) 服务器。从任何兼容 MCP 的 AI 助手查询你的基础设施、读取日志和检查告警状态。支持 stdio 和 Streamable HTTP 传输,并为远程客户端(Claude web, Claude mobile, Claude Desktop)提供完整的 OAuth2 认证。 ## 配置 ### 环境变量 | 变量 | 默认值 | 描述 | | ----------------------------------- | ----------------------- | ----------------------------------------------- | | `MAINTENANT_ADDR` | `127.0.0.1:8080` | HTTP 绑定地址 | | `MAINTENANT_DB` | `./maintenant.db` | SQLite 数据库路径 | | `MAINTENANT_BASE_URL` | `http://localhost:8080` | 基础 URL (用于心跳 ping URL) | | `MAINTENANT_ORGANISATION_NAME` | `Maintenant` | 状态页面上的组织名称 | | `MAINTENANT_CORS_ORIGINS` | same-origin | CORS 允许的来源 (逗号分隔) | | `MAINTENANT_RUNTIME` | auto-detect | 强制指定 `docker` 或 `kubernetes` | | `MAINTENANT_MAX_BODY_SIZE` | `1048576` | 最大请求体大小 (字节, 1 MB) | | `MAINTENANT_UPDATE_INTERVAL` | `24h` | 更新智能扫描间隔 | | `MAINTENANT_LICENSE_KEY` | — | Pro 许可证密钥 (启用 Pro 功能) | | `MAINTENANT_MCP` | `false` | 启用 MCP server (在 `/mcp` 提供 Streamable HTTP) | | `MAINTENANT_MCP_CLIENT_ID` | — | 用于 MCP 认证的 OAuth2 client ID | | `MAINTENANT_MCP_CLIENT_SECRET` | — | 用于 MCP 认证的 OAuth2 client secret | | `MAINTENANT_K8S_NAMESPACES` | all | Namespace 允许列表 (逗号分隔) | | `MAINTENANT_K8S_EXCLUDE_NAMESPACES` | none | Namespace 拒绝列表 | ### Docker Labels 参考
容器设置 ``` labels: maintenant.ignore: "true" # Exclude from monitoring maintenant.group: "backend" # Custom group name maintenant.alert.severity: "critical" # critical | warning | info maintenant.alert.restart_threshold: "5" # Restart loop threshold maintenant.alert.channels: "ops-webhook" # Route to specific channels ```
端点监控 ``` labels: # Simple — one endpoint per container maintenant.endpoint.http: "https://app:8443/health" maintenant.endpoint.tcp: "db:5432" # Indexed — multiple endpoints per container maintenant.endpoint.0.http: "https://app:8443/health" maintenant.endpoint.1.tcp: "redis:6379" # Tuning maintenant.endpoint.interval: "30s" maintenant.endpoint.timeout: "10s" maintenant.endpoint.http.method: "POST" maintenant.endpoint.http.expected-status: "200,201" maintenant.endpoint.http.tls-verify: "false" maintenant.endpoint.http.headers: '{"Authorization":"Bearer tok"}' maintenant.endpoint.failure-threshold: "3" maintenant.endpoint.recovery-threshold: "2" ```
TLS 证书监控 ``` labels: maintenant.tls.certificates: "example.com:443,api.example.com:443" ```
完整技术栈示例 ``` services: maintenant: image: ghcr.io/kolapsis/maintenant:latest ports: - "8080:8080" volumes: - /var/run/docker.sock:/var/run/docker.sock:ro - /proc:/host/proc: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" maintenant.alert.channels: "ops-webhook" 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: ```
## 安全模型 maintenant 不包含内置身份验证 —— 这是设计使然。 像 Dozzle、Prometheus 和大多数自托管监控工具一样,maintenant 旨在置于你现有的反向代理 + 认证中间件之后。无需管理另一套用户账户。 ``` Internet -> Reverse Proxy (Traefik / Caddy / nginx) -> Auth (Authelia / Authentik / OAuth2 Proxy) -> maintenant ```
示例: Traefik + Authelia ``` services: maintenant: image: ghcr.io/kolapsis/maintenant:latest labels: traefik.enable: "true" traefik.http.routers.maintenant.rule: "Host(`now.example.com`)" traefik.http.routers.maintenant.middlewares: "authelia@docker" volumes: - /var/run/docker.sock:/var/run/docker.sock:ro - /proc:/host/proc:ro - maintenant-data:/data environment: MAINTENANT_ADDR: "0.0.0.0:8080" MAINTENANT_DB: "/data/maintenant.db" MAINTENANT_BASE_URL: "https://now.example.com" ```
## 告警源 | 来源 | 事件 | 默认严重性 | | ----------- | -------------------------------------- | ----------------- | | Container | `restart_loop`, `health_unhealthy` | Warning | | Endpoint | `consecutive_failure` | Critical | | Heartbeat | `deadline_missed` | Critical | | Certificate | `expiring`, `expired`, `chain_invalid` | Critical | | Resource | `cpu_threshold`, `memory_threshold` | Warning | | Update | `available` | Info | 投递到 Discord 或任何 HTTP webhook。maintenant Pro 可提供 Slack, Teams 和 email。 ## API `/api/v1/` 下的完整 REST API,用于自动化和集成。
端点参考 | Resource | Endpoints | | ------------ | ------------------------------------------------------------------------------------------------------- | | Containers | `GET /containers` `GET /containers/{id}` `GET /containers/{id}/transitions` `GET /containers/{id}/logs` | | Endpoints | `GET /endpoints` `GET /endpoints/{id}` `GET /endpoints/{id}/checks` `GET /endpoints/{id}/uptime/daily` | | Heartbeats | `GET POST /heartbeats` `GET PUT DELETE /heartbeats/{id}` `POST /heartbeats/{id}/pause\|resume` | | Certificates | `GET POST /certificates` `GET PUT DELETE /certificates/{id}` | | Resources | `GET /containers/{id}/resources/current\|history` `GET /resources/summary\|top` | | Alerts | `GET /alerts` `GET /alerts/active` `GET POST /channels` `GET POST /silence` | | Webhooks | `GET POST /webhooks` `POST /webhooks/{id}/test` | | Status Page | `GET POST /status/groups\|components\|incidents\|maintenance` | | Updates | `GET /updates` `POST /updates/scan` | | Security | `GET /security/insights` `GET /security/summary` `GET /security/insights/{id}` | | Events | `GET /containers/events` *(SSE stream)* | | Health | `GET /health` |
## 架构 ``` ┌──────────────────────────────────────────────────────┐ │ Single Go Binary │ │ │ │ ┌────────────────────────────────────────────┐ │ │ │ Vue 3 + TypeScript + Tailwind (embed.FS) │ │ │ │ Real-time SSE · uPlot charts · PWA │ │ │ └────────────────────────────────────────────┘ │ │ | │ │ ┌────────────────────────────────────────────┐ │ │ │ REST API v1 + SSE Broker │ │ │ └────────────────────────────────────────────┘ │ │ | | │ │ ┌─────────────┐ ┌──────────────────────┐ │ │ │ Docker │ │ Kubernetes │ │ │ │ Runtime │ │ Runtime │ │ │ └─────────────┘ └──────────────────────┘ │ │ | | │ │ ┌────────────────────────────────────────────┐ │ │ │ Containers · Endpoints · Heartbeats · │ │ │ │ Certificates · Resources · Alerts · │ │ │ │ Updates · Security · Status Page · │ │ │ │ Webhooks │ │ │ └────────────────────────────────────────────┘ │ │ | │ │ ┌────────────────────────────────────────────┐ │ │ │ SQLite (WAL · single-writer · zero │ │ │ │ external dependencies) │ │ │ └────────────────────────────────────────────┘ │ └──────────────────────────────────────────────────────┘ ``` - **单一二进制文件** — 前端通过 `embed.FS` 嵌入。只需部署一个文件。 - **零依赖** — SQLite 是唯一的数据库。无需 Redis,无需 Postgres,无需消息队列。 - **实时** — SSE 将每个状态变更即时推送到浏览器。 - **只读** — maintenant 永远不会触碰你的容器。仅作观察。 - **Label 驱动** — 通过 Docker labels 配置监控。无需维护 YAML。 - **~17 MB 内存** — 足够轻量,可在任何 VPS 或 Raspberry Pi 上运行。 ## 版本 maintenant 开箱即用,功能完备。**Pro 版本** 适用于需要高级告警、漏洞情报和扩展通知频道的团队。 | Feature | Community | Pro | |---------|:---------:|:---:| | 容器自动发现 | x | x | | 端点监控 (HTTP/TCP) | x | x | | 心跳/cron 监控 | x (最多 10 个) | x (无限制) | | TLS 证书监控 | x | x | | 资源指标 | x | x | | 网络安全洞察 | x | x | | 更新智能 (digest 扫描) | x | x | | 告警引擎 (触发, 恢复, 静默) | x | x | | Webhook + Discord 频道 | x | x | | 公开状态页面 (组件, 分组) | x | x | | REST API + SSE + MCP | x | x | | PWA 支持 | x | x | | Slack, Teams, Email 频道 | | x | | 告警升级 + 路由 | | x | | 维护窗口 | | x | | 安全态势仪表盘 | | x | | CVE 富化 + 风险评分 | | x | | 事件管理 | | x | | 订阅者通知 | | x | 要激活 Pro,请在环境中设置你的许可证密钥: ``` MAINTENANT_LICENSE_KEY=your-license-key ``` 了解更多,请访问 [kolapsis.github.io/maintenant](https://kolapsis.github.io/maintenant/)。 ## 许可证 Copyright 2025-2026 Benjamin Touchard / kOlapsis — Bordeaux, France 根据 [GNU Affero General Public License v3.0](LICENSE) (AGPL-3.0) 或商业许可证授权。
标签:API集成, DNS解析, Docker, EVTX分析, HTTP/TCP 探测, LangChain, SSL 证书监控, 仪表盘, 可观测性, 子域名突变, 安全防御评估, 容器监控, 容器管理, 开源项目, 心跳检测, 性能指标, 日志审计, 服务健康检查, 状态页, 监控工具, 统一监控平台, 自动化运维, 自托管, 请求拦截, 资源调度, 轻量级