57 lines
3.0 KiB
Bash
57 lines
3.0 KiB
Bash
|
|
#!/usr/bin/env bash
|
|||
|
|
# 把 Bot 的電腦整個搬到 gVisor VM:box 的全部檔案與瀏覽器登入都在 home 資料卷
|
|||
|
|
# (anybot-box-home,Chromium 的 profile 也在裡面),整卷複製過去後,
|
|||
|
|
# AnyBot 在 VM 上掛同名資料卷開機=檔案、登入、桌面設定全部跟著走。
|
|||
|
|
# 所有 Bot 共用這一台、這一份登入與檔案:不分帳號,資料夾照常共用。
|
|||
|
|
#
|
|||
|
|
# 先完全退出 AnyBot 應用程式,然後:
|
|||
|
|
# ./gvisor-migrate.sh 搬過去(本機這份保留,當備份)
|
|||
|
|
# ./gvisor-migrate.sh --check 只比對兩邊,不動資料
|
|||
|
|
set -euo pipefail
|
|||
|
|
VM=anybot-gvisor
|
|||
|
|
VOL=anybot-box-home
|
|||
|
|
VMHOST="unix://$HOME/.lima/$VM/sock/docker.sock"
|
|||
|
|
|
|||
|
|
command -v docker >/dev/null 2>&1 || { echo "找不到 docker 指令"; exit 1; }
|
|||
|
|
if [ -n "${DOCKER_HOST:-}" ]; then
|
|||
|
|
echo "現在環境裡有 DOCKER_HOST=$DOCKER_HOST(要從本機 Docker 搬出,請用普通終端機跑)"; exit 1
|
|||
|
|
fi
|
|||
|
|
docker volume inspect "$VOL" >/dev/null 2>&1 || { echo "本機找不到資料卷 $VOL(box 還沒建立過?)"; exit 1; }
|
|||
|
|
limactl list "$VM" --format '{{.Status}}' 2>/dev/null | grep -q Running || { echo "VM $VM 沒在跑,先跑 gvisor-vm.sh"; exit 1; }
|
|||
|
|
# The Mac app's process is "AnyBot" and `anybot --serve` is "anybot": match either case.
|
|||
|
|
if pgrep -ix anybot >/dev/null 2>&1; then
|
|||
|
|
echo "AnyBot 還在跑:請先從選單完全退出(它會把 box 叫醒、資料卷會一直在用)。"; exit 1
|
|||
|
|
fi
|
|||
|
|
|
|||
|
|
echo "本機 box 的檔案:$(docker run --rm -v "$VOL":/h alpine:3.20 sh -c 'find /h | wc -l') 個項目、$(docker run --rm -v "$VOL":/h alpine:3.20 sh -c 'du -sh /h | cut -f1')"
|
|||
|
|
|
|||
|
|
if [ "${1:-}" = "--check" ]; then
|
|||
|
|
echo "VM 上的檔案:$(DOCKER_HOST=$VMHOST docker run --rm -v "$VOL":/h alpine:3.20 sh -c 'find /h 2>/dev/null | wc -l') 個項目"
|
|||
|
|
exit 0
|
|||
|
|
fi
|
|||
|
|
|
|||
|
|
echo "停止本機的 box(容器留在本機當備份,不刪)…"
|
|||
|
|
docker stop anybot-box anybot-box-home-holder >/dev/null 2>&1 || true
|
|||
|
|
|
|||
|
|
echo "VM 上準備同名資料卷…"
|
|||
|
|
DOCKER_HOST=$VMHOST docker volume create "$VOL" >/dev/null
|
|||
|
|
|
|||
|
|
echo "搬移中(本機 → VM,同一條管線直送,不落地)…"
|
|||
|
|
# 兩邊都是 Linux,檔案擁有者(uid 1000 = box 裡的 bot 使用者)直接對得上。
|
|||
|
|
docker run --rm -v "$VOL":/h -w /h alpine:3.20 tar -cf - . \
|
|||
|
|
| DOCKER_HOST=$VMHOST docker run --rm -i -v "$VOL":/h -w /h alpine:3.20 tar -xf -
|
|||
|
|
|
|||
|
|
echo "核對…"
|
|||
|
|
DOCKER_HOST=$VMHOST docker run --rm -v "$VOL":/h alpine:3.20 sh -c 'echo "VM 上的檔案:$(find /h | wc -l) 個項目、$(du -sh /h | cut -f1)"'
|
|||
|
|
|
|||
|
|
cat <<EOF
|
|||
|
|
|
|||
|
|
搬好了。接著在 AnyBot(重新開啟)設定 › 電腦 › 在哪裡執行:
|
|||
|
|
1. Docker 主機:填 $VMHOST → 套用
|
|||
|
|
2. 容器隔離:選 強隔離(gVisor)
|
|||
|
|
電腦卡片按「建立/更新」:VM 上會先建映像檔(第一次下載套件,幾分鐘),
|
|||
|
|
開機後檔案與登入就是原本那些——所有 Bot 共用同一台、同一份,沒變。
|
|||
|
|
本機那份 box 和資料卷都留著當備份;確認 VM 上都正常後想刪再刪:
|
|||
|
|
docker rm -f anybot-box anybot-box-home-holder; docker volume rm $VOL
|
|||
|
|
EOF
|