服务器迁移踩坑流水账

0x1 起因

近几年因为各种原因,陆续囤了好几台便宜的 vps,平均每台每月也就一两刀,上面跑了好些服务,用来自动处理我上传的文件或者汇集资讯什么的,前段时间想了想,这样几台机子管理起来太麻烦了,打算把所有服务合并到一台机子上,又恰好有朋友买了新 vps,价格也不贵,于是开始了这次的折腾。

0x2 环境部署

由于这两年使用的包都是随用随装的,有些不再使用也只是停止掉了却没有删除,盘点了一番后决定重头搭建。

由于以前对服务器不甚熟悉,所有都是按照教程怼一波依赖配置一下就完事了,这也导致了各种奇怪问题,配置冲突,端口在很久之前开过程序占用了结果用不了,文件系统挂载了然后其他程序写了东西进去,结果重启的时候挂载没了,文件就不见了,诸如此类千奇百怪的问题,现在算是有那么点经验了,决定直接上 docker,避免环境污染,也方便以后迁移数据到其他地方。

不过,不管扯再多,新服务器到手肯定要先改一波 ssh

Port 22 # 端口号
PubkeyAuthentication yes # 启用证书登录
AuthorizedKeysFile .ssh/authorized_keys # 公钥路径
bash

编辑配置的时候,取消掉以上 3 行的注释

vi /etc/ssh/sshd_config # 编辑ssh配置
echo 你的公钥内容 > ~/.ssh/authorized_keys # 写出公钥
/etc/init.d/ssh restart # 重启sshd
bash

完事之后先更一波依赖,以免出现安全问题,我使用的是 ubuntu,因此包管理器是 apt

sudo su
apt update
apt upgrade
apt autoremove
bash

然后装上 docker,短暂的等待后顺利装上,我的 vps 是十来刀一年的小盘鸡,不过带宽倒是不错,每月 1T 上下行对等 500M 入口还不算流量,挂块 s3 当数据盘用可以假装自己是大盘鸡。

然后虚拟方案应该是 KVM,因为听说 OpenVZ 很难装 docker,就没买更便宜的,虽然现在用的贵一点,不过装 docker 没毛病就好。

不得不说国外的 vps 就是爽,之前用套路云慢的一批不说下包还各种断网,不过毕竟是白嫖的,也不能要求太多(不过听朋友说交钱也是又贵又烂)。

sudo su
apt-get install apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
apt-get update
apt-get install docker-ce
bash

然后还得装上 docker-compose,这是一个 python 写的软件,因此要先装上 python,然后用 pip 安装。

docker-compose 主要用于管理多个容器的启动顺序、环境变量、依赖等等配置。

譬如说一个容器依赖 mysql、php,代码存放在 github,拥有几个编译时环境变量用于生成不同功能的镜像,这时候如果手动拉取代码,手动编译镜像,编译完之后还要先让 mysql 和 php 的镜像跑起来,然后让几个镜像之间的网络互通,这几步下来怕是要执行七八条命令,还容易按错。

如果日后 vps 性能不够,想要迁移到新主机呢?鬼知道当初打了什么命令,就算记录下来了,也难保日后因为某些需求改动过命令,又忘记更新记录,这时候就很蛋疼了。

而 docker-compose 就是要为你代劳这些,你可以通过编写一个简单的配置文件来组织一堆镜像的启动配置,在修改的时候也只要修改配置文件,docker-compose 会只对修改部分进行更新,只要你注意把需要保存的数据通过 volume 挂载到外部就好。

扯了这么多,是时候上代码了

sudo su
apt install python
pip install docker-compose
bash

完事。

看文档的时候看官方的口气好像还可以跑在 docker 容器里,也就是说我可以将几个容器打包起来塞在一个容器里跑么?

等之后有机会试试,如果没问题再更新下相关流程,现在就先让他在外面跑吧。

0x3 应用部署

等我
等我

0x4 碰到的一些问题

1.GCP 的免费小鸡卡死后重启,Docker 报错。

ERROR: for xxxx Cannot start service caddy: driver failed programming external connectivity on endpoint xxxx (68a87a19192a87f801ffcf3991938aade311cdb75ed2f121cb5b81064a1bfff9): Bind for 0.0.0.0:443 failed: port is already allocated

需要删除所有容器和网络记录:

docker rm $(docker ps -aq)
service docker stop
rm /var/lib/docker/network/files/local-kv.db
service docker start
bash

GCP 的免费机性能真的烂,卡的一笔,不过也比弟弟云的好。

2.GCP 默认没用 swap 分区

用了一段时间之后发现死机都是因为内存爆了,看了一下发现居然没有 swap 分区,那就手动配置一个吧。

dd if=/dev/zero of=/swapfile bs=1M count=1024 # 创建一个swap文件
mkswap -f /swapfile # 格式化成swap分区
chmod 0600 /swapfile
swapon /swapfile # 挂载
bash

这时候 swap 分区在重启后不会自动挂载上,用 vim 打开/etc/fstab,加上一行:

/swapfile none swap sw 0 0
bash

就可以自动挂载了。

3.时间无法同步

有些服务商不知道为何把时间同步的端口给屏蔽了,可以手动请求 google 的网页,那响应时间设置为当前时间

date -s "$(wget -S  "http://www.google.com/" 2>&1 | grep -E '^[[:space:]]*[dD]ate:' | sed 's/^[[:space:]]*[dD]ate:[[:space:]]*//' | head -1l | awk '{print $1, $3, $2,  $5 ,"GMT", $4 }' | sed 's/,//')"
bash

0x5 后记

等我
等我