Files
AIGC/demo/LINUX_DEPLOYMENT_GUIDE.md
AIGC Developer ef379bcca6 docs: 添加Linux云端部署完整指南
- 添加完整的Linux部署文档(LINUX_DEPLOYMENT_GUIDE.md)
- 包含本地打包、服务器配置、数据库设置、Nginx配置等完整步骤
- 添加自动化部署脚本(deploy-linux.sh)
- 支持Ubuntu/Debian和CentOS/RHEL系统
- 包含故障排查、性能监控、安全建议等内容
2025-11-08 09:21:14 +08:00

847 lines
17 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 🐧 Linux 云端部署完整指南
本文档提供将项目打包并部署到Linux云服务器的完整步骤。
---
## 📦 一、本地打包Windows/Mac
### 1.1 打包后端JAR文件
在项目根目录(`demo/`)执行:
```bash
# Windows (PowerShell)
.\mvnw.cmd clean package -DskipTests
# Linux/Mac
./mvnw clean package -DskipTests
```
打包成功后JAR文件位置
```
demo/target/demo-0.0.1-SNAPSHOT.jar
```
### 1.2 打包前端
```bash
# 进入前端目录
cd frontend
# 安装依赖(首次需要)
npm install
# 构建生产版本
npm run build
```
构建成功后,前端文件位置:
```
demo/frontend/dist/
```
### 1.3 准备部署文件
创建部署包目录结构:
```bash
# 在项目根目录创建部署包
mkdir -p deploy-package
mkdir -p deploy-package/backend
mkdir -p deploy-package/frontend
mkdir -p deploy-package/scripts
mkdir -p deploy-package/config
# 复制文件
cp target/demo-0.0.1-SNAPSHOT.jar deploy-package/backend/
cp -r frontend/dist/* deploy-package/frontend/
cp deploy.sh deploy-package/scripts/
```
---
## 🚀 二、服务器环境准备
### 2.1 连接服务器
```bash
# 使用SSH连接服务器
ssh username@your-server-ip
# 或使用密钥
ssh -i ~/.ssh/your-key.pem username@your-server-ip
```
### 2.2 安装必需软件
#### Ubuntu/Debian
```bash
# 更新系统
sudo apt update && sudo apt upgrade -y
# 安装Java 21
sudo apt install -y openjdk-21-jdk
# 验证Java安装
java -version
# 应该显示: openjdk version "21.x.x"
# 安装MySQL 8.0
sudo apt install -y mysql-server
# 启动MySQL服务
sudo systemctl start mysql
sudo systemctl enable mysql
# 安装FFmpeg视频处理需要
sudo apt install -y ffmpeg
# 验证FFmpeg安装
ffmpeg -version
# 安装Nginx反向代理
sudo apt install -y nginx
# 安装Maven可选用于重新构建
sudo apt install -y maven
```
#### CentOS/RHEL
```bash
# 更新系统
sudo yum update -y
# 安装Java 21
sudo yum install -y java-21-openjdk java-21-openjdk-devel
# 安装MySQL 8.0
sudo yum install -y mysql-server
# 启动MySQL服务
sudo systemctl start mysqld
sudo systemctl enable mysqld
# 安装FFmpeg
sudo yum install -y epel-release
sudo yum install -y ffmpeg
# 安装Nginx
sudo yum install -y nginx
```
### 2.3 创建应用目录
```bash
# 创建应用目录结构
sudo mkdir -p /app/aigc-platform
sudo mkdir -p /app/aigc-platform/{logs,uploads,temp,config,backend,frontend}
# 设置权限
sudo chown -R $USER:$USER /app/aigc-platform
chmod -R 755 /app/aigc-platform
```
---
## 🗄️ 三、数据库配置
### 3.1 配置MySQL
```bash
# 安全配置MySQL首次安装
sudo mysql_secure_installation
# 登录MySQL
sudo mysql -u root -p
```
### 3.2 创建数据库和用户
```sql
-- 创建数据库
CREATE DATABASE aigc_platform CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 创建用户(替换'your_password'为强密码)
CREATE USER 'aigc_user'@'localhost' IDENTIFIED BY 'your_password';
-- 授予权限
GRANT ALL PRIVILEGES ON aigc_platform.* TO 'aigc_user'@'localhost';
FLUSH PRIVILEGES;
-- 退出
EXIT;
```
### 3.3 优化MySQL配置
编辑MySQL配置文件
```bash
# Ubuntu/Debian
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
# CentOS/RHEL
sudo nano /etc/my.cnf
```
添加/修改以下配置:
```ini
[mysqld]
# 字符集
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
# 连接数50人并发
max_connections=100
max_user_connections=50
# 缓冲池根据内存调整8GB服务器建议2-4GB
innodb_buffer_pool_size=2G
# 日志
slow_query_log=1
slow_query_log_file=/var/log/mysql/slow-query.log
long_query_time=2
# 时区
default-time-zone='+08:00'
```
重启MySQL
```bash
sudo systemctl restart mysql
```
---
## 📤 四、上传文件到服务器
### 4.1 使用SCP上传推荐
在**本地**执行:
```bash
# 上传JAR文件
scp target/demo-0.0.1-SNAPSHOT.jar username@your-server-ip:/app/aigc-platform/backend/
# 上传前端文件
scp -r frontend/dist/* username@your-server-ip:/app/aigc-platform/frontend/
# 或使用rsync更高效
rsync -avz frontend/dist/ username@your-server-ip:/app/aigc-platform/frontend/
```
### 4.2 使用FTP/SFTP工具
使用FileZilla、WinSCP等工具上传文件到
- JAR文件 → `/app/aigc-platform/backend/`
- 前端文件 → `/app/aigc-platform/frontend/`
### 4.3 使用Git如果服务器有Git
```bash
# 在服务器上克隆仓库
cd /app/aigc-platform
git clone ssh://git@your-git-server/path/to/repo.git
# 构建
cd repo/demo
./mvnw clean package -DskipTests
cp target/demo-0.0.1-SNAPSHOT.jar /app/aigc-platform/backend/
```
---
## ⚙️ 五、应用配置
### 5.1 创建配置文件
在服务器上创建配置文件:
```bash
# 创建生产环境配置
sudo nano /app/aigc-platform/config/application-prod.properties
```
配置文件内容:
```properties
# 数据库配置
spring.datasource.url=jdbc:mysql://localhost:3306/aigc_platform?useUnicode=true&characterEncoding=utf8&useSSL=true&serverTimezone=Asia/Shanghai
spring.datasource.username=aigc_user
spring.datasource.password=your_password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# 连接池配置50人并发
spring.datasource.hikari.maximum-pool-size=30
spring.datasource.hikari.minimum-idle=10
spring.datasource.hikari.connection-timeout=30000
spring.datasource.hikari.idle-timeout=600000
spring.datasource.hikari.max-lifetime=1800000
# JPA配置
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=false
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect
# 服务器配置
server.port=8080
server.tomcat.threads.max=150
server.tomcat.threads.min-spare=20
server.tomcat.max-connections=200
server.tomcat.accept-count=100
# JWT配置
jwt.secret=your-jwt-secret-key-change-this-to-random-string
jwt.expiration=86400000
# AI API配置从环境变量读取
ai.api.base-url=${AI_API_BASE_URL:https://api.openai.com}
ai.api.key=${AI_API_KEY:your-api-key}
ai.image.api.base-url=${AI_IMAGE_API_BASE_URL:https://api.openai.com}
ai.image.api.key=${AI_IMAGE_API_KEY:your-api-key}
# 文件上传配置
app.upload.path=${UPLOAD_PATH:/app/aigc-platform/uploads}
spring.servlet.multipart.max-file-size=100MB
spring.servlet.multipart.max-request-size=100MB
# 日志配置
logging.level.root=INFO
logging.level.com.example.demo=DEBUG
logging.file.path=/app/aigc-platform/logs
logging.file.name=${logging.file.path}/application.log
logging.pattern.file=%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n
# 时区
spring.jackson.time-zone=Asia/Shanghai
```
### 5.2 创建环境变量文件(可选)
```bash
sudo nano /app/aigc-platform/config/.env
```
```bash
# 数据库配置
export DB_URL="jdbc:mysql://localhost:3306/aigc_platform?useUnicode=true&characterEncoding=utf8&useSSL=true&serverTimezone=Asia/Shanghai"
export DB_USERNAME="aigc_user"
export DB_PASSWORD="your_password"
# JWT密钥生成随机密钥
export JWT_SECRET="$(openssl rand -base64 64)"
# AI API密钥
export AI_API_KEY="your-api-key"
export AI_IMAGE_API_KEY="your-api-key"
# 文件路径
export UPLOAD_PATH="/app/aigc-platform/uploads"
export TEMP_DIR="/app/aigc-platform/temp"
export FFMPEG_PATH="/usr/bin/ffmpeg"
```
---
## 🔧 六、创建Systemd服务
### 6.1 创建服务文件
```bash
sudo nano /etc/systemd/system/aigc-platform.service
```
服务文件内容:
```ini
[Unit]
Description=AIGC Platform Application
After=network.target mysql.service
Requires=mysql.service
[Service]
Type=simple
User=your-username
Group=your-group
WorkingDirectory=/app/aigc-platform/backend
# 环境变量(可选,如果使用.env文件
# EnvironmentFile=/app/aigc-platform/config/.env
# JVM参数根据服务器内存调整
# 8GB内存服务器建议-Xms1g -Xmx4g
# 16GB内存服务器建议-Xms2g -Xmx8g
ExecStart=/usr/bin/java \
-Xms1g \
-Xmx4g \
-XX:+UseG1GC \
-XX:MaxGCPauseMillis=200 \
-Dspring.profiles.active=prod \
-Dspring.config.location=file:/app/aigc-platform/config/application-prod.properties \
-jar /app/aigc-platform/backend/demo-0.0.1-SNAPSHOT.jar
# 重启策略
Restart=always
RestartSec=10
# 日志
StandardOutput=journal
StandardError=journal
SyslogIdentifier=aigc-platform
# 安全设置
NoNewPrivileges=true
PrivateTmp=true
[Install]
WantedBy=multi-user.target
```
**重要:**`your-username``your-group` 替换为实际的用户名和组。
### 6.2 启动服务
```bash
# 重新加载systemd配置
sudo systemctl daemon-reload
# 启用服务(开机自启)
sudo systemctl enable aigc-platform
# 启动服务
sudo systemctl start aigc-platform
# 查看服务状态
sudo systemctl status aigc-platform
# 查看日志
sudo journalctl -u aigc-platform -f
```
### 6.3 常用服务管理命令
```bash
# 启动服务
sudo systemctl start aigc-platform
# 停止服务
sudo systemctl stop aigc-platform
# 重启服务
sudo systemctl restart aigc-platform
# 查看状态
sudo systemctl status aigc-platform
# 查看日志
sudo journalctl -u aigc-platform -n 100 -f
# 查看最近错误
sudo journalctl -u aigc-platform -p err -n 50
```
---
## 🌐 七、Nginx反向代理配置
### 7.1 创建Nginx配置
```bash
sudo nano /etc/nginx/sites-available/aigc-platform
```
配置内容:
```nginx
# HTTP服务器重定向到HTTPS
server {
listen 80;
server_name your-domain.com www.your-domain.com;
# 重定向到HTTPS
return 301 https://$server_name$request_uri;
}
# HTTPS服务器
server {
listen 443 ssl http2;
server_name your-domain.com www.your-domain.com;
# SSL证书配置使用Let's Encrypt
ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
# 日志
access_log /var/log/nginx/aigc-platform-access.log;
error_log /var/log/nginx/aigc-platform-error.log;
# 客户端最大上传大小
client_max_body_size 100M;
# 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;
# WebSocket支持如果需要
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# 超时设置
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
}
# 上传文件代理
location /uploads/ {
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;
# 缓存设置
expires 7d;
add_header Cache-Control "public, immutable";
}
# 前端静态文件
location / {
root /app/aigc-platform/frontend;
index index.html;
try_files $uri $uri/ /index.html;
# 缓存设置
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
}
# 健康检查
location /health {
proxy_pass http://localhost:8080/actuator/health;
access_log off;
}
}
```
### 7.2 启用配置
```bash
# 创建符号链接
sudo ln -s /etc/nginx/sites-available/aigc-platform /etc/nginx/sites-enabled/
# 测试配置
sudo nginx -t
# 重新加载Nginx
sudo systemctl reload nginx
```
### 7.3 配置SSL证书Let's Encrypt
```bash
# 安装Certbot
sudo apt install -y certbot python3-certbot-nginx
# 获取证书自动配置Nginx
sudo certbot --nginx -d your-domain.com -d www.your-domain.com
# 测试自动续期
sudo certbot renew --dry-run
```
---
## ✅ 八、验证部署
### 8.1 检查服务状态
```bash
# 检查应用服务
sudo systemctl status aigc-platform
# 检查MySQL服务
sudo systemctl status mysql
# 检查Nginx服务
sudo systemctl status nginx
# 检查端口占用
sudo netstat -tlnp | grep -E '8080|80|443'
```
### 8.2 测试API
```bash
# 测试健康检查
curl http://localhost:8080/actuator/health
# 测试API需要认证
curl -X POST http://localhost:8080/api/auth/login \
-H "Content-Type: application/json" \
-d '{"username":"test","password":"test"}'
```
### 8.3 测试前端
在浏览器中访问:
- HTTP: `http://your-server-ip`
- HTTPS: `https://your-domain.com`
### 8.4 检查日志
```bash
# 应用日志
tail -f /app/aigc-platform/logs/application.log
# 系统日志
sudo journalctl -u aigc-platform -f
# Nginx日志
sudo tail -f /var/log/nginx/aigc-platform-access.log
sudo tail -f /var/log/nginx/aigc-platform-error.log
```
---
## 🔄 九、更新部署
### 9.1 更新后端
```bash
# 1. 停止服务
sudo systemctl stop aigc-platform
# 2. 备份旧版本
cp /app/aigc-platform/backend/demo-0.0.1-SNAPSHOT.jar \
/app/aigc-platform/backend/demo-0.0.1-SNAPSHOT.jar.backup
# 3. 上传新版本(从本地)
# scp target/demo-0.0.1-SNAPSHOT.jar username@server:/app/aigc-platform/backend/
# 4. 启动服务
sudo systemctl start aigc-platform
# 5. 检查状态
sudo systemctl status aigc-platform
```
### 9.2 更新前端
```bash
# 1. 备份旧版本
cp -r /app/aigc-platform/frontend /app/aigc-platform/frontend.backup
# 2. 上传新版本(从本地)
# scp -r frontend/dist/* username@server:/app/aigc-platform/frontend/
# 3. 重新加载Nginx
sudo systemctl reload nginx
```
---
## 🛠️ 十、故障排查
### 10.1 应用无法启动
```bash
# 查看详细日志
sudo journalctl -u aigc-platform -n 100
# 检查Java版本
java -version
# 检查端口占用
sudo lsof -i :8080
# 检查文件权限
ls -la /app/aigc-platform/backend/
```
### 10.2 数据库连接失败
```bash
# 测试MySQL连接
mysql -u aigc_user -p aigc_platform
# 检查MySQL服务
sudo systemctl status mysql
# 查看MySQL日志
sudo tail -f /var/log/mysql/error.log
```
### 10.3 Nginx配置错误
```bash
# 测试配置
sudo nginx -t
# 查看错误日志
sudo tail -f /var/log/nginx/error.log
```
### 10.4 内存不足
```bash
# 查看内存使用
free -h
# 查看Java进程内存
ps aux | grep java
# 调整JVM参数在systemd服务文件中
# -Xms1g -Xmx4g # 减少内存使用
```
---
## 📊 十一、性能监控
### 11.1 系统监控
```bash
# CPU和内存使用
top
htop # 如果安装了
# 磁盘使用
df -h
# 网络连接
netstat -an | grep ESTABLISHED | wc -l
```
### 11.2 应用监控
```bash
# 查看JVM内存使用
jstat -gc <pid> 1000
# 查看线程
jstack <pid>
# 查看应用日志
tail -f /app/aigc-platform/logs/application.log | grep ERROR
```
---
## 🔒 十二、安全建议
1. **防火墙配置**
```bash
# 只开放必要端口
sudo ufw allow 22/tcp # SSH
sudo ufw allow 80/tcp # HTTP
sudo ufw allow 443/tcp # HTTPS
sudo ufw enable
```
2. **定期备份**
```bash
# 备份数据库
mysqldump -u aigc_user -p aigc_platform > backup_$(date +%Y%m%d).sql
# 备份上传文件
tar -czf uploads_backup_$(date +%Y%m%d).tar.gz /app/aigc-platform/uploads
```
3. **更新系统**
```bash
sudo apt update && sudo apt upgrade -y
```
---
## 📝 快速部署脚本
创建一键部署脚本 `deploy-linux.sh`
```bash
#!/bin/bash
set -e
echo "🚀 开始部署 AIGC 平台..."
# 检查Java
if ! command -v java &> /dev/null; then
echo "❌ Java未安装请先安装Java 21"
exit 1
fi
# 检查MySQL
if ! systemctl is-active --quiet mysql; then
echo "❌ MySQL服务未运行"
exit 1
fi
# 停止服务
echo "🛑 停止服务..."
sudo systemctl stop aigc-platform || true
# 备份
echo "💾 备份旧版本..."
BACKUP_DIR="/app/aigc-platform/backup/$(date +%Y%m%d_%H%M%S)"
mkdir -p $BACKUP_DIR
cp /app/aigc-platform/backend/demo-0.0.1-SNAPSHOT.jar $BACKUP_DIR/ || true
# 启动服务
echo "▶️ 启动服务..."
sudo systemctl start aigc-platform
# 等待启动
sleep 5
# 检查状态
if systemctl is-active --quiet aigc-platform; then
echo "✅ 部署成功!"
sudo systemctl status aigc-platform
else
echo "❌ 部署失败,查看日志:"
sudo journalctl -u aigc-platform -n 50
exit 1
fi
```
使用:
```bash
chmod +x deploy-linux.sh
./deploy-linux.sh
```
---
## 📞 支持
如遇问题,请检查:
1. 日志文件:`/app/aigc-platform/logs/application.log`
2. 系统日志:`sudo journalctl -u aigc-platform`
3. Nginx日志`/var/log/nginx/aigc-platform-error.log`
---
**部署完成后,访问:**
- 前端:`https://your-domain.com`
- API`https://your-domain.com/api`
- 健康检查:`https://your-domain.com/health`