📖 导读:本文手把手带你完成 SpringBoot3.2 + Vue3 + MySQL8.0 前后端分离Todo待办系统的阿里云ECS全流程部署。全程采用Docker Compose容器化部署,汇总实测所有报错解决方案,解决镜像超时、接口404、端口冲突、Buildx版本过低等高频问题,新手可直接复刻,零部署经验也能一次成功!

一、项目概述与环境说明

1.1 项目简介

本次部署项目为 Todo System待办事项管理系统,是典型的前后端分离入门级实战项目,非常适合新手学习容器化部署、云服务器上线流程。本人全程实测部署,踩平所有部署坑,整理出完整可落地的部署方案。

1.2 技术栈

  • 前端:Vue3 + Vite

  • 后端:Spring Boot 3.2.0 + MyBatis-Plus

  • 数据库:MySQL 8.0

  • 部署方式:Docker Compose 容器化一键部署

  • 服务器:阿里云ECS(CentOS / Ubuntu通用)

1.3 统一工作目录

服务器统一部署路径:/root/myapp/

二、前置准备:本地项目配置与打包

服务器部署前,必须完成本地项目配置修正与打包,90%部署报错均来自本地配置不规范,请严格按照以下步骤操作。

2.1 后端核心配置修正(关键!避坑重点)

修改后端配置文件 application.yml,统一API接口前缀、适配Docker容器网络、配置数据库连接信息。

核心规则:配置全局 context-path: /apiController接口路径禁止重复添加/api前缀,否则会出现接口404问题。

server: port: 8080 servlet: context-path: /api 
encoding: charset: UTF-8 enabled: true
force: true 
spring: 
datasource:
 url: jdbc:mysql://mysql:3306/todo_system?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai&useSSL=false&allowPublicKeyRetrieval=true 
username: root 
password: 123456 
driver-class-name: com.mysql.cj.jdbc.Driver 

正确Controller写法(无/api前缀)

@RequestMapping("/auth") public class AuthController { // 接口逻辑 } 

错误写法(重复前缀,导致路径/api/api/xxx 404)

@RequestMapping("/api/auth") public class AuthController { // 接口逻辑 } 

2.2 本地项目打包构建

2.2.1 后端打包(Maven)

进入后端项目目录,执行打包命令,跳过测试加快打包速度

cd D:\Code\java\大三下\backend 
mvn clean package -DskipTests 
2.2.2 前端打包(NPM)

进入前端目录,安装依赖并打包生成dist静态文件

cd D:\Code\java\大三下\frontend 
npm install npm run build 

2.3 项目打包上传服务器

将前后端项目整体压缩,通过SCP命令上传至阿里云ECS服务器指定目录

cd D:\Code\java\大三下 Compress-Archive -Path .\backend, .\frontend -DestinationPath .\todo-system.zip -Force 
scp .\todo-system.zip root@39.105.55.68:/root/myapp/ 

三、服务器端部署全流程

3.1 环境清理(重新部署必做)

若服务器存在旧项目、旧容器、旧镜像,先彻底清理,避免端口冲突、配置覆盖问题

cd /root/myapp/backend 
docker-compose down -v --remove-orphans 
cd /root/myapp rm -rf backend frontend dist 
docker image prune -f 

3.2 解压项目文件

cd /root/myapp unzip -o todo-system.zip 

3.3 部署前配置校验(关键自检)

启动服务前执行以下命令校验配置,规避90%部署报错

cat backend/src/main/resources/application.yml | grep context-path grep -r "@RequestMapping" backend/src/main/java/com/example/todosystem/controller/*.java 
cat backend/nginx.conf | grep proxy_pass 

3.4 数据库初始化(可选)

项目如需初始化数据表、基础数据,执行以下命令导入SQL脚本

docker exec -i todo-mysql mysql -uroot -p123456 todo_system < /root/myapp/backend/init.sql 

3.5 Docker Compose 启动服务

避坑说明:低版本Docker存在Buildx兼容问题,摒弃 docker-compose build,采用原生 docker build 构建镜像

cd /root/myapp/backend 
docker build -t backend-app . 
docker-compose up -d sleep 30 

四、部署结果验证

4.1 查看容器运行状态

所有容器状态为 Up 即为启动成功

docker-compose ps 

4.2 查看项目启动日志

出现 Started Application in X seconds 说明后端启动正常

docker logs todo-app --tail 50 

4.3 后端API接口测试

通过curl测试注册、登录接口,正常返回Token则接口通信正常

curl http://localhost/api/auth/register -X POST \ -H "Content-Type: application/json" \ -d '{"loginName":"admin","password":"admin123","nickname":"管理员"}' 
curl http://localhost/api/auth/login -X POST \ -H "Content-Type: application/json" \ -d '{"loginName":"admin","password":"admin123"}' 

4.4 前端页面访问

浏览器访问服务器公网IP:http://39.105.55.68,正常展示Todo系统登录页面即为部署完成。

注意:需提前在阿里云安全组开放80端口、3306端口,否则无法外网访问。

五、高频报错问题解决方案(实测避坑)

5.1 报错:Buildx版本过低

报错信息:compose build requires buildx 0.17.0 or later

原因:服务器Docker版本较低,内置Buildx工具不兼容新版Compose构建规则

解决方案:放弃compose自动构建,使用原生docker build构建镜像

docker build -t backend-app . 
docker-compose up -d 

5.2 报错:Docker镜像下载超时

报错信息:dial tcp xxx i/o timeout

原因:国外镜像源访问缓慢、超时

解决方案:配置DaoCloud国内镜像加速器

sudo tee /etc/docker/daemon.json 
<<'EOF' 
{ "registry-mirrors": [ "https://docker.m.daocloud.io", "https://huecker.io" ] } 
EOF 
sudo systemctl daemon-reload 
sudo systemctl restart docker 

5.3 报错:接口404 无静态资源

报错信息:No static resource auth/login

根本原因:全局配置/api + Controller重复/api,路径嵌套错误

解决方案

方案一(推荐):删除Controller类上的/api前缀,重新打包部署

方案二(临时应急):Nginx重写路径

location /api { rewrite ^/api/(.*) /$1 break; proxy_pass http://app:8080; } 

5.4 报错:数据库数据表不存在

报错信息:Table 'todo_system.t_user' doesn't exist

解决方案:手动导入初始化SQL

docker exec -i todo-mysql mysql -uroot -p123456 todo_system < /root/myapp/backend/init.sql 

5.5 报错:YAML配置解析失败

原因:yml重复key、缩进错误

解决方案:修正配置文件

vim /root/myapp/backend/src/main/resources/application.yml 

5.6 报错:端口被占用

报错信息:port is already allocated

解决方案:关闭占用端口容器

netstat -tlnp | grep -E ":80 |:3306 " docker stop 容器ID 

六、常用运维命令速查手册

6.1 容器生命周期管理

docker-compose ps 
docker logs todo-app -f 
docker restart todo-app 
docker exec -it todo-app bash 
docker-compose down 

6.2 数据库运维命令

docker exec -it todo-mysql mysql -uroot -p123456 
docker exec todo-mysql mysqldump -uroot -p123456 todo_system > backup.sql 

七、部署自检清单

  • ✅ 所有容器状态为Up

  • ✅ 启动日志无致命ERROR

  • ✅ 前端页面外网可访问

  • ✅ 后端API正常返回数据

  • ✅ 阿里云安全组开放80、3306端口

  • ✅ 数据库表结构初始化完成

八、项目快速回滚方案

cd /root/myapp/backend docker-compose down cd /root/myapp mv backend backend.new mv backend.old backend cd backend docker-compose up -d 

九、总结

本次Todo前后端分离项目部署,全程基于Docker Compose容器化实现,规避了传统部署的环境依赖、配置混乱问题。部署核心难点集中在本地API路径配置、Docker镜像加速、容器网络通信三点。

本文汇总的所有报错解决方案均为实测验证,新手只需严格按照流程操作,即可一次性完成阿里云ECS线上部署。后续可基于本项目,拓展HTTPS配置、自动化部署、监控告警等进阶功能。

如果部署过程中遇到其他未知问题,欢迎评论区留言交流!

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐