迁移 VPS 到 GCP 小记

天哪,年更博主的新文章居然是搞 VPS 迁移(

起因是前几天和朋友闲聊,说我薅了一年的 digitalocean 的 student discount 终于快薅完了。我朋友说:“我那个小破博客 host 在 google cloud 上,因为一直没人访问所以一直免费。”
我:“啊?!”

回想了一下我现在跑的那些服务

  • nextcloud
  • syncthing+resilio
  • static webpages
  • docker debug
  • miniflux

似乎只有第二个是主力应用,downgrade 一下机器配置倒也没什么大问题,那就试试吧

备份已有的 digitalocean droplet

Digitalocean 支持备份 live 的镜像,价格是 $0.06/GiB/mo。问题是备份完了不知道怎么下载……

最后还是用了土办法直接把整个 server rsync 下来……还额外 exclude 了一个 ~/.local/share/docker/overlay2,不然炸了。

创建 google cloud instance 并基本配置

创建步骤参考 升级账号白嫖每月200GB流量云服务器 - 兔哥博客

先添加了一下新的域名绑定到 ip 地址上,然后加 ssh 是通过 metadata 的方式实现的:Add SSH keys to VMs

登录上 ssh 之后发现木有找到挂载的 30G 硬盘。正纳闷了,搜了一下才知道并不会自动挂载,还要先手动分区之后才能挂载,所幸是比较正常的流程。(后来发现要分区是因为我手贱初始化的时候把外置硬盘也放了 debian 镜像……晕

等了一天的账单,发现出现一项 Balanced PD Capacity 的收费,后来发现我挂了两个硬盘所以第二个收费了……还好还没怎么开始迁移。只能再设置一个 VM 了。

第三天发现 PD 又收费了……发现之前删 VM 的时候没有自动删 disk ……看来还要再等一天才能确认有没有扣费。

迁移记录

lib and software

snap

  • gost: skipped
  • nextcloud: deprecated
  • certbot
    • 安装参考:Certbot Instructions
    • 复制证书:这个过程比我想像的复杂,因为 privkey 是没有读取权限的,所以第一步 rsync 没有扒下来,还得靠手动复制
    • 复制 nginx 配置文件
      • 加装 防 DDOS 配置
      • 检查 nginx syntax 的时候说 dav_ext_methods 找不到了,可以加装 sudo apt install libnginx-mod-http-dav-ext
    • cloudflare dns 插件 sudo snap install certbot-dns-cloudflare

static

  • 一些资源和静态文件,精简后打包上传

containers

  • miniflux: docker based
    • 结果发现 rsync 也没复制下来……那之前都复制了个寂寞吗
    • 把文件复制过去了,启动只要 docker compose -f compose.yaml up
    • 然后发现 postgres 16 和 17 还不能自动升级……只好改 compose.yaml
  • sapu-podcast-static
    • git clone 对应 repo 到 /var/www/sapu-podcast/
  • sapu-weixin: deprecated
  • stalwart: deprecated
  • vetro:试了一下能跑,但是内存占的有点多= =

webhookd

  • 安装
  • 复制脚本文件和 jq:这里还要改用户名 = = somehow 我在 GCP 的用户名和 DO 不一样

syncthing

[Unit]
Description=Syncthing - Open Source Continuous File Synchronization for %I
Documentation=man:syncthing(1)
After=network.target
StartLimitIntervalSec=60
StartLimitBurst=4

[Service]
User=%i
ExecStart=/usr/bin/syncthing serve --no-browser --no-restart --logflags=0
Restart=on-failure
RestartSec=1
SuccessExitStatus=3 4
RestartForceExitStatus=3 4

# Hardening
ProtectSystem=full
PrivateTmp=true
SystemCallArchitectures=native
MemoryDenyWriteExecute=true
NoNewPrivileges=true

# Elevated permissions to sync ownership (disabled by default),
# see https://docs.syncthing.net/advanced/folder-sync-ownership
#AmbientCapabilities=CAP_CHOWN CAP_FOWNER

[Install]
WantedBy=multi-user.target