# PortHub **Repository Path**: grow-project/port-hub ## Basic Information - **Project Name**: PortHub - **Description**: Mac 本地服务监控工具 - 一站式管理 Homebrew 服务、Docker 容器和系统端口。 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-06-29 - **Last Updated**: 2026-06-29 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # PortHub Mac 本地服务监控工具 - 一站式管理 Homebrew 服务、Docker 容器和系统端口。 ## 功能 - 🖥️ **系统状态监控**:查看 CPU、内存、网络、磁盘、电池和系统运行时间 - 🍺 **Homebrew 服务管理**:查看、启动、停止、重启 brew 服务 - 🐳 **Docker 容器管理**:启停、查看日志、删除容器 - 🔍 **端口扫描**:查看所有监听中的 TCP 端口及对应进程 - 📊 **菜单栏常驻**:随时一键操作,无需打开主窗口 - 🔄 **自动刷新**:5 秒自动更新状态(可配置) ## 系统要求 - macOS 14.0 (Sonoma) 或更高 - Apple Silicon 或 Intel Mac - 可选:Homebrew(管理 brew 服务) - 可选:Docker Desktop(管理容器) ## 快速安装(一键脚本) ```bash cd /Users/liuk/tests/PortHub ./build-and-install.sh ``` 脚本会自动: 1. 安装 xcodegen(如果没有) 2. 生成 Xcode 项目 3. 编译 Release 版本 4. 安装到 `/Applications/PortHub.app` 5. 自动启动 ⚠️ **首次启动**:macOS Gatekeeper 会拦截未签名应用,请到: **系统设置 → 隐私与安全性 → 拉到底部 → 点击 "仍要打开 PortHub"** ## 在 Xcode 中开发 ```bash # 1. 安装 xcodegen brew install xcodegen # 2. 生成 Xcode 项目 xcodegen generate # 3. 在 Xcode 中打开 open PortHub.xcodeproj # 4. ⌘R 运行 ``` ## 手动创建 Xcode 项目(不用 xcodegen) 1. 打开 Xcode → File → New → Project 2. 选 **macOS → App** 3. 配置: - Product Name: `PortHub` - Team: None - Organization Identifier: `com.porthub` - Interface: **SwiftUI** - Language: **Swift** 4. 保存路径选 `/Users/liuk/tests/PortHub`(覆盖 PortHubApp.swift) 5. 删除自动生成的 `ContentView.swift` 6. 把本仓库 `PortHub/` 目录下所有 `.swift` 文件**拖进**项目(勾选 "Copy items if needed") 7. **Target → Signing & Capabilities**: - Signing Certificate: **Sign to Run Locally**(不签名) - 添加 Entitlements 文件:`PortHub.entitlements` 8. **Target → Build Settings → Deployment**: - macOS Deployment Target: `14.0` 9. **Target → Info → Custom macOS Application Target Properties** 中添加: - `LSMinimumSystemVersion`: `14.0` 10. ⌘R 运行 ## 项目结构 ``` PortHub/ ├── PortHub/ │ ├── App/ # 入口、AppDelegate │ ├── Core/ │ │ ├── Services/ # 业务服务(ShellExecutor、BrewService...) │ │ ├── Models/ # 数据模型 │ │ └── Utils/ # 工具类(Logger) │ ├── Features/ │ │ ├── Dashboard/ # 主窗口 │ │ ├── Brew/ # Brew 视图 │ │ ├── Docker/ # Docker 视图 │ │ ├── Ports/ # 端口扫描视图 │ │ ├── MenuBar/ # 菜单栏 UI │ │ └── Settings/ # 偏好设置 │ └── Resources/ # Info.plist / Entitlements ├── project.yml # XcodeGen 配置 ├── build-and-install.sh # 一键编译安装脚本 └── README.md ``` ## 关键技术点 ### 1. PATH 问题(最大的坑) macOS GUI 应用启动时,`PATH` **不包含** `/opt/homebrew/bin`,导致直接调用 `brew` / `docker` 会找不到命令。 `ShellExecutor` 中通过**手动注入完整 PATH** 解决: ```swift private static let augmentedPATH = [ "/opt/homebrew/bin", "/opt/homebrew/sbin", // Apple Silicon "/usr/local/bin", "/usr/local/sbin", // Intel "/usr/bin", "/bin", "/usr/sbin", "/sbin", "/Applications/Docker.app/Contents/Resources/bin" ].joined(separator: ":") ``` ### 2. 沙盒必须关闭 `PortHub.entitlements`: ```xml com.apple.security.app-sandbox ``` 否则无法用 `Process` 调用外部命令,也就无法上 **Mac App Store**(这是预期的,走 Developer ID 分发)。 ### 3. 菜单栏 + 主窗口架构 使用 SwiftUI `MenuBarExtra` + `WindowGroup` 组合: - 默认 `.accessory` 模式(只在菜单栏,无 Dock 图标) - 打开主窗口时切换为 `.regular` ### 4. 系统状态采样 CPU、内存、网络、磁盘、电池均使用 macOS 公开 API(Mach / sysctl / getifaddrs / IOKit),不依赖 `top` / `vm_stat` / `iostat` 等 shell 命令,避免菜单栏常驻时频繁 fork 子进程。 这些 API 在 Apple Silicon 和 Intel Mac 上通用;项目未限定 `ARCHS`,默认构建为 `arm64 + x86_64` Universal Binary。 ## 路线图 - [x] v1.0 - Brew/Docker/端口 基础功能 - [ ] v1.1 - 服务日志实时流(`docker logs -f`) - [ ] v1.2 - 告警(端口异常推送通知) - [ ] v1.3 - 自定义服务(非 brew 安装的进程) - [ ] v1.4 - Docker Compose 项目支持 - [ ] v2.0 - 代码签名 + 公证 + Sparkle 自动更新 ## 常见问题 **Q: 启动后菜单栏没图标?** A: 检查 macOS 顶部菜单栏右侧的服务器图标。如果菜单栏过满,部分图标会被隐藏,可拖动调整。 **Q: 提示 "brew 命令未找到"?** A: 确认 `/opt/homebrew/bin/brew`(Apple Silicon)或 `/usr/local/bin/brew`(Intel)存在。 **Q: Docker 显示 "未运行"?** A: 确认 Docker Desktop 已启动,执行 `docker info` 应返回服务器信息。 **Q: 应用无法打开("已损坏")?** A: 运行 `xattr -cr /Applications/PortHub.app` 移除 quarantine 属性。