Logo

Mac Mini 上云:打造属于自己的私有云工作站

Published on
...
Authors
封面图

前言

作为一名程序员,我一直在思考如何在保护公司数据安全的同时,又能灵活地管理自己的个人开发环境。公司的 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 整体架构图

mac-mini-private-cloud-setup-1.png

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

核心原理:

  1. Mac Mini 主动连接到阿里云 ECS,建立持久化隧道
  2. ECS 监听特定端口,等待外部访问请求
  3. 外部请求通过 ECS 转发到 Mac Mini
  4. 实现"内网穿透",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:配置安全组(防火墙)

在阿里云控制台的安全组中开放以下端口:

服务端口协议说明
FRP7000, 81, 8081, 443TCPFRP 服务和管理面板
RustDesk21115-21119TCPRustDesk 信令服务器
RustDesk21116UDPRustDesk 数据传输
DERP59443TCPTailscale DERP HTTPS
DERP3478UDPTailscale DERP STUN

3.2 Mac Mini 客户端配置

步骤 1:配置 FRP 客户端

下载 FRP 客户端:

根据 Mac 处理器类型下载对应版本:

配置客户端 (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 客户端中进行配置:

  1. 打开 RustDesk 设置
  2. 点击"网络"选项卡
  3. 填入以下信息:
    • ID 服务器YOUR_ECS_IP:21115
    • 中继服务器YOUR_ECS_IP:21117
    • Key:从 ECS 服务器获取的公钥内容

步骤 3:Mac Mini 系统设置

为了确保远程访问稳定,需要调整一些系统设置:

防止休眠:

  • System Settings → Lock Screen → Turn display off...Never
  • System 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 性能优化建议

  1. 网络优化

    • 使用 BBR 加速:echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf
    • 调整连接数限制:根据实际使用调整 ulimit
  2. 安全加固

    • 修改默认端口
    • 使用强密码和复杂 token
    • 定期更新系统和服务
    • 配置 fail2ban 防止暴力破解
  3. 监控告警

    • 使用 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 写在最后

从云桌面到自建私有云,这个方案完美解决了我的需求:

  • 工作和个人数据完全隔离
  • 随时随地访问自己的开发环境
  • 成本可控,性能优秀
  • 数据安全,完全掌控

如果你也有类似的需求,不妨试试这个方案。虽然初期配置需要花些时间,但长期来看绝对物超所值。

希望这篇文章对你有帮助!如果有任何问题,欢迎在评论区交流讨论。


相关资源:

系列文章预告:

  • 下一篇将介绍如何在 Mac Mini 上配置完整的开发环境
  • 后续会分享一些自动化脚本和效率工具的使用技巧

更新日志:

  • 2025-11-14:完成初稿
  • 待更新:添加视频演示

Photo by Samuel Angor on Unsplash

Mac Mini 上云:打造属于自己的私有云工作站 | 原子比特之间