SSH 登录
在控制台打开对应实例,核对主机名、SSH 端口与用户名。用本地终端执行下面的命令,把大写参数替换为实例给出的实际值。
ssh -p SSH_PORT USER@HOST
SSH 常见端口为 22,但实例可能使用不同的对外端口。首次连接前核对主机指纹;指纹变化时先核实原因,不要直接忽略提示。
连接超时先检查主机名、网络与端口;出现权限拒绝,再检查用户名及认证方式。密码与私钥不要发到公开日志里。
先从控制台取出连接信息,再验证 SSH 或屏幕共享。下面按实际操作顺序,讲清文件怎么传、构建怎么跑、到期前怎么收好数据。
已经租用?实例的主机名、端口、用户名和到期时间,以登录后的控制台记录为准。不要把本文的演示记录当成真实凭据。
命令行任务先用 SSH;需要操作 macOS 图形界面时用屏幕共享;项目与产物通过 SSH 通道传输。不要靠猜端口反复尝试。
在控制台打开对应实例,核对主机名、SSH 端口与用户名。用本地终端执行下面的命令,把大写参数替换为实例给出的实际值。
ssh -p SSH_PORT USER@HOST
SSH 常见端口为 22,但实例可能使用不同的对外端口。首次连接前核对主机指纹;指纹变化时先核实原因,不要直接忽略提示。
连接超时先检查主机名、网络与端口;出现权限拒绝,再检查用户名及认证方式。密码与私钥不要发到公开日志里。
从控制台取得屏幕共享地址、端口与认证信息。在本地屏幕共享应用或兼容的 VNC 客户端里填入,不要沿用 SSH 的端口。
VNC 常见端口为 5900,实际对外端口仍以实例记录为准。不要把屏幕共享认证信息写进截图或团队公共文档。
优先使用受保护的连接方式。需要 SSH 隧道时,可把本地 5901 转发到实例的 VNC 服务,再连接本地地址。
ssh -N -L 5901:127.0.0.1:VNC_PORT -p SSH_PORT USER@HOST
上述转发仅适用于 VNC 服务在该实例上监听、且允许 SSH 转发的情况。黑屏与认证失败是不同问题,提交工单时分别说明。
先验证 SSH 能登录。传输同样走 SSH 端口;不需要另外开放文件传输服务。小文件用 scp,反复同步项目目录用 rsync。
scp -P SSH_PORT ./build.zip USER@HOST:~/
rsync -av -e "ssh -p SSH_PORT" ./project/ USER@HOST:~/project/
注意 scp 的端口参数是大写 -P,SSH 则是小写 -p。rsync 源路径末尾的斜线表示同步目录里的内容。
第一次同步不加自动删除选项。先确认目标路径和文件数量,再传大批素材。下载完成后核对压缩包完整性,不能只看进度条结束。
这是一段演示记录,用于识别三个不同阶段。示例主机名不代表可连接服务,输出也不是实时任务状态。
$ ssh admin@jp-0417.node.vpskeep.com
Welcome to your dedicated Mac mini.
$ xcodebuild -scheme App archive
** ARCHIVE SUCCEEDED **
$ fastlane beta
Successfully uploaded package to App Store Connect.
表示已进入远端会话,不代表项目环境已经安装完成。随后运行 sw_vers 与 xcodebuild -version,记录系统和工具版本。
ARCHIVE SUCCEEDED 表示归档阶段通过。示例的 App 是 scheme 名;真实项目还应指定 workspace 或 project、目标平台和输出路径。归档成功不等于已完成导出或分发。
beta 是项目自己定义的 lane,需要先配置签名与分发认证。上传成功后仍要检查平台处理结果;不要把本地命令退出视为已可供测试。
排错时保留失败命令、退出码和错误前后的日志。只提供最后一行“失败”,通常不足以定位环境、签名或网络问题。
同一项目在本地和远端使用不同版本,可能产生依赖解析或构建结果差异。先记录版本,再逐项调整;不要同时更新工具链和项目依赖。
运行下面两条检查命令。机器上已有多个 Xcode 时,可切换系统默认目录;只影响当前任务时,优先在进程环境里设置 DEVELOPER_DIR。
xcode-select -p
xcodebuild -version
sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer
DEVELOPER_DIR=/Applications/Xcode.app/Contents/Developer xcodebuild -version
路径必须对应实际安装的应用。是否预装目标版本,以实例环境为准;需要新增版本时使用合法授权的安装包,并先确认磁盘余量。
通过 Xcode 设置中的平台或组件管理入口安装与项目匹配的运行时,入口名称随版本变化。安装后列出可用设备,再选择测试目标。
xcrun simctl list runtimes
xcrun simctl list devices available
df -h
模拟器、DerivedData 与归档都会占用存储。批量测试前先做一次单设备验证,再增加并发;模拟器测试不等同于 iOS 真机测试。
把已授权的签名证书、配套私钥及描述文件通过受保护的通道传到实例。证书导入任务所用钥匙串,描述文件按所用 Xcode 版本的要求安装,再核对 Team、Bundle ID、证书有效期和目标分发类型。
security find-identity -v -p codesigning
CI 使用独立的构建钥匙串,密码放在受限的密钥变量中。非交互任务还需检查钥匙串解锁与签名工具访问权限,不能只凭图形界面里能看见证书就判断配置完成。
离开实例前移除不再需要的签名私钥、令牌和描述文件。提交工单时仅提供证书名称与错误文本,不发送私钥、密码或完整凭据。
Keep M4 L 配置为 M4 / 24GB / 512GB,可作为多分支构建的起点。并发数量由项目实测决定,不能直接用 CPU 核数推定可同时运行多少个 UI 测试。
从仓库或组织设置的 Actions runner 页面创建注册流程,选择 macOS 与匹配的架构,按页面给出的命令下载并注册。注册令牌只在需要的时间内使用,不写入代码仓库。
给实例增加清楚的标签,例如 macos、arm64 与团队用途标签。工作流按标签选择机器,避免签名任务误落到不具备证书的环境。
runs-on: [self-hosted, macOS, ARM64]
先手动启动 runner 跑一条测试任务,再按 runner 附带的服务脚本安装常驻服务。运行账户需要能访问项目目录、Xcode 和构建钥匙串。
安装适配实例架构的 GitLab Runner,在项目或团队管理界面取得注册信息,再执行 gitlab-runner register。需要原生 Xcode 工具链时,可按团队安全要求选择 shell executor。
shell executor 直接在机器上执行任务。仅接收可信项目,限制哪些分支与任务能够读取签名密钥;不要把不受信任的贡献代码送进带生产凭据的实例。
gitlab-runner --version
gitlab-runner verify
先确认注册与任务分派正常,再按安装方式配置服务。构建目录、缓存目录和日志输出位置应记录在团队交接文档中。
macOS 的常驻进程通常由 launchd 管理。用户级 LaunchAgent 与系统级 LaunchDaemon 的启动条件不同;如果服务依赖图形会话或用户钥匙串,不能直接照搬系统级启动配置。
GitHub Actions runner 的诊断文件通常位于安装目录的 _diag 下;任务步骤日志在流水线页面查看。GitLab Runner 的服务输出取决于安装与启动方式。自建 launchd 配置时,明确设置 StandardOutPath 和 StandardErrorPath,不要假定存在统一的系统日志文件。
记录 runner 名称、运行账户、Xcode 版本、工作目录及日志路径。并发任务使用独立 DerivedData 与产物目录;同名输出互相覆盖,会让偶发失败看起来像机器问题。
Keep M4 Pro 配置为 M4 Pro / 64GB / 2TB。统一内存同时服务系统、模型与其他进程;不能把全部容量都当成模型权重预算。下面仅估算权重,不是速度测试或可运行承诺。
| 模型参数量 | 4-bit 权重估算 | 8-bit 权重估算 | 加载前检查 |
|---|---|---|---|
| 约 7B 参数 | 约 3.3 GiB | 约 6.5 GiB | 适合先验证安装、模型格式与短上下文生成。 |
| 约 14B 参数 | 约 6.5 GiB | 约 13.0 GiB | 先测单请求峰值内存,再考虑批量任务。 |
| 约 32B 参数 | 约 14.9 GiB | 约 29.8 GiB | 长上下文与并发请求可能显著增加 KV cache。 |
换算基准:参数量 × 位宽 ÷ 8 ÷ 2³⁰,结果按 GiB 保留一位小数。量化分组、缩放系数、未量化层、KV cache 与运行时缓冲区会增加实际占用,模型文件大小也不等于峰值内存。
先确认 Python 版本符合所用 MLX 包的要求,再建立虚拟环境。安装源与模型文件需要能够访问,并且你已取得模型使用授权;下载前检查磁盘空间。
python3 -m venv .venv
source .venv/bin/activate
python -m pip install --upgrade pip
python -m pip install mlx mlx-lm
python -m mlx_lm.generate --model ./models/model --prompt "Explain unified memory." --max-tokens 128
./models/model 指向已准备好的兼容模型目录。首轮用短输入与少量输出验证,再逐步增加上下文长度。记录模型版本、量化方式、输入长度与峰值内存,便于重现结果。
如果内存压力持续升高或交换空间快速增加,先减小上下文、批量大小与并发请求。增加 SSD 是扩展存储,不会增加统一内存,也不能替代正确的模型预算。
日、周、月、季是四种可选计费周期。到期时间是任务安排的边界,不要等最后一轮构建才开始迁出。节点全年 365 天正常运行,租期与交付状态仍以具体订单记录为准。
登录控制台,在对应实例或订阅中查看到期时间,再进入续租操作。核对机型、节点、所选周期、附加项与最终应付金额后支付。更换周期何时生效、是否需要补差,以该笔订单返回的规则与报价为准;付款后确认新的到期时间已更新。
需要额外素材空间时,查看 +1TB SSD 或 +2TB SSD;需要 Thunderbolt 5 并联时,先确认工作流与设备支持情况。附加项不改变原机型的统一内存。先在控制台确认可选项、周期和交付要求,再提交配置变更;涉及磁盘或任务调整时,先备份并停止相关写入。
导出代码、素材、构建产物与必要配置,下载到自己管理的存储并做一次恢复检查。停止 runner 与自动任务,撤销短期访问令牌,清理签名私钥和不再需要的凭据。不要仅凭远端目录已经打包,就认定备份完成。
本指南不把到期后保留视为备份方案。保留期限、清除进度与是否还能恢复,查看订单中的数据处理说明;记录不清楚时,提前通过工单确认。已经执行清除的数据不应假定可以恢复,重要内容须在到期前迁出。
登录控制台提交工单,问题会和你的订单放在一起。一个问题先保留一张工单,后续测试结果继续补充在原记录里,避免上下文被拆散。
提供寄存编号或订单编号、机型,以及新加坡、日本(东京)、韩国(首尔)、香港中的实际节点。不要附登录密码或私钥。
写明开始时间和时区、是否持续发生、最后一次正常使用的时间。说明是 SSH 超时、认证失败、VNC 黑屏,还是某条构建命令报错。
列出最短复现步骤、系统与工具版本、完整错误文本和已做的检查。截图先遮住凭据;日志删除令牌、证书密码及其他敏感字段。
提供订单编号、金额与支付渠道。仅支持 USDT-TRC20 和 Visa / Mastercard / Amex(经 Stripe),统一以美元结算,实际可用网关以后端返回为准。USDT 提供交易哈希,银行卡提供收据号,不发送完整卡号。
暂时无法登录控制台时,发送邮件到 support@vpskeep.com,在正文写明账户邮箱与订单编号。无需把连接凭据发进邮件。
先跑通连接、单次构建与产物下载,再开启自动化。还没选机器,可以从三档配置与四种周期开始。