学习笔记

服务器低成本迁移方案

#服务器 #迁移 #Docker #运维

一、方案概述

本方案适用于自建多项目 Docker 环境,目标是:

  • 本地与服务器目录结构保持一致

  • 项目与配置均由 Git 管理,可支持未来 CI/CD

  • 数据与项目解耦,保证迁移和备份低成本

  • 部署通过统一脚本 deploy.sh 完成,一键恢复环境


二、目录结构设计

1. 一级目录

srv/
  └── docker/

2. 二级目录

docker/
  ├── deploy/      # 部署脚本、辅助工具
  ├── project/     # 项目代码(包含前端、后端、compose、配置文件)
  └── data/        # 容器挂载数据目录,持久化存储

3. 三级目录(每个项目)

project/
  ├── app1/
  │     ├── frontend/        # 可选
  │     ├── backend/         # 可选
  │     ├── compose.yml       # docker compose 文件
  │     └── config/          # 项目配置文件
  └── app2/
        ├── ...

三、Git 管理策略

  • 代码与配置统一纳入 Git 管理

    • 包括前端、后端、compose 文件、配置文件
  • 数据目录不纳入 Git

    • 数据目录挂载在 /srv/docker/data/

    • 保证数据安全与独立性

  • 部署脚本 deploy.sh 也纳入 Git

    • 用于统一部署和更新
  • 支持 CI/CD:Git 仓库为唯一版本来源,部署脚本自动拉取最新代码


四、部署脚本设计

示例逻辑:

#!/bin/bash
# deploy.sh

PROJECT_NAME=$1
SERVER_PATH="/srv/docker/project/$PROJECT_NAME"

# 1. 克隆或拉取最新代码
git clone https://your.git.repo "$SERVER_PATH" || (cd "$SERVER_PATH" && git pull)

# 2. 进入项目目录
cd "$SERVER_PATH"

# 3. 启动服务
docker compose pull
docker compose up -d
#!/bin/bash

  

# ==========================

# Syncthing 部署脚本(root用户版本)

# ==========================

  

# 1. 创建目录结构

sudo mkdir -p /opt/docker/{deploy,data,project}

sudo chmod 775 /opt/docker/{deploy,data,project}

echo "已创建目录:/opt/docker/{deploy,data,project}"

  

# 2. 创建项目目录

PROJECT_DIR="/opt/docker/project/syncthing"

sudo mkdir -p "$PROJECT_DIR"

echo "已创建项目目录:$PROJECT_DIR"

  

# 3. 克隆仓库

cd "$PROJECT_DIR"

# 如果目录为空,才克隆仓库

if [ ! -d ".git" ]; then

echo "开始克隆仓库..."

git clone git@gitee.com:gobi-cowboy/syncthing.git .

echo "仓库克隆完成"

else

echo "仓库已存在,跳过克隆"

fi

  

# 4. 启动容器

docker compose up -d

  

# 5. 查看日志

docker compose logs -f

  

# 6. 配置防火墙(仅 Ubuntu/ufw 示例)

sudo ufw allow 8384/tcp

sudo ufw allow 22000/tcp

sudo ufw allow 22000/udp

echo "防火墙已允许端口 8384,浏览器访问:http://SERVER_IP:8384/"

  

echo "Syncthing 部署完成!"
  • 脚本只管理项目的 拉取与启动

  • 数据目录由 docker compose 挂载,不在 Git 管理

  • 可在本地执行,也可在 CI/CD 中调用


五、数据挂载策略

  • 每个项目的容器数据挂载到 /srv/docker/data/

  • 保证数据与项目代码、配置完全分离

  • 迁移或备份时只需要打包 data 目录,不影响 Git 管理的项目和 deploy 脚本


六、低成本迁移步骤

  1. 备份数据与部署脚本
tar -czf srv_data.tar.gz /srv/docker/data
tar -czf srv_deploy.tar.gz /srv/docker/deploy
  1. 迁移到新服务器
scp srv_data.tar.gz new_server:/srv/docker/data
scp srv_deploy.tar.gz new_server:/srv/docker/deploy
  1. Git 克隆项目

    在新服务器执行:

cd /srv/docker/project
git clone https://your.git.repo app1
git clone https://your.git.repo app2
...
  1. 执行部署脚本
cd /srv/docker/project/app1
bash ../../deploy/deploy.sh app1
  1. 恢复完成

    • 容器启动

    • 数据挂载正常

    • 服务状态与原服务器一致


七、注意事项

  1. 环境变量与配置文件

    • 避免在 Dockerfile 内写死密码或私密信息

    • 使用 Git 管理的 .env 文件或 deploy 脚本传入

  2. 首次部署密码生效问题

    • 对于 Syncthing 或其他带 GUI 密码的容器,第一次运行时环境变量会初始化配置

    • 如果旧配置文件存在,环境变量不会覆盖

  3. 卷挂载安全性

    • 不要挂载整个项目目录 (.)

    • 挂载专门的 data 或 deploy 目录

  4. 资源限制

    • deploy.resources 在非 Swarm 模式下不生效,可根据需要忽略

八、总结

  • 本方案核心理念:项目、配置、部署脚本由 Git 管理;数据独立;迁移简单

  • 优势:低成本、易迁移、支持 CI/CD、可扩展

  • 迁移到新服务器时只需:

    1. 打包/同步 data 和 deploy

    2. Git 克隆项目

    3. 执行 deploy.sh