学习笔记 Gobi cowboy
服务器低成本迁移方案
#服务器
#迁移
#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 脚本
六、低成本迁移步骤
- 备份数据与部署脚本
tar -czf srv_data.tar.gz /srv/docker/data
tar -czf srv_deploy.tar.gz /srv/docker/deploy
- 迁移到新服务器
scp srv_data.tar.gz new_server:/srv/docker/data
scp srv_deploy.tar.gz new_server:/srv/docker/deploy
-
Git 克隆项目
在新服务器执行:
cd /srv/docker/project
git clone https://your.git.repo app1
git clone https://your.git.repo app2
...
- 执行部署脚本
cd /srv/docker/project/app1
bash ../../deploy/deploy.sh app1
-
恢复完成
-
容器启动
-
数据挂载正常
-
服务状态与原服务器一致
-
七、注意事项
-
环境变量与配置文件
-
避免在 Dockerfile 内写死密码或私密信息
-
使用 Git 管理的 .env 文件或 deploy 脚本传入
-
-
首次部署密码生效问题
-
对于 Syncthing 或其他带 GUI 密码的容器,第一次运行时环境变量会初始化配置
-
如果旧配置文件存在,环境变量不会覆盖
-
-
卷挂载安全性
-
不要挂载整个项目目录 (.)
-
挂载专门的 data 或 deploy 目录
-
-
资源限制
- deploy.resources 在非 Swarm 模式下不生效,可根据需要忽略
八、总结
-
本方案核心理念:项目、配置、部署脚本由 Git 管理;数据独立;迁移简单
-
优势:低成本、易迁移、支持 CI/CD、可扩展
-
迁移到新服务器时只需:
-
打包/同步 data 和 deploy
-
Git 克隆项目
-
执行 deploy.sh
-