适用:CentOS7 / CentOS Stream / Ubuntu 20.04+,生产环境推荐 CentOS Stream9;全程贴合前面的开发 & 发版规范;生产禁止 root 直接操作,做好权限、防火墙、备份。 目标机器:Linux 服务器,开放 80 端口(Nginx),3306/6379不对外暴露,仅容器内网访问。
一、服务器初始化(首次装机必做)
1.1 创建普通运维账号(禁止长期 root 登录)
# 创建账号
useradd ops
# 设置密码
passwd ops
# 赋予sudo权限
usermod -aG wheel ops
后续所有操作使用 ops 用户登录,需要权限时加 sudo。
1.2 系统基础包安装
# CentOS Stream / CentOS7
sudo dnf update -y
sudo dnf install -y yum-utils device-mapper-persistent-data lvm2 git wget curl vim
# Ubuntu
sudo apt update -y
sudo apt install -y git wget curl vim
1.3 关闭 SELinux(生产可按需加固,测试直接关闭)
# 临时关闭
sudo setenforce 0
# 永久关闭
sudo sed -i 's/^SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
1.4 防火墙配置(重点!只开放 80 端口)
# 启动防火墙
sudo systemctl start firewalld
sudo systemctl enable firewalld
# 放行80端口
sudo firewall-cmd –permanent –add-service=http
# reload生效
sudo firewall-cmd –reload
# 查看放行端口
sudo firewall-cmd –list-all
❗ 3306、6379 端口不要对外放行,Docker 内部网络互通即可。
二、安装 Docker & Docker Compose v2
2.1 安装 Docker(CentOS)
sudo dnf config-manager –add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo dnf install -y docker-ce docker-ce-cli containerd.io
Ubuntu 安装命令:
sudo apt-get install ca-certificates curl gnupg lsb-release
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg –dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=$(dpkg –print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update && sudo apt install docker-ce docker-ce-cli containerd.io -y
2.2 启动 Docker,设置开机自启
sudo systemctl start docker
sudo systemctl enable docker
# 将ops用户加入docker组,免sudo执行docker命令
sudo usermod -aG docker ops
⚠️ 重新登录服务器,用户组生效。验证:
docker info
2.3 确认 Docker Compose(新版 docker 自带 compose 插件)
docker compose version
# 能输出版本号即成功;如果提示找不到,单独安装插件
三、拉取项目代码(Git,匹配版本管理规范)
按照前面 GitFlow 规范,生产部署代码基于 main 分支打 Tag。
# 切换到/home/ops工作目录
cd /home/ops
# 拉取代码仓库
git clone git@xxx.git demo-project
cd demo-project
# 切换到生产main分支,拉取最新代码
git checkout main
git pull
# (生产规范)切换到对应版本Tag
git checkout V1.0.0
目录结构:
demo-project/
├── backend-java/
├── frontend-vue/
├── init-sql/
│ └── init.sql
├── docker-compose.yml
└── .env # 环境变量文件,**不提交到git仓库!**
3.1 创建.env 环境变量文件(服务器本地创建)
vim .env
写入内容(生产改成强密码)
DB_ROOT_PWD=MyDbPass123!
REDIS_PWD=MyRedisPass456!
保存退出 :wq
权限加固:防止其他用户读取密码文件
chmod 600 .env
四、部署前检查清单(上线前核对,对应发版规范)
五、构建镜像 + 启动整套服务
# 在docker-compose.yml所在目录执行
docker compose up -d –build
执行过程:
查看容器状态
docker compose ps
预期:4 个容器状态都是 Up。
查看日志(排查启动失败)
# 查看后端日志
docker compose logs -f backend-java
# 查看前端nginx日志
docker compose logs -f frontend-nginx
# 查看mysql日志
docker compose logs -f mysql
六、数据库初始化
mysql 容器第一次启动会自动执行 init-sql/init.sql,创建库和表。 如果需要手动执行 SQL:
# 进入mysql容器
docker exec -it demo-mysql mysql -uroot -p
# 输入.env里面DB_ROOT_PWD密码,验证库表是否存在
USE demo_db;
SHOW TABLES;
七、访问验证(上线冒烟测试,发版必做)
浏览器访问服务器 IP,打开前端页面; 测试接口:登录、查询等核心业务链路。
Nginx 转发逻辑:
- / → 前端静态资源
- /api/** → 反向代理转发到后端 Java 服务
八、日常运维操作(对应运维规范)
8.1 重启服务(发版更新)
# 代码更新后,重新构建并启动
docker compose up -d –build
8.2 停止服务
docker compose down
# 如需保留数据卷,不要加 -v;加-v会删除mysql、redis数据!!
8.3 查看服务资源占用
docker stats
8.4 数据库备份(生产定时任务,crontab)
创建备份脚本 /home/ops/backup_mysql.sh
#!/bin/bash
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR="/home/ops/db_backup"
mkdir -p $BACKUP_DIR
docker exec demo-mysql mysqldump -uroot -pMyDbPass123! demo_db > $BACKUP_DIR/demo_db_$DATE.sql
# 保留最近30天备份
find $BACKUP_DIR -name "demo_db_*.sql" -mtime +30 -delete
赋予执行权限:
chmod +x /home/ops/backup_mysql.sh
配置定时任务每日凌晨 2 点自动备份
crontab -e
# 添加一行
0 2 * * * /home/ops/backup_mysql.sh >> /home/ops/backup.log 2>&1
九、版本回滚操作(故障应急流程)
当新版本上线出现严重 bug,执行回滚:
如果数据库有变更:优先恢复备份 sql,注意数据库版本变更的兼容性!
十、生产环境安全加固(可选,建议落地)
十一、常见问题排查
十二、交付物 & 台账(满足前面发版规范)
每次上线,留存:
- Git Tag 版本号
- 发版申请表
- 上线冒烟测试记录
- 数据库备份文件(发版前自动备份)
- 运维变更记录
一键部署脚本说明
脚本名称:install_demo.sh 适配:CentOS Stream9 / CentOS7,Ubuntu 需少量调整; 功能:系统初始化、安装 docker、配置防火墙、创建账号、拉取代码、初始化环境、启动整套 docker‑compose 服务。
注意:
#!/bin/bash
# Java+Vue前后端项目一键部署脚本 install_demo.sh
# 支持CentOS Stream9 / CentOS7
# 执行方式: chmod +x install_demo.sh && sudo ./install_demo.sh
set -e
######################## 【请修改这里配置项】########################
GIT_REPO_URL="git@xxx.git:group/demo-project.git" # 修改为你的git仓库
PROJECT_NAME="demo-project"
WORK_HOME="/home/ops"
PROJECT_DIR="${WORK_HOME}/${PROJECT_NAME}"
# 生产环境密码,部署后不要硬编码修改脚本,优先服务器.env维护
DB_ROOT_PWD="DbPass@2026"
REDIS_PWD="Redis@2026"
GIT_TAG="V1.0.0" # 部署使用的tag版本
###################################################################
echo "==================== 开始系统初始化 ===================="
# 1、创建ops运维账号
if ! id -u ops >/dev/null 2>&1;then
useradd ops
echo "ops:Ops@2026" | chpasswd
usermod -aG wheel ops
echo "创建ops账号完成"
fi
# 2、安装基础依赖包
dnf update -y
dnf install -y yum-utils device-mapper-persistent-data lvm2 git wget curl vim firewalld
# 3、SELinux关闭
setenforce 0 || true
sed -i 's/^SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
#4、防火墙配置,只开放http 80端口
systemctl start firewalld
systemctl enable firewalld
firewall-cmd –permanent –add-service=http
firewall-cmd –reload
echo "==================== 安装Docker ===================="
# docker源
dnf config-manager –add-repo https://download.docker.com/linux/centos/docker-ce.repo
dnf install -y docker-ce docker-ce-cli containerd.io
systemctl start docker
systemctl enable docker
usermod -aG docker ops
echo "Docker安装完成:"
docker –version
docker compose version
echo "==================== 拉取项目代码 ===================="
mkdir -p ${WORK_HOME}
cd ${WORK_HOME}
if [ ! -d "${PROJECT_DIR}" ];then
git clone ${GIT_REPO_URL} ${PROJECT_NAME}
fi
cd ${PROJECT_DIR}
git checkout main
git pull
git checkout ${GIT_TAG}
# 创建.env环境变量文件
cat > ${PROJECT_DIR}/.env << EOF
DB_ROOT_PWD=${DB_ROOT_PWD}
REDIS_PWD=${REDIS_PWD}
EOF
chmod 600 ${PROJECT_DIR}/.env
chown -R ops:ops ${PROJECT_DIR}
echo "==================== 创建Mysql定时备份脚本 ===================="
BACKUP_SCRIPT="/home/ops/backup_mysql.sh"
cat > ${BACKUP_SCRIPT} <<'EOF'
#!/bin/bash
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR="/home/ops/db_backup"
mkdir -p $BACKUP_DIR
docker exec demo-mysql mysqldump -uroot -p${DB_ROOT_PWD} demo_db > $BACKUP_DIR/demo_db_$DATE.sql
find $BACKUP_DIR -name "demo_db_*.sql" -mtime +30 -delete
EOF
# 替换脚本内密码变量
sed -i "s|\\${DB_ROOT_PWD}|${DB_ROOT_PWD}|g" ${BACKUP_SCRIPT}
chmod +x ${BACKUP_SCRIPT}
chown ops:ops ${BACKUP_SCRIPT}
# 设置crontab定时任务,每日凌晨2点备份
crontab -l > mycron || true
echo "0 2 * * * /home/ops/backup_mysql.sh >> /home/ops/backup.log 2>&1" >> mycron
crontab mycron
rm -f mycron
echo "==================== 构建并启动容器服务 ===================="
cd ${PROJECT_DIR}
# 停止旧实例,不删除数据卷
docker compose down
# 构建+后台启动
docker compose up -d –build
sleep 10
echo "==================== 容器状态检查 ===================="
docker compose ps
echo ""
echo "==================== 部署完成 ===================="
echo "项目目录: ${PROJECT_DIR}"
echo "备份脚本: ${BACKUP_SCRIPT}"
echo "访问地址: http://服务器IP"
echo "查看后端日志命令: cd ${PROJECT_DIR} && docker compose logs -f backend-java"
echo "回滚方式:切换git tag后执行 docker compose up -d –build"
echo "注意:数据库端口3306、redis6379不对外暴露!"
使用步骤
chmod +x install_demo.sh
sudo ./install_demo.sh
更新版本脚本 upgrade.sh(用于后续迭代上线,贴合发版流程)
#!/bin/bash
# upgrade.sh 版本升级脚本
set -e
PROJECT_DIR="/home/ops/demo-project"
NEW_TAG=$1
if [ -z "${NEW_TAG}" ];then
echo "用法: ./upgrade.sh V1.0.1"
exit 1
fi
cd ${PROJECT_DIR}
echo "拉取最新代码,切换tag: ${NEW_TAG}"
git fetch –tags
git checkout ${NEW_TAG}
# 发版前数据库备份
/home/ops/backup_mysql.sh
# 重建启动
docker compose down
docker compose up -d –build
sleep 8
docker compose ps
echo "升级完成,检查日志 docker compose logs -f backend-java"
使用示例:
chmod +x upgrade.sh
./upgrade.sh V1.0.1
回滚脚本 rollback.sh
#!/bin/bash
set -e
PROJECT_DIR="/home/ops/demo-project"
ROLLBACK_TAG=$1
if [ -z "${ROLLBACK_TAG}" ];then
echo "用法 ./rollback.sh V1.0.0"
exit 1
fi
cd ${PROJECT_DIR}
git checkout ${ROLLBACK_TAG}
docker compose down
docker compose up -d –build
sleep 8
docker compose ps
echo "⚠️如果存在DDL变更,需要手动恢复数据库备份!"



