用 Mac Mini 架設 Zeabur 專用伺服器:OrbStack + k3s Docker 模式完整實作指南用 Mac Mini 架設 Zeabur 專用伺服器:OrbStack + k3s Docker 模式完整實作指南
將 Apple Silicon Mac Mini 註冊為 Zeabur 專用伺服器的完整流程,涵蓋 OrbStack x86_64 VM、k3s Docker 模式修復、SSH 端口轉發等關鍵設定。適合想用自有硬體跑 Zeabur 服務的開發者。
用 Mac Mini 架設 Zeabur 專用伺服器:OrbStack + k3s Docker 模式完整實作指南
適用技術棧:macOS (Apple Silicon)、OrbStack、Ubuntu 22.04 (x86_64)、Docker、k3s、Zeabur、socat、launchd
前陣子想把閒置的 Mac Mini M4 拿來跑 Zeabur 的自有伺服器,結果發現 Zeabur 只支援 Linux,而且不支援 ARM 架構。一路摸下來,從 OrbStack VM 的架構選擇、SSH Key 的 symlink 陷阱,到 Rosetta 環境下 containerd 的 seccomp 問題,踩了不少坑才跑通。這篇把整條路徑整理成可復現的 PRD,包含每個坑的成因和解法,讓你不用重走一遍。
1. 這個系統做什麼
概覽
將 Apple Silicon Mac(M1/M2/M3/M4)透過 OrbStack 的 x86_64 Linux VM,註冊為 Zeabur 的專用伺服器(Dedicated Server)。Zeabur 會在 VM 內安裝 k3s(輕量 Kubernetes),你的服務就能跑在自己的硬體上,而非 Zeabur 的共享雲端。
解決什麼問題
Zeabur 提供「自帶伺服器」功能,但官方只支援 Linux x86_64。如果你手邊只有 Apple Silicon Mac,需要一套完整的中間層架構來橋接。這篇解決三個核心問題:
- macOS 不是 Linux,Zeabur agent 無法直接運行
- Apple Silicon 是 ARM 架構,Zeabur 不支援
- x86_64 模擬環境下 containerd 的 seccomp 不相容,所有容器都會卡住
功能邊界(Scope)
- 包含:macOS SSH 設定、OrbStack VM 建立與設定、Docker 安裝、k3s Docker 模式修復、端口轉發、Zeabur 註冊、安全加固、開機自動啟動、完整踩坑紀錄
- 不包含:Zeabur 上的服務部署與管理、域名 DNS 設定、SSL 憑證配置、Zeabur 計費方案選擇
2. 整體架構與資料流
連線鏈路
Zeabur Cloud
↓ SSH (port 2222)
公網 IP (固定IP:2222)
↓ 路由器 Port Forwarding
Mac Mini macOS (內網IP:2222)
↓ socat 端口轉發
OrbStack Linux VM (x86_64, 192.168.139.x:22)
↓ k3s --docker(Docker 作為 runtime,繞過 Rosetta seccomp 問題)
↓
你的服務 (n8n, web app, etc.)
為什麼需要這條鏈路
| OrbStack VM | Zeabur 只支援 Linux | macOS 上沒有 /proc/meminfo 等 Linux 路徑,agent 無法運行 |
| x86_64 架構 | Zeabur 不支援 ARM | k3s 安裝腳本和容器映像只有 x86_64 版本 |
| Docker runtime | Rosetta 不支援 seccomp | containerd 依賴 seccomp 建立容器沙箱,Rosetta 模擬下會失敗 |
| socat 轉發 | macOS launchd 不支援自訂 SSH Port | sshd_config 的 Port 設定會被 launchd 忽略 |
| Port 2222 | 部分 ISP 封鎖 Port 22 入站 | 凱擘等 ISP 預設阻擋 22 端口 |
外部依賴
| 依賴 | 類型 | 用途 |
|---|
| OrbStack | macOS App | 在 Apple Silicon 上運行 x86_64 Linux VM,overhead 極低 |
| Docker CE | Linux Package | 作為 k3s 的容器 runtime,繞過 seccomp 問題 |
| k3s | Kubernetes | Zeabur 自動安裝,用於編排容器服務 |
| socat | CLI Tool | macOS 上的端口轉發(2222 → VM:22) |
| Zeabur | Cloud Platform | 伺服器管理、服務部署平台 |
| Homebrew | macOS Package Manager | 安裝 OrbStack 和 socat |
環境需求
# 硬體
- Apple Silicon Mac(M1/M2/M3/M4 皆可)
- 至少 16GB RAM(建議值,VM 動態分配不會預佔)
# 網路
- 固定公網 IP(需向 ISP 申請)
- 路由器可設定 Port Forwarding
- 路由器可設定 DHCP 靜態 IP 綁定
# 帳號
- Zeabur 帳號(https://zeabur.com)
- macOS 管理員權限
3. 已知限制與核心問題
在開始之前,先理解這五個限制,後續所有設計決策都圍繞它們展開:
| # | 限制 | 影響 | 解法 |
|---|
| 1 | Zeabur 只支援 Linux | macOS 無法直接當伺服器 | 用 OrbStack 建立 Linux VM |
| 2 | Zeabur 不支援 ARM | Apple Silicon 原生 ARM VM 無法使用 | VM 必須選 x86_64,透過 Rosetta 模擬 |
| 3 | Rosetta 不支援 seccomp | containerd 容器全部卡在 ContainerCreating | k3s 改用 Docker 作為 runtime |
| 4 | 部分 ISP 封鎖 Port 22 | 外部 SSH 無法連入 | 改用 Port 2222 |
| 5 | macOS launchd 控制 SSH | sshd_config 的 Port 設定無效 | 用 socat 做端口轉發 |
4. 一步步實作
坦白說,這套設定的步驟不少,但每一步都有明確的驗證方式。建議照順序走,跳步容易漏掉關鍵設定。
Step 1:啟用 macOS SSH 遠端登入
目的:讓外部可以 SSH 連進 macOS,作為流量入口。
- GUI:系統設定 → 一般 → 共享 → 遠端登入 → 打開
- 指令(Terminal 需有「完整磁碟取用權限」):
sudo systemsetup -setremotelogin on
如果指令報權限錯誤,需要先授權 Terminal:
系統設定 → 隱私權與安全性 → 完整磁碟取用權限 → 點「+」→ Cmd+Shift+G 輸入 /System/Applications/Utilities/Terminal.app → 加入並打開開關 → 重啟 Terminal
nc -z -w 3 localhost 22 && echo "SSH OK" || echo "SSH not running"
Step 2:產生 macOS SSH Key 與設定免密碼 sudo
目的:為後續 SSH 連線建立金鑰認證,並設定 sudo 免密碼(Zeabur agent 安裝 k3s 時需要 root 權限)。
# 產生 SSH Key
ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519 -N ""
cat ~/.ssh/id_ed25519.pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
# 設定 sudo NOPASSWD(將 YOUR_USERNAME 換成你的使用者名稱)
sudo sh -c 'echo "YOUR_USERNAME ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/YOUR_USERNAME && chmod 440 /etc/sudoers.d/YOUR_USERNAME'
sudo -n echo "NOPASSWD OK"
# 應直接輸出 NOPASSWD OK,不會要求輸入密碼
Step 3:macOS SSH 安全加固
sudo tee /etc/ssh/sshd_config.d/hardening.conf << 'EOF'
PasswordAuthentication no
PubkeyAuthentication yes
PermitRootLogin no
EOF
重啟 SSH 使設定生效:到系統設定 → 遠端登入 → 關掉再打開。
Step 4:網路設定(路由器)
Port Forwarding
在路由器管理頁面設定以下轉發規則(內部 IP 填你 Mac Mini 的內網 IP):
| 外部端口 | 內部端口 | 協定 | 用途 |
|---|
| 22 | 22 | TCP | SSH(部分 ISP 封鎖,備用) |
| 80 | 80 | TCP | HTTP |
| 443 | 443 | TCP | HTTPS |
| 2222 | 2222 | TCP | SSH 主要端口 |
| 4222 | 4222 | TCP | NATS(Zeabur 內部通訊) |
| 6443 | 6443 | TCP | k3s API Server |
| 30000-32767 | 30000-32767 | TCP | Kubernetes NodePort 範圍 |
DHCP 靜態綁定
在路由器上將 Mac Mini 的 MAC 位址綁定一個固定內網 IP,避免重啟後 IP 變動導致轉發失效。
固定公網 IP
需向 ISP 申請固定 IP(打電話給你的 ISP 客服即可申請)。
- 凱擘預設封鎖 Port 22 入站,這就是為什麼 SSH 要改用 2222
- 其他 ISP 可能也有類似限制,建議都用非標準端口
# 將「你的公網IP」替換為實際 IP
curl -s "https://ports.yougetsignal.com/check-port.php" \
-d "remoteAddress=你的公網IP&portNumber=2222"
Step 5:安裝 OrbStack 並建立 x86_64 Linux VM
目的:建立 Zeabur 可以運行的 Linux 環境。
# 安裝 OrbStack
brew install orbstack
安裝後開啟 OrbStack app,初始設定選擇 Linux(不要選 Docker 或 Kubernetes,Zeabur 會自己安裝 k3s)。
建立 VM
| 設定 | 值 | 說明 |
|---|
| Name | 自訂(如 Ubuntu) | |
| Distribution | Ubuntu | |
| Version | 22.04 (Jammy) | Zeabur 推薦的 LTS 版本 |
| Architecture | x86_64 (amd64) | 必須選 x86_64,Zeabur 不支援 ARM |
orbctl create ubuntu:jammy Ubuntu --arch amd64
orbctl list
# 應顯示:Ubuntu running ubuntu jammy amd64 ... 192.168.139.x
VM 資源說明:OrbStack VM 不需要預先分配 CPU/RAM/磁碟,全部動態共享。初始磁碟約 800MB(sparse file)。Zeabur 面板可能顯示 0 核心 / 0 記憶體,這是顯示問題,不影響實際運作。
Step 6:設定 VM SSH
# 安裝 SSH server
orbctl run -m Ubuntu bash -c '
sudo apt update && sudo apt install -y openssh-server
sudo systemctl enable ssh
sudo systemctl start ssh
'
# 設定 VM 內 sudo NOPASSWD(將 YOUR_USERNAME 換成你的使用者名稱)
orbctl run -m Ubuntu bash -c '
sudo sh -c "echo \"YOUR_USERNAME ALL=(ALL) NOPASSWD: ALL\" > /etc/sudoers.d/YOUR_USERNAME && chmod 440 /etc/sudoers.d/YOUR_USERNAME"
'
產生 VM 專屬 SSH Key(這裡有個重要的坑)
OrbStack 會自動將 macOS 的 ~/.ssh/ 目錄 symlink 進 VM。如果你直接在 VM 裡跑 ssh-keygen,它會透過 symlink 覆蓋 macOS 的 key。必須先刪除 symlink 再產生新 key:
orbctl run -m Ubuntu bash -c '
# 刪除指向 macOS host key 的 symlink
rm -f ~/.ssh/id_ed25519 ~/.ssh/id_ed25519.pub
# 產生 VM 專屬 key
ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519 -N "" -q -C "YOUR_USERNAME@zeabur-vm"
# 將 public key 設為 authorized_keys
cat ~/.ssh/id_ed25519.pub > ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys ~/.ssh/id_ed25519
'
orbctl run -m Ubuntu ls -la ~/.ssh/id_ed25519
# 應顯示普通檔案(-rw-------),不是 -> /mnt/mac/... 的 symlink
orbctl run -m Ubuntu bash -c '
echo "Private key fingerprint:"
ssh-keygen -lf ~/.ssh/id_ed25519
echo "Public key fingerprint:"
ssh-keygen -lf ~/.ssh/id_ed25519.pub
'
# 兩個 fingerprint 必須一致
VM SSH 安全加固
orbctl run -m Ubuntu bash -c '
sudo tee /etc/ssh/sshd_config.d/hardening.conf << EOF
PasswordAuthentication no
PubkeyAuthentication yes
PermitRootLogin prohibit-password
EOF
sudo systemctl restart ssh
'
注意 PermitRootLogin 設為 prohibit-password 而非 no。Zeabur 在註冊流程中會嘗試用 root SSH 驗證,設為 no 會導致 handshake 失敗。
設定 root 的 authorized_keys
orbctl run -m Ubuntu bash -c '
sudo mkdir -p /root/.ssh
sudo cp /home/YOUR_USERNAME/.ssh/authorized_keys /root/.ssh/authorized_keys
sudo chmod 700 /root/.ssh
sudo chmod 600 /root/.ssh/authorized_keys
'
Step 7:安裝 Docker(關鍵)
目的:預先安裝 Docker,後續讓 k3s 使用 Docker 作為 runtime,繞過 Rosetta 環境下 containerd 的 seccomp 問題。
這是整個設定中最重要的一步,必須在 Zeabur 註冊之前完成。
orbctl run -m Ubuntu bash -c '
# 安裝 Docker GPG key 和 repo
sudo apt-get update -qq
sudo apt-get install -y -qq ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg --yes
sudo chmod a+r /etc/apt/keyrings/docker.gpg
echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu jammy stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 安裝 Docker
sudo apt-get update -qq
sudo apt-get install -y -qq docker-ce docker-ce-cli containerd.io docker-buildx-plugin
sudo systemctl enable docker
sudo systemctl start docker
echo "Docker installed: $(sudo docker --version)"
'
orbctl run -m Ubuntu sudo docker run hello-world
Step 8:設定端口轉發(macOS → VM)
目的:將外部流量從 macOS 的 2222 端口轉發到 VM 的 22 端口。
# 安裝 socat
brew install socat
# 查看 VM IP
VM_IP=$(orbctl list | grep Ubuntu | awk '{print $NF}')
echo "VM IP: $VM_IP"
建立 LaunchDaemon 實現開機自動轉發(將 VM_IP 替換為上面查到的 IP):
sudo tee /Library/LaunchDaemons/com.custom.sshd-2222.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.custom.sshd-2222</string>
<key>ProgramArguments</key>
<array>
<string>/opt/homebrew/bin/socat</string>
<string>TCP-LISTEN:2222,reuseaddr,fork</string>
<string>TCP:${VM_IP}:22</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>
</dict>
</plist>
EOF
sudo chmod 644 /Library/LaunchDaemons/com.custom.sshd-2222.plist
sudo launchctl load /Library/LaunchDaemons/com.custom.sshd-2222.plist
# 確認 socat 在監聽
sudo lsof -iTCP:2222 -sTCP:LISTEN -P -n
# 測試 SSH 通過 2222 到 VM
ssh -p 2222 -o StrictHostKeyChecking=no localhost "uname -m"
# 應顯示 x86_64
注意:如果 VM IP 變了(刪除重建 VM 後),需要更新 plist 檔案中的 IP 並重新 load。
Step 9:Zeabur 伺服器註冊
- 前往 Zeabur 伺服器管理頁面
- 點「創建」→「添加自己的伺服器」
- 填入:
| 欄位 | 值 |
|---|
| IP 位址 | 你的公網 IP |
| SSH 端口 | 2222 |
| 用戶名 | 你的 VM 使用者名稱 |
| 登入方式 | SSH 密鑰 |
| 密鑰內容 | VM 內的私鑰 |
orbctl run -m Ubuntu cat /home/YOUR_USERNAME/.ssh/id_ed25519
用 ~/.ssh/id_ed25519 可能透過 OrbStack 的 symlink 讀到 macOS 的 key,導致不匹配。
- 將完整私鑰(包含
-----BEGIN 和 -----END 行)貼入
- 點「新增伺服器」,等待約 30 秒至 1 分鐘
- Zeabur 會自動安裝 k3s
私鑰取出貼完後不要存到任何地方,不要 commit 進 git。
Step 10:修復 k3s 為 Docker 模式(最關鍵的一步)
Zeabur 安裝的 k3s 預設使用 containerd。在 Rosetta 環境下,所有 pod 都會因為 seccomp 問題卡在 ContainerCreating:
Error: failed to generate seccomp spec opts: seccomp is not supported
確認問題存在
orbctl run -m Ubuntu sudo k3s kubectl get pods -A
# 會看到大量 ContainerCreating 狀態的 pod
修復:建立 systemd override(推薦)
orbctl run -m Ubuntu bash -c '
sudo mkdir -p /etc/systemd/system/k3s.service.d/
sudo tee /etc/systemd/system/k3s.service.d/docker.conf << EOF
[Service]
ExecStart=
ExecStart=/usr/local/bin/k3s server --docker
EOF
sudo systemctl daemon-reload
sudo systemctl restart k3s
'
為什麼用 override 而不是直接改 k3s.service?Zeabur 未來可能重新安裝 k3s,會覆蓋主檔。但 systemd 的 override 目錄(k3s.service.d/)不會被動到,--docker 參數永遠生效。
為什麼不能在 Zeabur 安裝前就設定 --docker?Zeabur 有自己的 k3s 安裝腳本,不會讀取 INSTALL_K3S_EXEC 等環境變數,所以只能在安裝完後手動修改。
驗證修復成功
orbctl run -m Ubuntu bash -c '
echo "=== pods 狀態 ==="
sudo k3s kubectl get pods -A
echo ""
echo "=== seccomp 錯誤? ==="
sudo journalctl -u k3s --since "1 min ago" --no-pager | grep -i "seccomp" | head -3 || echo "無 seccomp 錯誤"
echo ""
echo "=== Docker 容器 ==="
sudo docker ps --format "table {{.Names}}\t{{.Status}}" | head -10
'
- 所有 pod 狀態為 Running(不再是 ContainerCreating)
- 零 seccomp 錯誤
- Docker 容器正在運行
NAMESPACE NAME READY STATUS
default cadvisor-xxxxx 1/1 Running
default fluent-bit-xxxxx 1/1 Running
default ingress-controller-xxxxx 1/1 Running
default nats-0 2/2 Running
default node-exporter-xxxxx 1/1 Running
default vector-aggregator-xxxxx 1/1 Running
default zeabur-dns-xxxxx 1/1 Running
default zeabur-kube-watch-xxxxx 1/1 Running
default zeabur-log-api-xxxxx 1/1 Running
kube-system coredns-xxxxx 1/1 Running
kube-system local-path-provisioner-xxxxx 1/1 Running
kube-system metrics-server-xxxxx 1/1 Running
Step 11:安全加固
目的:開啟 macOS 防火牆,確認所有安全設定到位。
sudo /usr/libexec/ApplicationFirewall/socketfilterfw --setglobalstate on
最終安全狀態確認
| 項目 | 期望狀態 | 檢查方式 |
|---|
| macOS 防火牆 | 開啟 | socketfilterfw --getglobalstate |
| macOS SSH 密碼登入 | 禁用 | cat /etc/ssh/sshd_config.d/hardening.conf |
| macOS root SSH | 禁用 | 同上 |
| VM SSH 密碼登入 | 禁用 | orbctl run -m Ubuntu cat /etc/ssh/sshd_config.d/hardening.conf |
| VM root SSH | 僅 key 登入 | 同上(prohibit-password) |
| SSH Key 算法 | ed25519 | ssh-keygen -lf ~/.ssh/id_ed25519 |
| Port 22 入站 | ISP 封鎖 | 外部無法連入 |
| 私鑰明文檔案 | 不存在 | 確認沒有存在磁碟上的私鑰副本 |
5. 踩坑紀錄
這邊整理了實作過程中遇到的所有問題,每個都附上症狀、原因和解法,方便你排錯時快速定位。
坑 #1:Zeabur 不支援 ARM 架構
症狀:Zeabur 註冊 ARM VM 後,k3s 安裝報錯「ARM64 不支援」。
原因:Zeabur 的 k3s 安裝腳本和容器映像只有 x86_64 版本。
解法:OrbStack 建立 VM 時必須選 x86_64 (amd64)。Apple Silicon 透過 Rosetta 模擬,效能約打 7-8 折,對一般服務夠用。
orbctl delete Ubuntu -f
orbctl create ubuntu:jammy Ubuntu --arch amd64
# 重新執行 Step 6 ~ Step 10
坑 #2:OrbStack SSH Key Symlink 問題
症狀:Zeabur 報 failed to test SSH connection, unable to authenticate, attempted methods: none, publickey, no supported methods remain
原因:OrbStack 自動將 macOS 的 ~/.ssh/ 目錄 symlink 進 VM:
~/.ssh/id_ed25519 -> /mnt/mac/Users/username/.ssh/id_ed25519 (macOS 的 key)
~/.ssh/id_ed25519.pub -> /mnt/mac/Users/username/.ssh/id_ed25519.pub
在 VM 內 cat ~/.ssh/id_ed25519 拿到的是 macOS 的私鑰,但 authorized_keys 放的是 VM 的公鑰,兩者不匹配。更糟的是,在 VM 內跑 ssh-keygen 會透過 symlink 覆蓋 macOS 的 key。
解法:先 rm -f 刪除 symlink 再產生新 key。取得私鑰時用絕對路徑 /home/YOUR_USERNAME/.ssh/id_ed25519,避免被 symlink 誤導。
坑 #3:Rosetta 環境下 containerd seccomp 不支援(最大的坑)
症狀:k3s 安裝完成,但所有 pod 永遠卡在 ContainerCreating。
failed to create sandbox: failed to generate sandbox container spec options:
failed to generate seccomp spec opts: seccomp is not supported
原因:OrbStack 在 Apple Silicon 上用 Rosetta 模擬 x86_64,k3s 預設使用 containerd,containerd 需要 seccomp 系統呼叫來建立容器沙箱,Rosetta 無法正確模擬。這是 OrbStack 官方認定的已知限制(Issue #465),維護者表示完整 k3s 支援在 Rosetta 環境下「very unlikely to be feasible」。
解法:讓 k3s 使用 Docker 作為 runtime(--docker 參數)。Docker 處理 seccomp 的方式不同,可以在 Rosetta 環境下正常運行。
坑 #4:macOS launchd 不支援自訂 SSH Port
症狀:修改 /etc/ssh/sshd_config 加入 Port 2222 後沒有效果。
原因:macOS 的 SSH 由 launchd 管理,直接控制 sshd 只監聽 port 22,忽略 config 中的 Port 設定。
解法:用 socat 做端口轉發(見 Step 8)。
坑 #5:切換 VM 後 SSH Host Key 衝突
症狀:刪除 ARM VM 建立 x86 VM 後,SSH 報 REMOTE HOST IDENTIFICATION HAS CHANGED。
ssh-keygen -R "[localhost]:2222"
坑 #6:ISP 封鎖 Port 22
症狀:路由器 port forwarding 設好了,但外部無法連入 port 22。
原因:凱擘(kbro)等 ISP 預設封鎖 port 22 入站。
解法:使用 port 2222 替代。建議所有 ISP 都用非標準端口。
影響:僅顯示問題,不影響部署。VM 內 nproc 和 free -h 可確認真實資源。
坑 #7:Zeabur 重新註冊時報 INTERNAL SERVER ERROR
症狀:移除伺服器後重新新增,出現 INTERNAL SERVER ERROR 或 SSH Handshake Failed。
- 在 Zeabur 面板確認舊伺服器完全移除
- 在 VM 內完全卸載 k3s:
sudo /usr/local/bin/k3s-uninstall.sh
- 等 3-5 分鐘後重新新增
- 新增成功後重新執行 Step 10 切換 Docker 模式
坑 #8:Zeabur 嘗試用 root SSH 連線
症狀:Zeabur 註冊時報 SSH Handshake Failed,VM SSH log 出現 Connection closed by authenticating user root。
原因:Zeabur 的註冊流程會用 root SSH 驗證,PermitRootLogin no 會導致失敗。
解法:設為 PermitRootLogin prohibit-password,並將使用者的 authorized_keys 複製給 root(見 Step 6)。
6. 開機自動啟動與維護
完整啟動順序
開機 → macOS 登入
→ OrbStack 自動啟動 → Ubuntu VM 自動啟動
→ Docker daemon 啟動
→ k3s 啟動(使用 Docker runtime,由 systemd override 保證)
→ LaunchDaemon 啟動 socat (2222 → VM:22)
→ Zeabur agent 在 VM 內自動運行
→ 服務正常對外
| 組件 | 機制 | 設定位置 |
|---|
| socat 端口轉發 | macOS LaunchDaemon | /Library/LaunchDaemons/com.custom.sshd-2222.plist |
| OrbStack + VM | OrbStack「Start at login」 | OrbStack → 設定 |
| k3s Docker 模式 | systemd override | /etc/systemd/system/k3s.service.d/docker.conf |
維護指令速查
# === VM 管理 ===
orbctl list # 查看所有 VM
orbctl run -m Ubuntu bash -c 'COMMAND' # 在 VM 內執行指令
orbctl stop Ubuntu # 停止 VM
orbctl start Ubuntu # 啟動 VM
# === k3s 管理 ===
orbctl run -m Ubuntu sudo k3s kubectl get pods -A # 查看所有 pods
orbctl run -m Ubuntu sudo k3s kubectl get nodes # 查看節點
orbctl run -m Ubuntu sudo systemctl status k3s # k3s 服務狀態
orbctl run -m Ubuntu sudo systemctl restart k3s # 重啟 k3s
orbctl run -m Ubuntu sudo journalctl -u k3s -f # 即時 k3s 日誌
# === Docker 管理 ===
orbctl run -m Ubuntu sudo docker ps # 查看運行中容器
orbctl run -m Ubuntu sudo docker stats --no-stream # 容器資源使用量
# === 端口轉發 ===
sudo lsof -iTCP:2222 -sTCP:LISTEN -P -n # 確認 socat 在運行
sudo launchctl unload /Library/LaunchDaemons/com.custom.sshd-2222.plist # 停止
sudo launchctl load /Library/LaunchDaemons/com.custom.sshd-2222.plist # 啟動
# === SSH 測試 ===
ssh -p 2222 localhost "uname -m" # 本地測試(應顯示 x86_64)
# === VM 資源查看 ===
orbctl run -m Ubuntu nproc # CPU 核心數
orbctl run -m Ubuntu free -h # 記憶體
orbctl run -m Ubuntu df -h / # 磁碟空間
# === 排錯 ===
orbctl run -m Ubuntu sudo journalctl -u ssh --since "5 min ago" # SSH 日誌
orbctl run -m Ubuntu sudo journalctl -u k3s --since "5 min ago" # k3s 日誌
orbctl run -m Ubuntu sudo journalctl -u k3s | grep seccomp # 檢查 seccomp 錯誤
7. 快速開始
前提條件
實作步驟摘要
- 啟用 macOS SSH + 產生 Key + 設定 NOPASSWD(Step 1-3)
- 路由器 Port Forwarding + DHCP 綁定(Step 4)
- 安裝 OrbStack,建立 x86_64 Ubuntu 22.04 VM(Step 5)
- 設定 VM SSH(注意 symlink 問題)+ 安全加固(Step 6)
- 在 VM 內安裝 Docker(Step 7)
- 設定 socat 端口轉發 + LaunchDaemon(Step 8)
- Zeabur 註冊伺服器(Step 9)
- 建立 systemd override 切換 k3s 為 Docker 模式(Step 10)
- 安全加固 + 驗證(Step 11)
驗證清單
8. 不同環境的調整方式
如果你的環境跟上面不完全一樣,這邊整理了需要調整的部分。
高度通用的部分(直接用)
- k3s Docker 模式的 systemd override 方式
- socat 端口轉發架構
- SSH Key 產生與安全加固流程
- Zeabur 註冊流程
需要客製化的部分
| 部分 | 本文設定 | 你可能需要調整 |
|---|
| VM 工具 | OrbStack | UTM / Lima / Parallels(需自行處理 x86_64 模擬) |
| Linux 版本 | Ubuntu 22.04 | Zeabur 推薦 LTS 版本即可 |
| SSH 端口 | 2222 | 任何非標準端口,看你的 ISP 封鎖哪些 |
| 端口轉發工具 | socat | iptables / SSH tunnel / nginx stream |
| ISP | 凱擘 | 不同 ISP 可能有不同的端口限制 |
| 使用者名稱 | YOUR_USERNAME | 替換所有出現的使用者名稱 |
如果不用 OrbStack
OrbStack 的優勢在於 overhead 極低且 VM 資源動態分配。如果改用其他工具:
- UTM:需要手動下載 x86_64 ISO,安裝較慢,需預先分配 CPU/RAM
- Lima:CLI 導向,設定較複雜但也很輕量
- Parallels:商業授權,功能最完整但最重
無論用哪個工具,核心問題不變:Apple Silicon 上的 x86_64 VM 都會有 Rosetta seccomp 問題,都需要 k3s Docker 模式。
整套架構跑起來之後,穩定性比預期好很多,Mac Mini 基本就是插電放著,偶爾看一下 Zeabur 面板確認服務正常就好。最花時間的其實是 debug 那個 seccomp 問題,一旦知道要用 Docker 模式,後面就很順了。希望這篇能幫你省掉那段摸索的時間。
© 2026 GEEKAZ. All Rights Reserved.