Mac Mini 上云:打造属于自己的私有云工作站
- Published on
- ...
- Authors

- Name
- Huashan
- @herohuashan

前言
作为一名程序员,我一直在思考如何在保护公司数据安全的同时,又能灵活地管理自己的个人开发环境。公司的 HBI 电脑有严格的信息安全监控,这当然是必要的,但也意味着我的个人项目、学习资料和开发工具不太适合放在公司电脑上。
经过一番折腾,我找到了一个完美的解决方案:在家里放一台 Mac Mini,通过内网穿透技术让它"上云",实现随时随地访问。这篇文章将详细分享我的整个搭建过程。
一、为什么选择这个方案?
1.1 从云桌面到自建方案的转变
最初,我尝试使用云桌面服务,配置是 Ubuntu 8GB+128GB,年费 500+ 元。但使用一段时间后发现了几个问题:
- 成本持续上涨:首年新手价还能接受,续费价格明显上涨
- 性能不足:装上 VS Code、Chrome、Zotero、Obsidian 等工具后经常卡死
- 频繁需要重启:连接不上时需要 SSH 登录重启服务
1.2 Mac Mini 方案的优势
最终,我选择了购买一台 Mac Mini M4(24GB + 512GB)作为私有云主机:
✅ 成本优势
- 一次性买断,无需年费
- 电费成本极低(M 系列芯片功耗很小)
- 小配置阿里云 ECS 做跳板即可(主要用于流量转发)
✅ 性能优势
- M4 芯片性能强劲,完全够用
- 24GB 内存,多任务无压力
- 本地存储,读写速度快
✅ 使用体验
- 在家:局域网直连,几乎无延迟
- 在外:通过阿里云上海 ECS 中转,延迟也很低(因为同城)
- 数据完全掌控:所有数据在自己手上,安全可控
✅ 额外功能
- 可作为软路由:通过 Surge 管理家庭网络
- 24/7 在线服务:可以跑一些自动化脚本和服务
二、方案架构设计
2.1 整体架构图

2.2 核心组件说明
硬件设备:
- Mac Mini M4:放在家中,作为实际的工作主机(内网设备)
- 阿里云 ECS(上海):作为公网跳板机,实现内网穿透
为什么选择阿里云上海 ECS?
地理位置是关键!我生活在上海,选择同城的服务器有巨大优势:
- 延迟极低:通常在 10ms 以内
- 稳定性好:同一运营商网络,丢包少
- 成本合理:小配置即可(1核2GB足够),主要用来做流量转发
软件服务架构:
| 服务 | 作用 | 部署位置 |
|---|---|---|
| FRP | 内网穿透(核心) | ECS 服务端 + Mac Mini 客户端 |
| RustDesk | 远程桌面控制 | ECS 服务端 + Mac Mini 客户端 |
| Tailscale DERP | 虚拟局域网中继 | ECS 服务端 |
| Surge | 软路由管理 | Mac Mini |
2.3 工作原理
┌─────────────┐ ┌──────────────────┐ ┌─────────────┐
│ 外网访问 │ ────▶ │ 阿里云 ECS │ ◀──── │ Mac Mini │
│ (公司/咖啡馆)│ │ (公网跳板机) │ │ (家中内网) │
└─────────────┘ └──────────────────┘ └─────────────┘
公网 IP: xxx.xxx.xxx.xxx 内网 IP: 192.168.x.x
核心原理:
- Mac Mini 主动连接到阿里云 ECS,建立持久化隧道
- ECS 监听特定端口,等待外部访问请求
- 外部请求通过 ECS 转发到 Mac Mini
- 实现"内网穿透",Mac Mini 获得公网访问能力
三、动手实践:搭建步骤
3.1 阿里云 ECS 服务器配置
阿里云 ECS 是整个方案的关键节点,作为公网跳板机让内网的 Mac Mini 可以被外网访问。
步骤 1:部署 FRP 服务端(核心)
FRP 是实现内网穿透的核心工具。首先确认服务器架构:
lscpu | grep "Vendor ID"
wget https://github.com/fatedier/frp/releases/download/v0.62.1/frp_0.62.1_linux_amd64.tar.gz
tar -zxvf frp_0.62.1_linux_amd64.tar.gz
cd frp_0.62.1_linux_amd64
sudo cp frps /usr/local/bin/
sudo mkdir /etc/frp
sudo cp frps.toml /etc/frp/
配置 FRP 服务端 (/etc/frp/frps.toml):
[common]
bind_port = 7000 # FRP 服务端口
vhost_http_port = 8081 # HTTP 虚拟主机端口
vhost_https_port = 443 # HTTPS 虚拟主机端口
dashboard_port = 81 # 管理面板端口
[auth]
method = "token"
token = "your_secure_token" # 请修改为你的安全令牌
[dashboard]
auth_method = "password"
user = "admin"
password = "your_password" # 请修改为你的密码
[webServer]
addr = "0.0.0.0"
port = 81
配置系统服务 (/etc/systemd/system/frps.service):
[Unit]
Description=Frp Server Service
After=network.target
[Service]
Type=simple
User=root
Restart=on-failure
RestartSec=5s
ExecStart=/usr/local/bin/frps -c /etc/frp/frps.toml
[Install]
WantedBy=multi-user.target
启动 FRP 服务:
sudo chmod 644 /etc/systemd/system/frps.service
sudo systemctl daemon-reload
sudo systemctl enable frps # 开机自启
sudo systemctl start frps # 启动服务
sudo systemctl status frps # 检查状态
步骤 2:部署 RustDesk 服务
RustDesk 提供远程桌面功能。使用 Docker 部署:
安装 Docker:
apt update
apt install -y docker.io docker-compose-plugin
systemctl enable --now docker
创建 RustDesk 配置:
mkdir -p /opt/rustdesk && cd /opt/rustdesk
# 创建 docker-compose 配置
cat > compose.yml << 'EOF'
services:
hbbs:
container_name: hbbs
image: rustdesk/rustdesk-server:latest
command: hbbs -r YOUR_SERVER_IP:21117 # 替换为你的 ECS 公网 IP
environment:
- ALWAYS_USE_RELAY=Y
volumes:
- ./data:/root
network_mode: "host"
depends_on:
- hbbr
restart: unless-stopped
hbbr:
container_name: hbbr
image: rustdesk/rustdesk-server:latest
command: hbbr
volumes:
- ./data:/root
network_mode: "host"
restart: unless-stopped
EOF
# 启动服务
docker compose up -d
# 获取公钥(客户端配置时需要)
docker logs hbbs | grep Key
# 或者
cat /opt/rustdesk/data/id_ed25519.pub
步骤 3:部署 Tailscale DERP 中继
DERP 为 Tailscale 提供中继服务,优化网络连接:
docker pull ghcr.io/yangchuansheng/ip_derper:latest
docker run --restart always \
--name derper \
-d \
-p 59443:443 \
-p 3478:3478/udp \
ghcr.io/yangchuansheng/ip_derper:latest
步骤 4:配置安全组(防火墙)
在阿里云控制台的安全组中开放以下端口:
| 服务 | 端口 | 协议 | 说明 |
|---|---|---|---|
| FRP | 7000, 81, 8081, 443 | TCP | FRP 服务和管理面板 |
| RustDesk | 21115-21119 | TCP | RustDesk 信令服务器 |
| RustDesk | 21116 | UDP | RustDesk 数据传输 |
| DERP | 59443 | TCP | Tailscale DERP HTTPS |
| DERP | 3478 | UDP | Tailscale DERP STUN |
3.2 Mac Mini 客户端配置
步骤 1:配置 FRP 客户端
下载 FRP 客户端:
根据 Mac 处理器类型下载对应版本:
- M 系列芯片:frp_0.61.1_darwin_arm64.tar.gz
- Intel 芯片:frp_0.61.1_darwin_amd64.tar.gz
配置客户端 (frpc.toml):
[common]
server_addr = "YOUR_ECS_IP" # 替换为你的 ECS 公网 IP
server_port = 7000
[m4_auth]
method = "token"
token = "your_secure_token" # 与服务端配置保持一致
[m4_transport]
protocol = "tcp"
tls_enable = true
# SSH 端口映射
[ssh]
name = "ssh"
type = "tcp"
local_ip = "127.0.0.1"
local_port = 22
remote_port = 222 # 通过 ECS_IP:222 访问 Mac Mini SSH
# NoMachine 远程桌面端口映射
[nomachine]
name = "nomachine"
type = "tcp"
local_ip = "127.0.0.1"
local_port = 4000
remote_port = 4001 # 通过 ECS_IP:4001 访问 NoMachine
首次运行:
cd ~/Downloads/frp_0.61.1_darwin_arm64 # 进入解压目录
sudo ./frpc -c ./frpc.toml
注意:首次运行可能会提示"无法验证开发者",需要前往
System Settings → Privacy & Security手动允许运行。
配置开机自启动:
创建 LaunchAgent 配置文件:
# 创建配置目录
mkdir -p ~/Library/LaunchAgents
# 创建配置文件
cat > ~/Library/LaunchAgents/com.frp.frpc.plist << 'EOF'
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.frp.frpc</string>
<key>ProgramArguments</key>
<array>
<string>/Users/huashan/Documents/Frp/frpc</string>
<string>-c</string>
<string>/Users/huashan/Documents/Frp/frpc.toml</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>
<key>StandardErrorPath</key>
<string>/tmp/frpc.err</string>
<key>StandardOutPath</key>
<string>/tmp/frpc.out</string>
</dict>
</plist>
EOF
# 设置权限并启动
chmod 644 ~/Library/LaunchAgents/com.frp.frpc.plist
launchctl load ~/Library/LaunchAgents/com.frp.frpc.plist
launchctl start com.frp.frpc
提示:记得将路径
/Users/huashan/Documents/Frp/修改为你实际存放 frpc 的路径。
管理命令:
# 停止服务
launchctl stop com.frp.frpc
# 重启服务(修改配置后)
launchctl stop com.frp.frpc && launchctl start com.frp.frpc
# 移除自动启动
launchctl unload ~/Library/LaunchAgents/com.frp.frpc.plist
rm ~/Library/LaunchAgents/com.frp.frpc.plist
步骤 2:配置 RustDesk 客户端
在 RustDesk 客户端中进行配置:
- 打开 RustDesk 设置
- 点击"网络"选项卡
- 填入以下信息:
- ID 服务器:
YOUR_ECS_IP:21115 - 中继服务器:
YOUR_ECS_IP:21117 - Key:从 ECS 服务器获取的公钥内容
- ID 服务器:
步骤 3:Mac Mini 系统设置
为了确保远程访问稳定,需要调整一些系统设置:
防止休眠:
System Settings → Lock Screen → Turn display off...→NeverSystem Settings → Energy→ 全部启用
启用远程服务:
System Settings → General → Sharing- ✅ Screen Sharing
- ✅ File Sharing
- ✅ Remote Login
- ✅ Remote Management
- ✅ Content Caching
自动登录(可选):
System Settings → Users & Groups→ 启用自动登录
四、日常使用与维护
4.1 服务器端管理
查看服务状态:
# 查看所有 Docker 容器状态
docker ps
# 查看 FRP 服务状态
systemctl status frps
# 查看 RustDesk 日志
docker logs hbbs
docker logs hbbr
# 查看 DERP 日志
docker logs derper
重启服务:
# 重启 FRP
systemctl restart frps
# 重启 RustDesk
cd /opt/rustdesk && docker compose restart
# 重启 DERP
docker restart derper
备份配置:
# 备份 RustDesk 数据(包含公钥等重要信息)
tar -czf rustdesk-backup-$(date +%Y%m%d).tar.gz /opt/rustdesk/data/
# 备份 FRP 配置
tar -czf frp-backup-$(date +%Y%m%d).tar.gz /etc/frp/
4.2 故障排除
问题 1:FRP 连接不上
# 检查服务状态
systemctl status frps
# 查看日志
journalctl -u frps -f
# 检查端口是否被占用
netstat -tlnp | grep 7000
# 检查防火墙
iptables -L -n | grep 7000
问题 2:RustDesk 无法连接
# 检查容器状态
docker ps
# 查看详细日志
docker compose logs -f
# 重新获取公钥
cat /opt/rustdesk/data/id_ed25519.pub
# 检查端口
telnet YOUR_ECS_IP 21115
问题 3:Mac Mini 客户端断线
# 查看 FRP 客户端日志
cat /tmp/frpc.err
cat /tmp/frpc.out
# 重启客户端
launchctl stop com.frp.frpc && launchctl start com.frp.frpc
4.3 性能优化建议
网络优化
- 使用 BBR 加速:
echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf - 调整连接数限制:根据实际使用调整 ulimit
- 使用 BBR 加速:
安全加固
- 修改默认端口
- 使用强密码和复杂 token
- 定期更新系统和服务
- 配置 fail2ban 防止暴力破解
监控告警
- 使用 Uptime Kuma 监控服务可用性
- 配置钉钉/企业微信告警
五、使用体验与总结
5.1 实际使用场景
场景 1:在公司办公
- 通过 RustDesk 远程连接家里的 Mac Mini
- 延迟约 20-30ms(上海同城)
- 可以流畅使用 VS Code、Terminal 等开发工具
场景 2:在咖啡馆
- 通过 SSH 连接(FRP 穿透)
- 使用 tmux 保持会话
- 体验接近本地开发
场景 3:出差在外
- 通过 Tailscale 建立安全连接
- DERP 中继保证连接稳定性
- 随时访问家中资料
5.2 方案优势总结
✅ 成本低廉
- Mac Mini 一次性投入约 ¥5000+
- 阿里云 ECS 轻量级配置月费约 ¥50
- 年总成本远低于云桌面订阅
✅ 性能强劲
- M4 芯片性能远超同价位云主机
- 本地存储,无需担心网盘限速
- 24GB 内存,多任务无压力
✅ 延迟极低
- 同城服务器,ping 值 10ms 以内
- 在家局域网直连,几乎无延迟
- 远程桌面体验接近本地操作
✅ 数据安全
- 数据完全掌控在自己手中
- 不用担心云服务商的隐私问题
- 工作与个人数据完全隔离
✅ 扩展性强
- 可以加装硬盘扩容
- 可以运行各种自动化服务
- 作为软路由管理家庭网络
5.3 一些思考
这套方案并不完美,也有一些局限性:
⚠️ 需要注意的问题:
- 家庭网络稳定性影响使用体验
- 停电或网络故障时无法访问
- 需要有一定的 Linux 运维基础
- 首次配置需要花费一些时间
🔮 未来改进方向:
- 配置 UPS 不间断电源
- 增加故障自动恢复机制
- 优化网络性能和安全性
- 探索更多自动化场景
5.4 写在最后
从云桌面到自建私有云,这个方案完美解决了我的需求:
- 工作和个人数据完全隔离
- 随时随地访问自己的开发环境
- 成本可控,性能优秀
- 数据安全,完全掌控
如果你也有类似的需求,不妨试试这个方案。虽然初期配置需要花些时间,但长期来看绝对物超所值。
希望这篇文章对你有帮助!如果有任何问题,欢迎在评论区交流讨论。
相关资源:
- FRP 官方文档:https://github.com/fatedier/frp
- RustDesk 官方文档:https://rustdesk.com/docs/
- Tailscale 文档:https://tailscale.com/kb/
系列文章预告:
- 下一篇将介绍如何在 Mac Mini 上配置完整的开发环境
- 后续会分享一些自动化脚本和效率工具的使用技巧
更新日志:
- 2025-11-14:完成初稿
- 待更新:添加视频演示
Photo by Samuel Angor on Unsplash