迁移 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
- oh-my-zsh
- 启用主题 ys
- 复制history
- nodejs
- mldonkey: skipped
- tldr
- docker
- 安装(参考 Install using the apt repository)
- 加用户组(参考 Manage Docker as a non-root user)
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
- 终于可以和 resilio 说 byebye 并使用 sushitrain
- 官方文档
- 创建用户
- systemd 启动脚本:
/etc/systemd/system/[email protected]
[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