记录一次自己的服务器迁移过程

记录一次自己的服务器迁移过程

前言

最近阿里云发动了史上最大力度价格战,自称平均降价超20%。

而我,作为一只哪家便宜,就买哪家的三姓家奴。趁着降价,悻悻然又买了一台阿里云 ECS ,计划用来承接自己一台快过期的 华为云 HECS 的服务。

幸运的是,我这个服务里面,所有的组件早已容器化,业务镜像也早已经使用了私有镜像仓库,所以迁移起来还是很容易的。

让我们立刻开始吧!

目前项目的部署方式

目前这个项目,主要是由多个 Github 私有仓库组成,里面主要有多个后端业务仓库和 1 个部署文件仓库。

其中部署文件仓库,会在目标服务器上进行拉取,并进行部署。同时所有的数据卷,以及日志等等文件,都会写在这个目录内。而那些后端业务仓库,里面实际上就都是一些业务逻辑啥的,CRUD数据库,搞搞 Redis 罢了。

值得一提的是,这些业务仓库都使用了 Github Action 来自动构建镜像,并推送到私有镜像仓库。

其中,我使用 git sha 作为镜像的 Tag,同时在推送完成之后,它们都会触发部署文件仓库的 Action,去修改部署时的环境变量文件。

这样只要每次在服务器上 git pull,拿到的就都是最新版本的镜像了(还能通过备份 tag 来做回滚)。

大概的流程如下图所示:

另外值得一提的是,之前在华为云部署的时候,本来能好好的拉取 Github 的,后来由于网络原因,一段时间后莫名其妙不能了。

后来我就把那个 部署文件仓库,同时同步到我的 gitee 私有仓库,这样就不会出现拉取失败的问题了。

开始迁移

提前准备

首先我们购买好一台 阿里云 ECS,选择你最熟悉最喜欢的系统镜像,设置你的专有网络和交换机,然后配置一下你的登陆凭证,下载私钥,付钱即可。

这里我把专有网络,设置在了我的函数计算 FC 网络内,这样以后部署 serverless 函数,就能在内网里,调用服务器资源了。

然后到 ECS 控制台进行远程登录,这里我发现阿里云居然有 Mac arm64 的客户端可以下载,而华为云的 CodeArt 只支持 Win,于是就下载安装了客户端:

安装好了之后,直接通过 ssh 链接服务器,用起来还是挺方便的,还能做文件的管理。

设置安全组

然后 ssh 链接服务器,发现连不上,原来是服务器所在的安全组,并没有把端口放出来。

好的,和往常一样,打开 TCP22/80/443 端口,再打开 UDP500/4500 端口作为 ipsec 协议关联端口,授权对象就先设置成所有服务器吧。

于是 ssh 就顺利连上服务器了。

开始初始化

登录到服务器之后,首先安装 gitdocker-ce

sh 复制代码
# rpm
sudo dnf install git-all
# deb
sudo apt install git-all

安装好了之后,设置一下:

bash 复制代码
git config --global credential.helper store

然后直接使用 HTTPS 的方式 clone 我的部署私有仓库。不使用 SSH 的原因在于我比较懒去生成 SSH 密钥了。

安装 docker

由于我自己使用的都是 Ubuntu,所以安装方式也简单:

bash 复制代码
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

然后安装完成之后,根据自己的需求更换一下 docker 镜像源:

bash 复制代码
echo '{
    "registry-mirrors": [
        "https://n2mk220u.mirror.aliyuncs.com",
        "https://docker.mirrors.ustc.edu.cn",
        "https://registry.docker-cn.com"
    ]
}' > /etc/docker/daemon.json

然后启动守护进程即可。

bash 复制代码
sudo systemctl start docker

尝试部署

我直接执行命令:

bash 复制代码
docker compose up -d --remove-orphans

然后失败了,发现是因为 docker-compose.yml 里包含了一些私有镜像,要先进行登录,才能拉取。

bash 复制代码
docker login --username=icebreaker registry.cn-hangzhou.aliyuncs.com

登录一下搞定,然后项目就可以顺利启动了。

检查一个预设的 health check 接口,运转良好,就是报很多数据库错误罢了。

这也正常,毕竟数据库那些表啊结构,数据啥的都没同步过来,报个错很正常。

数据库迁移

我使用的是 postgresql,备份还原起来很容易的。

大体流程就是:

bash 复制代码
pg_dump -Fc postgres > /var/lib/postgresql/data/db$(date +%Y%m%d%H%M%S).dump

pg_restore -d postgres dbxxxxxx.dump

实际到正式环境,区别也不过是跑到容器里面,执行一下命令罢了。

涉及到的文件转移也可以使用 scp 来解决,所以还算是复杂一点点。

不过,其实我早就写好了 sh 脚本,同时还有一个 cron job 天天在那里备份数据库,所以那就更加简单了。

我们直接手动触发,执行一下 job ,把新备份数据库文件下载下来,然后通过 scp 上传到阿里云服务器即可。不过这里我也偷懒了,我直接通过阿里云客户端去上传了。

然后上传到数据库容器的数据卷里面,执行一下 pg_restore 命令,恢复到指定的数据库,完成之后,重起一下容器就大功告成了。

最后就去做一些数据校验,健康检查即可。

结尾

这只是我自己的一个个人项目,所以用到的技术属于什么用的舒服,什么可以偷懒,就用什么,当然你有更好更方便的方式欢迎提出来,我们一起相互交流优化运维部署方式。

一些问题

为什么中间没有配置 https?

因为我使用的是 Caddyhttps 证书是自动申请的,推荐阅读 为什么个人项目我更推荐使用Caddy?

关于数据库备份

实际上更加稳妥的做法是,直接备份整个 pg 的容器数据卷,没有这样做的原因是我比较懒,也没啥重要的数据。

另外其实也可以使用 pgadmin 这种工具来备份和恢复数据库,但是对数据库文件大小有限制,最大的大小只有 50MB

相关推荐
Amd7943 分钟前
Nuxt Kit中的 Nitro 处理程序
服务器·插件·处理程序·模块化·nuxt 3·预渲染·nitro
路溪非溪14 分钟前
Linux内核启动流程
linux·运维·服务器
anddddoooo36 分钟前
vulnhub(11):derpnstink(hydra爆破用户名和密码、验证的文件上传)
linux·运维·服务器·安全·web安全·网络安全
Xinan_____40 分钟前
Linux——k8s认识
linux·运维·kubernetes
TO_ZRG1 小时前
使用jenkins打包unity工程
运维·unity·jenkins
liujiangxu1 小时前
jenkins声明式流水线语法详解
运维·自动化·jenkins
guoguoqiang.2 小时前
我与Linux的爱恋:命令行参数|环境变量
linux·运维·服务器·c语言·学习
客观花絮说3 小时前
DSC+DW实时+异步搭建部署
运维
x66ccff3 小时前
【linux】4张卡,坏了1张,怎么办?
linux·运维·服务器
隔窗听雨眠4 小时前
基于Prometheus和Grafana的现代服务器监控体系构建
服务器