AI全栈之路:Ubuntu云服务器部署Spring + Vue + MySql

部署过程
云服务器配置
云服务器使用的是2 核 (vCPU)、2 GiB最基础库,不过跑一个简单服务也错错有余。安装的系统是Ubuntu 24.04 64位。

部署后端服务
安装mysql
后端服务采用了SpringBoot + MySql,首先安装MySql,这里通过 Ubuntu 官方仓库安装。
首先更新系统包列表​:sudo apt update
接着安装mysql服务器:sudo apt install mysql-server
接下来启动 MySQL 服务​:

sudo systemctl start mysql
sudo systemctl enable mysql # 设置开机自启

最后通过sudo systemctl status mysql查看mysql服务状态。

安装完成后,运行安全脚本加固 MySQL:

sudo mysql_secure_installation

按提示操作:

设置 root 密码。
移除匿名用户。
禁止远程 root 登录。
删除测试数据库。
刷新权限表。
接下来创建我们项目的数据库:

CREATE DATABASE IF NOT EXISTS autotodo DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

构建后端项目
后端项目采用springboot,通过maven构建,在pom.xml统计目录下执行:

mvn clean package -DskipTests

构建完成后会在target路径下生成对应Jar,我们直接运行jar包查看运行结果:

java -var autotodo-server-1.0.0-SNAPSHOT.jar

这样服务就启动起来了。

项目中我们使用了Flyway来进行数据库版本控制。在 Spring Boot 中,​​Flyway​​ 是一个轻量级的数据库版本控制工具,用于自动化管理和执行数据库迁移脚本(如创建表、修改字段、插入初始化数据等)。它通过跟踪已应用的数据库变更,确保不同环境(开发、测试、生产)的数据库结构一致。以下是 Flyway 的核心概念和在 Spring Boot 中的使用指南。

Flyway 核心机制​​
​迁移脚本 (Migrations)​​
Flyway 使用 ​​SQL 文件​​ 或 ​​Java 类​​ 定义数据库变更。
脚本命名规则:V<版本号>__<描述>.sql(例如 V1__Create_user_table.sql)。
版本号必须唯一且按顺序递增(如 V1, V2, V3.1)。
​​元数据表 (flyway_schema_history)​​
Flyway 自动创建此表,记录已执行的迁移脚本、校验和、执行时间等信息。
每次应用启动时,Flyway 会检查未执行的脚本并自动执行。
​迁移类型​
类型 描述 示例文件名
​​Versioned​​ 常规结构变更(DDL/DML) V1__Create_table.sql
​​Repeatable​​ 可重复执行的脚本(如视图、存储过程) R__Update_view.sql
​​Undo​​ 回滚脚本(需商业版支持) U1__Drop_table.sql
Spring Boot 集成 Flyway​
添加依赖​​
在 pom.xml 中引入 Flyway 依赖:
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
</dependency>

这里项目中由于未指定版本遇到问题改为下面方式:

<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
<version>8.5.13</version>
</dependency>
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-mysql</artifactId>
<version>8.5.13</version>
</dependency>

​配置数据源和 Flyway​​
在 application.properties 或 application.yml 中配置:
# 数据源配置
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
spring.datasource.password=123456

# Flyway 配置
spring.flyway.enabled=true
spring.flyway.locations=classpath:db/migration # 脚本存放路径
spring.flyway.baseline-on-migrate=true # 初始化已有数据库
spring.flyway.validate-on-migrate=true # 校验脚本是否被修改

​​创建迁移脚本​​
在 src/main/resources/db/migration 目录下创建 SQL 文件:
src/main/resources/
└── db/
└── migration/
├── V1__Create_user_table.sql
└── V2__Add_email_column.sql

这样不需要我们自己创建表,服务启动后就会自动帮我们创建表。

后台运行服务
我们通过java命令直接运行jar的方式会阻塞的控制台,如果控制台关闭,服务就停了,这里使用systemd(系统服务管理)​来创建守护进程,支持开机自启、日志监控和自动重启。
systemd特点​:

适合长期运行的服务(如 Web 服务器)。
需要 root 权限。
接下来我们创建服务文件:

sudo nano /etc/systemd/system/autotodo.service

接着写入配置:

[Unit]
Description=My Spring Boot Application
After=syslog.target

[Service]
User=root
ExecStart=java -jar /root/code/AutoTodo/server/autotodo-server-1.0.0-SNAPSHOT.jar
Restart=on-failure
Environment=SPRING_PROFILES_ACTIVE=prod
WorkingDirectory=/root/code/AutoTodo/server

[Install]
WantedBy=multi-user.target

最后启用并启动服务​:

sudo systemctl daemon-reload
sudo systemctl start autotodo # 启动服务
sudo systemctl enable autotodo # 开机自启

最后可以通过systemctl statue autoto查看服务运行情况:

部署前端项目
安装nginx
前端Vue打包后需要使用静态服务承接请求,这里使用Nginx。
在 Ubuntu 上安装 Nginx 的步骤如下:
​1. 更新系统包列表​​
sudo apt update
​2. 安装 Nginx​​
sudo apt install nginx
3. 验证安装​​
安装完成后,Nginx 会自动启动。检查服务状态:
sudo systemctl status nginx
正常输出应显示 active (running)。
​4. 调整防火墙(可选)​​
如果启用了 UFW 防火墙,开放 HTTP(80)和 HTTPS(443)端口:
sudo ufw allow 'Nginx Full' # 允许 HTTP 和 HTTPS sudo ufw reload
​5. 测试访问​​
在浏览器中访问服务器的 IP 或域名:

http://your-server-ip

若看到 ​​“Welcome to nginx!”​​ 页面,表示安装成功。

管理 Nginx 服务​​
命令 说明
sudo systemctl start nginx 启动 Nginx
sudo systemctl stop nginx 停止 Nginx
sudo systemctl restart nginx 重启 Nginx
sudo systemctl reload nginx 重新加载配置(不中断服务)
sudo systemctl enable nginx 设置开机自启
配置文件说明​​
​默认配置文件路径​:
/etc/nginx/nginx.conf # 全局配置
/etc/nginx/sites-available/* # 虚拟主机配置
/etc/nginx/sites-enabled/* # 已启用的虚拟主机配置(符号链接)

​​默认静态文件目录​​:

/var/www/html
​8. 基本配置示例​​
​(1) 托管静态网站​​
创建配置文件 /etc/nginx/sites-available/my-site:

server { listen 80; server_name your-domain.com www.your-domain.com; root /var/www/my-site; index index.html; location / { try_files $uri $uri/ =404; } # 静态资源缓存 location ~* \.(css|js|png|jpg|svg)$ { expires 1y; add_header Cache-Control "public"; } }

启用配置并重载 Nginx:

sudo ln -s /etc/nginx/sites-available/my-site /etc/nginx/sites-enabled/ sudo nginx -t && sudo systemctl reload nginx

​​(2) 反向代理后端服务​​
将请求转发到本地的 Spring Boot 应用(假设运行在 8080 端口):

server { listen 80; server_name api.your-domain.com; location / { proxy_pass http://localhost:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
​9. 启用 HTTPS(可选)​​
使用 Let’s Encrypt 免费 SSL 证书:
sudo apt install certbot python3-certbot-nginx sudo certbot --nginx -d your-domain.com -d www.your-domain.com

证书会自动续期,无需手动操作。

构建打包前端项目
可以在项目中直接使用npm run dev来运行前端项目,当时要部署的话需要先构建打包后再部署,通过npm run build来打包构建,打包完成后输出到dist目录。

将打包好路径上传到/var/www/todo下

接下来配置Nginx。

配置nginx服务
在/etc/nginx/sites-available/下创建我们项目的配置文件todo.conf,输入内容如下:

server {
listen 80;
server_name todo.xxx.com;

# 优先匹配静态资源
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ {
root /var/www/todo/frontend/dist;
expires 1y; # 缓存静态资源
add_header Cache-Control "public";
access_log off;
}
# 前端静态文件
location / {
root /var/www/todo/frontend/dist;
index index.html;
try_files $uri $uri/ /index.html;
}

# 后端API代理
location /api {
proxy_pass http://localhost:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}

# SSL配置 (需要证书)
# listen 443 ssl;
# ssl_certificate /path/to/cert.pem;
# ssl_certificate_key /path/to/key.pem;

# 性能优化
gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
client_max_body_size 10m;

这里面配置了静态资源服务和后端server api方向代理接口,这样通过域名可以直接访问我们的页面了。
最开始由于少配了下面内容:

# 优先匹配静态资源
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ {
root /var/www/todo/frontend/dist;
expires 1y; # 缓存静态资源
add_header Cache-Control "public";
access_log off;
}

导致打开页面是js文件无法被正确加载。

效果展示
最后放几个效果图:
首先登录:

等了完成可以输入我们要完成的事情:

输入内容等待服务端响应,服务端此时调用DeepSeek生成代办项:

生成结果后可以选中代办项进行保存:

保存后跳转到待办列表可以查看我们具体事项对应待办了:

————————————————

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/sjw890821sjw/article/details/148321859

阅读剩余
THE END