fran-olivares/usulnet
GitHub: fran-olivares/usulnet
一个基于单一 Go 二进制文件的自托管 Docker 基础设施管理平台,将容器编排、网络代理、安全、监控和备份等运维能力整合在一个 Web 界面中,旨在替代多种分散的运维工具。
Stars: 119 | Forks: 6
# usulnet
自带隐私工具的自托管 Docker 管理平面。单一
Go 二进制文件,AGPL-3.0,一次构建——本仓库中的所有功能都在
标准二进制文件中提供,没有版本限制,没有回传电话。
[](go.mod)
[](LICENSE)
[](https://github.com/fr4nsys/usulnet/releases)
usulnet 在你自有的硬件上通过单一进程管理容器生命周期、安全扫描、备份、
反向代理配置、监控、多节点编排、主机
基础架构工具(防火墙、crontab、WireGuard mesh、docker-engine
config、镜像构建器)以及一个可选的隐私模块(OSINT 侦察和
文件元数据清理)。
v26.5.2 Beta — 发布于 2026-05-19。Bug 报告:
[issues](https://github.com/fr4nsys/usulnet/issues)。发布说明:
[`CHANGELOG.md`](CHANGELOG.md) 和
[`docs/v26.5.2/release-notes.md`](docs/v26.5.2/release-notes.md)
(v26.5.1 归档:
[`docs/v26.5/release-notes-v26.5.1.md`](docs/v26.5/release-notes-v26.5.1.md))。

## 快速开始
```
curl -fsSL https://raw.githubusercontent.com/fr4nsys/usulnet/main/deploy/install.sh | sudo bash
```
安装程序会拉取生产环境的 compose 文件,生成数据库
密码、JWT 密钥、AES-256 数据加密密钥以及自签名的 TLS
证书。准备就绪后,它会打印访问 URL。

打开 `https://:7443`,以 `admin` / `usulnet` 登录,然后
在个人资料页面更改密码。

手动 Docker Compose 安装、独立二进制文件安装和离线
步骤请参阅 [`docs/installation.md`](docs/installation.md)。
## v26.5.2 的新特性
在 v26.5.1 基础上的优化版本。**无需数据库迁移。** 将
Shodan 侦察连接器添加到 AGPL 二进制文件中(继 HIBP 之后的第二个自带密钥外部
连接器),将 `usulnet-agent` 移植到 Cobra,包含 `run` /
`version` / `validate-config` 子命令和规范的
`USULNET_AGENT_DOCKER_HOST` 环境变量,推出了全局 CLI `--quiet` /
`--json` 标志以及 JSON 错误封装,添加了 `migrate up` /
`down [N]` / `status` 子命令,在整个 Web 界面中引入了 header / sidebar / modal /
flash a11y 地标,将 shell tab 自动补全内置到两个生产环境的 Docker 镜像中,并发布了新的操作员 CLI
参考文档 [`docs/cli.md`](docs/cli.md)。各功能的详细信息见
[`docs/v26.5.2/release-notes.md`](docs/v26.5.2/release-notes.md);
每个 PR 的完整更新日志见
[`CHANGELOG.md`](CHANGELOG.md) 中的 `[v26.5.2]` 部分。
## v26.5.1 的内容
之前受 Business 版本限制的十一个模块现在包含在
标准的 AGPL 构建中,此外还有 proxy-extended 增强和
可选的本地服务 TLS 调度器。各功能的详细信息见
[`docs/v26.5/release-notes-v26.5.1.md`](docs/v26.5/release-notes-v26.5.1.md);
每次迁移的完整审计见
[`CHANGELOG.md`](CHANGELOG.md) 中的 `[v26.5.1]` 部分。

| 模块 | 功能说明 |
| --- | --- |
| **Calendar** | 运维日历,支持手动事件以及对备份运行和计划任务的只读聚合;支持 RFC 5545 `.ics` 导出。 |
| **Proxy extended** | 访问列表、死主机、位置、重定向、流。权威状态存储在 PostgreSQL 中;后端功能矩阵通过 `GET /api/v1/proxy/support` 呈现。 |
| **DNS** | 支持 Cloudflare、AWS Route 53、DigitalOcean、RFC 2136 的提供商插件。支持在重启后依然有效的 ACME DNS-01 状态机。静态凭证使用 AES-256-GCM 加密。 |
| **Crontab** | 通过 `robfig/cron/v3` 调度的托管型 shell / docker / http cron 任务。支持 WebSocket 实时追踪、分页执行记录以及主体大小限制。 |
| **Firewall** | 通过现有的主机管理 SSH 通道进行 UFW / nftables / iptables 规则管理。 |
| **SSL observatory** | 进程内 TLS 扫描、证书健康评分、基于目标的告警阈值、SNI 虚拟主机扫描、每日扫描。 |
| **Backup verification** | 在沙盒化的 recon-launcher 容器中进行计划 + 按需恢复测试。通过 backup-service `Verify` pipeline 进行真实的校验和及解压。 |
| **Image builder** | 本地 Dockerfile pipeline,支持实时日志流(Redis pub/sub + WebSocket/SSE),256 MiB 上下文限制,七个兼容 AGPL 的入门模板,可选 cosign 钩子。 |
| **Automated rollback** | 通过事件驱动的 `changes.Service.Subscribe` 检测失败的部署,并恢复到上一个已知的良好 stack 版本。支持每个 stack 的互斥锁、冷却时间、dry-run 预览、仅追加的 Postgres 触发审计日志。 |
| **WireGuard** | Peer + 接口管理器,通过 NATS 扩展为主→代理 mesh。真实的 Curve25519 密钥,静态数据使用 AES-256-GCM 加密,5 分钟 TTL 的一次性 QR,每个代理的 mesh 状态页面。 |
| **Marketplace** | 通过 `go:embed` 内置于二进制文件中的精选应用目录。运行时不产生任何出站 HTTP。仅限本地评价。通过 stack 服务进行安装。 |
同样在 v26.5.1 中:**docker-engine 配置**编辑器(支持原子
`daemon.json` 写入及快照历史和重载回滚 —
无需迁移),**侧边栏版本清理**(所有
`isEditionAvailable` / `RequireFeature` / `limitProvider` 调用点
已移除;`license.CELimits()` 合并到了 `license.OpenLimits()`),
**bootstrap 重构**(将 2,700 行的 `startStandalone` 拆分
为分阶段的 `init_*.go` 文件),以及通过
`USULNET_TLS_LOCAL_SERVICES=true` 实现的**可选本地服务 TLS**,用于集群内的 Postgres / Redis /
NATS。
## 功能
### Docker 控制平面
| 领域 | 能力 |
| --- | --- |
| Containers | 完整生命周期(创建 / 启动 / 停止 / 重启 / 暂停 / 终止 / 移除)、批量操作、实时统计、exec 终端、日志查看器、文件系统浏览器。 |
| Images | 拉取、检查、清理、层历史;Docker Hub 和带有加密凭证的私有镜像库。 |
| Image builder | 本地 Dockerfile 构建流水线,带有实时日志流(Redis pub/sub + WebSocket/SSE),有上限的上下文上传(默认 256 MiB),兼容 AGPL 的入门模板,可选 cosign 签名钩子。 |
| Volumes and networks | 创建、检查、清理、文件浏览器;bridge / overlay / macvlan;连接和断开容器。 |
| Stacks | 从 YAML、Git 仓库或内置目录进行 Docker Compose 部署。 |
| Marketplace | 离线的精选应用目录,通过 `go:embed` 内置于二进制文件中;仅限本地评论;安装操作通过模板化的 docker-compose 驱动现有的 stack。 |
| Swarm | 集群初始化、节点管理、服务、副本扩容、独立到 swarm 的转换。 |
| Multi-node | `standalone`、`master` 和 `agent` 模式;通过 NATS 进行带有 mTLS 的代理 ↔ master 流量;通过 SSH 从 UI 部署代理。 |
| Reverse proxy | Caddy 和 Nginx Proxy Manager 适配器;带有自动续期的 Let's Encrypt;TCP/UDP 流代理。扩展状态(访问列表、死主机、位置、重定向、流)在 PostgreSQL 中作为权威状态,具有明确的后端支持矩阵。 |
| DNS automation | 支持 Cloudflare、AWS Route 53、DigitalOcean 和 RFC 2136 域名服务器的提供商插件;能在重启后存活的 ACME DNS-01 状态机;静态凭证使用 AES-256-GCM 加密。 |
| Backups | 容器 / 卷 / stack 目标;带有保留策略的 cron 计划;gzip 或 zstd;支持本地、S3、MinIO、Azure Blob、GCS、B2、SFTP。 |
| Backup verification | 在沙盒容器(只读 rootfs、丢弃 capabilities、no-new-privileges、默认 seccomp)中进行计划 + 按需恢复测试;通过 backup-service `Verify` pipeline 进行真实校验和和解压。 |
| Automated rollback | 通过事件驱动的 `changes` 订阅检测失败的部署,并回滚到上一个已知良好的 stack 版本;每个 stack 的互斥锁可防止手动部署发生冲突;冷却窗口;dry-run 预览;通过 Postgres 触发器实现仅追加的审计日志。 |
| SSL observatory | 进程内 TLS 扫描、证书健康评分、基于目标的告警阈值、SNI 虚拟主机扫描、每日计划扫描、通过通知服务路由的过期警报。 |
| Monitoring | 每个容器和主机的 CPU / RAM / 网络 / 磁盘;具有 `OK → Pending → Firing → Resolved` 状态机的阈值警报;11 个通知渠道(Email、Slack、Discord、Telegram、Gotify、ntfy、PagerDuty、Opsgenie、Microsoft Teams、通用 webhook、自定义)。 |
| Logs and events | 带有搜索功能的聚合容器日志;带有过滤功能的 Docker 事件流;每个网络接口的 packet capture。 |
| Vulnerabilities | 针对镜像和文件系统的 Trivy CVE 扫描;每个容器和整个基础架构的 0–100 安全评分;CycloneDX 和 SPDX 格式的 SBOM;Docker CIS Benchmark 检查。 |
| Calendar | 带有手动事件和对备份运行 + 计划任务进行只读聚合的运维日历;支持 RFC 5545 `.ics` 导出。 |

### 主机和基础架构工具
| 领域 | 能力 |
| --- | --- |
| Firewall | 通过现有的 SSH 主机通道进行 UFW / nftables / iptables 规则管理。Web UI + REST API;闭枚举验证;每次应用的审计日志。 |
| Crontab | 使用 `robfig/cron/v3` 解析的托管 cron 任务(shell、docker、http 类型);分页执行;WebSocket 实时追踪;HTTP 主体限制为 64 KiB。 |
| Docker engine config | `/etc/docker/daemon.json` 编辑器,支持原子写入(temp + `fsync` + `rename`)、带有轮转的快照历史,以及在严格的 60 秒超时下的重载与回滚。Monaco diff 编辑器 + 历史记录页面。 |
| WireGuard | 扩展为通过 NATS 网关的 master→agent mesh 的 Peer + 接口管理器。真实的 Curve25519 密钥,静态的私有/预共享密钥使用 AES-256-GCM 加密,带有 5 分钟 TTL 的一次性 QR 端点,每个 agent 的 mesh 状态页面。 |


### 能力要求
上表中的模块通过现有的
主机管理传输或 bind mount 连接到主机。能力要求:
| 模块 | 需求 |
| --- | --- |
| firewall | agent 进程具有 `NET_ADMIN` capability;主机上可用 `ufw` / `nft` / `iptables`。 |
| WireGuard | 每个 agent 主机上有 WireGuard kernel module + `wg` / `wg-quick`;agent 进程具有 `NET_ADMIN` capability;master 上设置了 `USULNET_ENCRYPTION_KEY`。 |
| docker-engine config | 主机的 `/etc/docker` 以 `:rw` 方式 bind mount 到 usulnet 容器中。 |
| image builder | 挂载 Docker socket(平台已要求)。 |
| backup verification | 挂载 Docker socket(已要求)。 |
| DNS providers | 到每个提供商 API 端点的出站访问权限;已设置 `USULNET_ENCRYPTION_KEY`。 |
所有其他 v26.5.1 模块(crontab、-observatory、calendar、
marketplace、rollback、proxy-extended)除了默认的
compose stack 外不需要任何其他内容。完整详情见
[`docs/installation.md`](docs/installation.md#capability-requirements-v2651-modules)。
### 隐私和侦察(可选)
默认关闭 — 每个 recon 路由都会返回 404,直到管理员设置
`USULNET_RECON_ENABLED=true` 并记录法律声明确认
(`POST /api/v1/recon/_ack`)。完整的设计和威胁模型见
[`docs/recon.md`](docs/recon.md);签名审核见
[`docs/v26.5/security-review-checklist.md`](docs/v26.5/security-review-checklist.md)。

| 领域 | 能力 |
| --- | --- |
| OSINT recon | 由 SpiderFoot 驱动,针对电子邮件、域名、电话、IP、用户名进行被动扫描。在扫描开始前会验证所有权(DNS TXT、电子邮件链接、RDAP、管理员证明、自我声明)。 |
| Scan profiles | 四个内置配置文件,加上对用户自定义配置的完整 CRUD。内置行不可变;模块目录是封闭的。 |
| Reports | 每次扫描的 JSON、CSV 和分页 A4 PDF,位于 `/api/v1/recon/scans/{id}/report.{json,csv,pdf}`。PDF 由纯 Go 生成且字节确定。 |
| Metadata hygiene | `mat2` 剥离以及 `exiftool` / `pdfid` / `oletools` 提取。每个任务都在一个新的容器中运行,带有只读的 rootfs,丢弃所有 Linux capabilities,seccomp 为默认值,并有 PID / 内存限制。 |
| Sandbox network | 专用的 `usulnet-recon` Docker 网络,具有严格的出站允许列表(默认为 DNS、80、443)。 |
| HIBP connector | 可选的 Have-I-Been-Pwned 集成。凭证以 AES-256-GCM 加密静态存储在 `recon_connectors` 中;密钥永远不会通过 API 或日志返回。 |
| Retention | 每日清理超过租户 TTL(默认 90 天)的发现、扫描和审计日志。对元数据工件进行两阶段删除。 |
| Audit | 仅追加的 `recon_audit_log` 记录每个改变状态的操作,包含执行者、目标和请求哈希。 |
### 身份验证、RBAC、平台
| 领域 | 能力 |
| --- | --- |
| Authentication | 带有可配置过期时间的 JWT;用于编程访问的 `X-API-KEY`;带有备份代码的 TOTP 2FA;LDAP / Active Directory;OAuth2 / OIDC(GitHub、Google、Microsoft、自定义)。 |
| Authorisation | 带有 44+ 个细粒度权限的 RBAC、自定义角色、基于团队的资源范围划分。 |
| Secrets | 为所有敏感值提供静态 AES-256-GCM 加密;bcrypt 密码哈希;可配置的密码复杂性;账户锁定。 |
| Transport | 带有自动生成的自签名证书(或自带)的 TLS;用于节点间消息传递的 mTLS;可配置的速率限制;CSRF;安全的默认 cookie。通过 `USULNET_TLS_LOCAL_SERVICES=true` 为集群内的 Postgres / Redis / NATS 启用可选的本地服务 TLS。 |
| Audit | 将每个用户的操作日志持久化到 PostgreSQL,包含 IP、时间戳、详细信息;支持 CSV 导出。 |
| Observability | Prometheus `/metrics`(管理员认证),包括 Go runtime 和进程指标;OpenTelemetry 监测。 |
| API | 位于 `/api/v1` 下的 REST;位于 `/api/v1/openapi.json` 的 OpenAPI 3.0;位于 `/docs/api` 的 Swagger UI;用于日志、exec、统计、事件、指标、packet capture 和 nvim 的 WebSocket 流。 |
### 开发者工具
基于 Web 的终端中心,带有容器 exec 和主机 SSH。
带有 `lazy.nvim` 的 Monaco 编辑器和 Neovim,用于浏览器内文件编辑。
适用于容器、主机和 SFTP 的文件系统浏览器。代码片段和速查
表。在容器事件上触发带有重试机制的传出 webhook。由 Git push 触发的
自动部署规则。用于多步操作的 Runbooks。
用于备份、扫描、指标、更新检查、recon
保留和清理的 Cron 计划任务。
## 架构
usulnet 以单一二进制文件形式提供,可在以下三种模式之一下运行:
- `standalone` — 单个 Docker 主机,所有服务在本地。不需要 NATS。
- `master` — `standalone` 加上用于远程 agent 的 NATS 网关服务器。
- `agent` — 通过 NATS 连接到 master。无 Web UI;针对
其本地主机执行 Docker 操作。
PostgreSQL 跨 **56 个迁移**存储领域状态(users、RBAC、
connections、backups、scans、alerts、recon、audit log,加上 v26.5.1
移植的模块:calendar、proxy-extended、DNS、crontab、firewall、SSL
observatory、backup verification、image builder、automated rollback、
WireGuard、marketplace)。Redis 支持会话存储和 JWT
黑名单。带有 JetStream 的 NATS 带有持久化地承载节点间流量。完整的组件图、请求流程和拓扑结构见
[`docs/architecture.md`](docs/architecture.md)。
### 多节点设置
```
# 在 control plane 主机上
export USULNET_MODE=master AGENT_TOKEN=
docker compose up -d
# 在每个您想要管理的远程主机上
docker run -d --name usulnet-agent --restart unless-stopped \
-v /var/run/docker.sock:/var/run/docker.sock \
usulnet/usulnet-agent:latest \
--gateway nats://:4222 \
--token
```
Master ↔ agent 流量在
`usulnet-backend` Docker 网络上通过带有 mTLS 的 NATS 流动。完整的 agent 协议、NATS subject
映射和 TLS 配置见 [`docs/agents.md`](docs/agents.md)。

### 技术栈
| 层级 | 组件 |
| --- | --- |
| 语言 | Go 1.25.10 |
| HTTP router | Chi v5 |
| Templates | Templ(编译时 HTML) |
| CSS | 通过独立 CLI 使用 Tailwind(无 Node.js) |
| 浏览器 | Alpine.js, HTMX, xterm.js, Monaco |
| 数据库 | 通过 pgx/v5 和 sqlx 使用 PostgreSQL 16 |
| 缓存 / 会话 | Redis 7 |
| 消息传递 | 带有 JetStream 的 NATS 2.10 |
| 身份验证 | JWT, OAuth2 / OIDC, LDAP, TOTP |
| 漏洞扫描器 | Trivy |
| PDF | gofpdf (纯 Go) |
| 调度 | robfig/cron v3 |
| DNS(提供商插件) | net/http (Cloudflare, DigitalOcean), aws-sdk-go-v2/route53, miekg/dns (RFC 2136 + TSIG) |
| WireGuard | golang.org/x/crypto/curve25519 + agent 端的 `wg` / `wg-quick` |
## 配置
`config.yaml` 加上以 `USULNET_` 为前缀的环境变量(嵌套
键由 `_` 连接)。Viper 加载器将环境覆盖视为
规范配置。
```
USULNET_SERVER_PORT=9090
USULNET_DATABASE_URL=postgres://usulnet:secret@db/usulnet?sslmode=disable
USULNET_SECURITY_JWT_SECRET=<64-hex>
USULNET_ENCRYPTION_KEY=<64-hex>
USULNET_RECON_ENABLED=true
USULNET_MODE=standalone
# 为集群内 Postgres / Redis / NATS 启用 TLS (v26.5.1)
USULNET_TLS_LOCAL_SERVICES=true
# Module knobs
USULNET_IMAGE_BUILDER_MAX_CONTEXT_BYTES=268435456 # 256 MiB
USULNET_SSL_OBSERVATORY_PER_TARGET_CONCURRENCY=4
```
完整的参考、默认值和生产 compose 模板见
[`docs/installation.md`](docs/installation.md)。
## CLI
```
usulnet serve # run the server
usulnet migrate up # apply pending migrations
usulnet migrate status # show migration state
usulnet migrate down [N] # roll back N migrations (default 1)
usulnet config check # validate configuration
usulnet config show # display config with secrets masked
usulnet admin reset-password # reset the admin password
usulnet recon … # opt-in recon subcommand tree
usulnet meta … # opt-in metadata hygiene subcommand tree
usulnet version # print build info
```
全局标志会影响每个子命令:`--quiet` 会抑制
信息性摘要(错误和主要数据仍会打印);
`--json` 是 `--output json` 的快捷方式,并且还会将
stderr 上的错误格式化程序切换为单记录封装 —
`{"error":"","code":}`。普通错误带有固定的
`usulnet:` 前缀。退出代码(0 成功,64 用法错误,70 基础架构,71
服务器不可达,72 身份验证)在整个二进制文件中是稳定的。完整
参考:[`docs/cli.md`](docs/cli.md)。
Agent 二进制文件(`usulnet-agent`)作为一个 Cobra 树提供,包含 `run`、
`version` 和 `validate-config` 子命令。在重启 agent 之前验证配置:
```
usulnet-agent validate-config --config /etc/usulnet-agent/config.yaml
```
完整的 agent 参考:[`docs/agents.md`](docs/agents.md)。

## API 示例
`/api/v1` 下的 REST,使用 `X-API-KEY` 或
`Authorization: Bearer ` 进行身份验证。完整的 OpenAPI 位于 `/api/v1/openapi.json`,
Swagger UI 位于 `/docs/api`。参考:[`docs/api.md`](docs/api.md)。
```
# 列出正在运行的容器
curl -fsSL -H "X-API-KEY: $USULNET_API_KEY" \
https://usulnet.example.com:7443/api/v1/containers?status=running | jq
# 浏览嵌入式 marketplace catalog
curl -fsSL -H "X-API-KEY: $USULNET_API_KEY" \
https://usulnet.example.com:7443/api/v1/marketplace/apps | jq '.[].slug'
# 针对每个已启用的目标触发 SSL observatory 扫描
curl -fsSL -X POST -H "X-API-KEY: $USULNET_API_KEY" \
https://usulnet.example.com:7443/api/v1/ssl/scan
# 通过 agent transport 在主机上应用 firewall rule
curl -fsSL -X POST -H "X-API-KEY: $USULNET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"host_id":"","chain":"INPUT","action":"ACCEPT","protocol":"tcp","port":22,"comment":"ssh"}' \
https://usulnet.example.com:7443/api/v1/firewall/rules
# 启动备份验证运行
curl -fsSL -X POST -H "X-API-KEY: $USULNET_API_KEY" \
https://usulnet.example.com:7443/api/v1/backup-verify/runs \
-d '{"backup_id":"","method":"extract"}'
```
用于实时容器日志 / exec / 统计信息 / 镜像构建
输出 / crontab 执行追踪的 WebSocket 端点遵循相同的路径方案,并带有
`Upgrade: websocket` 标头。
## 文档
| 主题 | 路径 |
| --- | --- |
| 安装与部署 | [`docs/installation.md`](docs/installation.md) |
| 能力要求(v26.5.1 模块) | [`docs/installation.md#capability-requirements-v2651-modules`](docs/installation.md#capability-requirements-v2651-modules) |
| 开发设置与工作流 | [`docs/development.md`](docs/development.md) |
| CLI 参考(`usulnet` 二进制文件) | [`docs/cli.md`](docs/cli.md) |
| REST 和 WebSocket API | [`docs/api.md`](docs/api.md) |
| 架构 | [`docs/architecture.md`](docs/architecture.md) |
| 侦察和元数据模块 | [`docs/recon.md`](docs/recon.md) |
| 多节点 Agent | [`docs/agents.md`](docs/agents.md) |
| 许可 | [`docs/licensing.md`](docs/licensing.md) |
| 签名安全审查(recon,v26.5) | [`docs/v26.5/security-review-checklist.md`](docs/v26.5/security-review-checklist.md) |
| 安全审查(v26.5.1 加固审计) | [`docs/v26.5/security-review-v26.5.1.md`](docs/v26.5/security-review-v26.5.1.md) |
| 安全审查(v26.5.2 加固审计) | [`docs/v26.5/security-review-v26.5.2.md`](docs/v26.5/security-review-v26.5.2.md) |
| 发行说明(v26.5.2) | [`docs/v26.5.2/release-notes.md`](docs/v26.5.2/release-notes.md) |
| 发行说明(v26.5.1) | [`docs/v26.5/release-notes-v26.5.1.md`](docs/v26.5/release-notes-v26.5.1.md) |
| 移植模块状态看板 | [`docs/v26.5/v26.5.1-ported-modules.md`](docs/v26.5/v26.5.1-ported-modules.md) |
| 完整更新日志 | [`CHANGELOG.md`](CHANGELOG.md) |
| 截图 | [`docs/screenshots/`](docs/screenshots/) |
## 开发
```
git clone https://github.com/fr4nsys/usulnet.git
cd usulnet
make dev-up # postgres, redis, nats, minio
make build # templ generate + tailwind compile + go build
make run
```
`make quality` 运行完整的门控:`golangci-lint`、`go vet`、
`scripts/check-naming.sh` 以及覆盖率阈值检查(临时
15 %,目标 40 %)。`make publish-public` 在
`build/public/` 下为发布工作流生成精心策划的
公共镜像树。完整的开发者指南 — 工作流、钩子、性能分析、调试 — 见
[`docs/development.md`](docs/development.md)。
提交遵循 [Conventional Commits](https://www.conventionalcommits.org)。
## 许可证
[AGPL-3.0-or-later](LICENSE)。自托管永久免费。
一个 AGPL 构建,包含所有功能 — 没有版本限制,没有闭源
扩展点,没有受付费许可等级限制的功能。可选的
商业支持合同记录在
[`docs/licensing.md`](docs/licensing.md) 中;它们不会解锁额外的
运行时功能。

## 安全
将漏洞报告发送至 。请勿针对
安全发现公开 issue。
安全态势:
- **外部端口暴露面:** 默认仅发布 HTTPS (7443)。
HTTP (8080) 和 NATS (4222) 保持在 `usulnet-backend`
Docker 网络内部。
- **无回传电话。** 在运行时不向任何 usulnet 控制的
端点发出出站请求。每个出站调用(镜像库、DNS 提供商、
OAuth 签发者、HIBP)均由操作员配置。
- **容器用户** `usulnet:1000`(非 root)。Recon 沙盒以
`nobody:nogroup` (65534) 身份运行,具有只读的 rootfs 并且所有 Linux
capabilities 均被丢弃。
- **静态数据使用 AES-256-GCM 加密** 适用于所有敏感值(密码为
bcrypt;WireGuard 密钥、DNS 提供商凭证、HIBP 密钥、原始
recon payloads、JWT 签名密钥、OAuth 客户端密钥)。
- **CI govulncheck** 在每次推送和 PR 时运行。v26.5.1 依赖
基线涵盖 Go 1.25.10、pgx 5.9.2、NATS 1.52.0、go-redis 9.19.0、
go-chi 5.2.5、jwt 5.3.1、go-oidc 3.18.0、go-ldap 3.4.13、
docker 28.5.2;两个 Moby 误报(GO-2026-4883、
GO-2026-4887)在带有内联理由的允许列表中。
完整的加固审计:
[`docs/v26.5/security-review-v26.5.2.md`](docs/v26.5/security-review-v26.5.2.md)
(当前 — 涵盖 v26.5.2 差异:Shodan 连接器、agent Cobra 移植、
CLI tab 自动补全安装脚本、Web a11y 地标、JSON 错误
封装、带有 BREACH 缓解的路由范围前端 gzip、批量
警报事件解决、request-id `strconv` 交换)和
[`docs/v26.5/security-review-v26.5.1.md`](docs/v26.5/security-review-v26.5.1.md)
(基线 — 移植到 AGPL 构建中的十一个 v26.2.7 模块)。
标签:Docker管理, EVTX分析, Go语言, VPN组网, 基础设施, 安全合规, 容器编排, 搜索引擎查询, 日志审计, 测试用例, 版权保护, 程序破解, 网络代理, 请求拦截, 运维平台