前言

国内这些云厂商服务器续费价格好贵呀,一个2核心2G的服务器,首年 99元/年 第二年续费就能涨到 200+元/年 。😭所以只能每年服务器快到期了就在买一台服务器,所有服务从旧服务器迁移到新服务器上。

这篇文章就记录一下自己在今年迁服务器的流程和踩的坑


1. 打包并迁移数据

服务器中文件结构如下

docker/
├── hugo-blog/
│   ├── blog/
│   └── docker-compose.yaml
├── netbird/
│   ├── data/ 
│   └── docker-compose.yaml
├── nginx/
│   ├── data/ 
│   └── docker-compose.yaml
...
└── restdesk-sercer/
    ├── data/ 
    └── docker-compose.yaml

因为所有服务的数据都在 docker/ 文件下,所以只需要将 docker/ 文件夹整个打包后传到新服务器上就行。

  1. 在打包 docker/ 前需要先停止所有服务

    # 进入 docker/ 目录
    # 逐个compose目录停止服务
    for d in */; do
      echo "stop $d"
      cd "$d"
      docker compose down
      cd ..
    done
    
  2. 打包 docker/ 目录

    # 压缩整个目录
    tar -zcvf docker_backup_$(date +%Y%m%d).tar.gz ./docker
    
  3. 打包完后在逐个启动服务

    # 进入 docker/ 目录
    # 逐个compose目录启动服务
    for d in */; do
      echo "start $d"
      cd "$d"
      docker compose up -d
      cd ..
    done
    
  4. 将打包好的文件从旧服务器迁移到新服务器中

    rsync --progress --partial -av  docker_backup_20260825.tar.gz 新服务器用户@新服务器IP:/target/path/
    

    这个命令指出断点续传,如果传输中断在执行一次这个命令就行

2. 新服务器部署

  1. 安装docker

    # 安装依赖
    sudo apt install -y ca-certificates curl gnupg lsb-release
    
    # 添加 Docker GPG 密钥
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
    
    # 安装 docker
    sudo apt update
    sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
    
  2. 安装代理

    docker官方仓库在国内基本没法用,各镜像网站也连不上所以最方便的就是让docker流量走代理

    # 创建 systemd 配置目录
    sudo mkdir -p /etc/systemd/system/docker.service.d
    
    # 创建代理配置文件
    sudo tee /etc/systemd/system/docker.service.d/http-proxy.conf <<'EOF'
    [Service]
    Environment="HTTP_PROXY=http://127.0.0.1:10808"
    Environment="HTTPS_PROXY=http://127.0.0.1:10808"
    EOF
    
    # 重载 systemd、重启 docker
    sudo systemctl daemon-reload
    sudo systemctl restart docker
    
    # 验证代理配置是否成功
    docker run hello-world
    
  3. acme证书申请

    # 安装acme.sh
    curl https://get.acme.sh | sh -s email=my@example.com
    

    在阿里云中获取 Ali_Key 和 Ali_Secret 配置到 /root/.acme.sh/acem.sh.env 中

    # 修改默认CA
    acme.sh --set-default-ca --server letsencrypt
    
    # 申请通配符证书
    ./acme.sh --issue --dns dns_ali -d *.example.com
    
    # 安装证书
    acme.sh --install-cert -d example.com \
    --key-file       /home/levitan/docker/nginx/data/certs/privkey.pem  \
    --fullchain-file /home/levitan/docker/nginx/data/certs/fullchain.pem \
    --reloadcmd     "docker exec reverse-proxy nginx -s reload"
    

    最后,启动全部服务

    # 进入 docker/ 目录
    # 逐个compose目录启动服务
    for d in */; do
      echo "start $d"
      cd "$d"
      docker compose up -d
      cd ..
    done