在这里插入图片描述

项目描述

  • 上一篇文章是前后端一把梭,现在是连部署也一起干了
  • 真实购买的服务器,100%实战,不玩虚的
  • 这是第二个全栈项目,整体还是不难的,重点讲一下部署
  • 简单来说,接入了deepseek大模型,可以进行问答,效果如图所示:
    在这里插入图片描述
  • 当然,也可以进行一些配置
    在这里插入图片描述

本文档记录了从 0 到 1 的完整部署流程,包括前端静态部署、后端服务部署,以及部署过程中踩过的坑和解决方案。

适用人群:前端开发,对 Linux / Nginx / Python 不太熟悉的新手。
部署环境:阿里云 ECS + 宝塔面板 + Ubuntu/Debian 系统。


一、准备工作

1.1 你需要什么

项目 说明
一台云服务器 阿里云 / 腾讯云 / 其他,需要有公网 IP
宝塔面板 安装在服务器上,用于可视化管理网站和文件
项目代码 testAI.htmlbackend.pyrequirements.txt.env.example
DeepSeek API Key platform.deepseek.com 申请

1.2 项目架构简介

用户浏览器
    │
    ▼
  Nginx(80/8080 端口)  ←── 前端静态文件(testAI.html)
    │
    └── /api/* 请求转发到 ──► Flask 后端(5000 端口)
                                 │
                                 ▼
                            DeepSeek API

为什么需要 Nginx?

Nginx 是服务器的"门卫+前台"。浏览器只能通过 HTTP 端口访问服务器,Nginx 负责:

  • 把访问页面的请求直接返回 testAI.html
  • 把发送消息的请求(/api/chat)转发给后端的 Python 程序
  • 没有 Nginx,用户打不开页面,前端和后端也无法正常通信。

二、前端静态部署(Nginx)

2.1 上传前端文件

  1. 登录宝塔面板(http://你的服务器IP:8888
  2. 点击左侧 “文件”
  3. 进入 /www/wwwroot/ 目录
  4. 点击 “新建文件夹”,命名为 deepseek-ai
  5. 进入 deepseek-ai 文件夹
  6. 点击 “上传”,把 testAI.html 上传到该目录

2.2 创建网站

  1. 点击左侧 “网站”
  2. 点击 “添加站点”
  3. 填写信息:
    • 域名:填你的服务器公网 IP(例如 39.xx.x.xxx
    • 根目录/www/wwwroot/deepseek-ai
    • 其他保持默认
  4. 点击 “提交”

2.3 修改 Nginx 配置文件

  1. 在网站列表找到刚创建的站点,点击 “设置”
  2. 点击左侧 “配置文件”
  3. 把内容替换为以下配置:
server {
    # 监听 80 端口(HTTP 默认端口)
    listen 80;
    # 匹配所有请求(没有域名时用下划线)
    server_name _;

    # 网站根目录
    root /www/wwwroot/deepseek-ai;
    # 默认首页文件
    index testAI.html;

    # 处理所有页面请求
    location / {
        # 尝试匹配文件,找不到就返回 testAI.html(支持前端路由)
        try_files $uri $uri/ /testAI.html;
    }

    # 把 /api/ 开头的请求转发给后端 Flask(5000端口)
    location /api/ {
        proxy_pass http://127.0.0.1:5000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }

    # 健康检查接口也转发给后端
    location /health {
        proxy_pass http://127.0.0.1:5000/health;
    }
}
  1. 点击 “保存”

2.4 阿里云安全组开放端口

宝塔里配置好了,但阿里云还有一层"防火墙"(安全组),默认只开放 22 端口。需要手动开放 80 端口。

  1. 登录 阿里云控制台
  2. 搜索 “云服务器 ECS”,找到你的服务器
  3. 点击 “安全组”“管理规则”
  4. 点击 “手动添加”,填写:
    • 优先级:1
    • 协议:TCP
    • 端口范围:80/80
    • 源:0.0.0.0/0(允许所有 IP 访问)
    • 描述:HTTP访问
  5. 点击 “保存”

如果 80 端口仍无法访问,可以临时把 Nginx 配置里的 listen 80; 改成 listen 8080;,同时安全组开放 8080 端口,浏览器访问 http://IP:8080

2.5 验证前端

浏览器访问 http://你的服务器IP,能看到 AI 聊天页面即表示前端部署成功。

此时发送消息会报错,因为后端还没部署,下一步继续。


三、后端服务部署(Flask + Gunicorn)

3.1 上传后端代码

  1. 宝塔面板 → “文件”
  2. 进入 /www/wwwroot/deepseek-ai
  3. 点击 “上传”,把以下文件上传:
    • backend.py(后端主程序)
    • requirements.txt(Python 依赖列表)
    • .env.example(环境变量模板)
  4. .env.example 重命名.env
  5. 双击打开 .env,把 DEEPSEEK_API_KEY 改成你的真实 API Key:
DEEPSEEK_API_KEY=sk-xxxxxxxxx    # ← 改成你的真实 Key
DEEPSEEK_URL=https://api.deepseek.com/v1/chat/completions
FLASK_ENV=production
PORT=5000

3.2 安装 Python 虚拟环境

  1. 宝塔面板 → “终端”
  2. 依次执行以下命令:
# 进入项目目录
cd /www/wwwroot/deepseek-ai

# 创建虚拟环境(隔离项目依赖,不影响系统 Python)
python3 -m venv venv

命令解释

  • python3 -m venv venv:在当前目录创建一个叫 venv 的虚拟环境
  • 虚拟环境就像给项目单独建了一个"小房间",里面安装的包不会影响系统环境
遇到的问题:ensurepip 不可用

现象

The virtual environment was not created successfully because ensurepip is not available.

原因:Ubuntu/Debian 系统默认没有安装创建虚拟环境所需的模块。

解决

# 安装 python3-venv 包
apt install python3.12-venv -y

# 如果提示权限不足,加 sudo
sudo apt install python3.12-venv -y

安装完成后,重新执行创建虚拟环境的命令:

python3 -m venv venv

3.3 安装 Python 依赖

# 激活虚拟环境(进入"小房间")
source venv/bin/activate

# 安装项目依赖
pip install -r requirements.txt

命令解释

  • source venv/bin/activate:激活虚拟环境,之后 pippython 命令都会使用虚拟环境中的版本
  • pip install -r requirements.txt:按照 requirements.txt 里的列表自动安装 Flask、requests、gunicorn

requirements.txt 内容说明

Flask>=2.0.0       # Web 框架,提供 HTTP 服务
requests>=2.0.0    # HTTP 客户端,用于调用 DeepSeek API
gunicorn>=20.0.0   # Python WSGI 服务器,比 Flask 自带服务器更稳定

3.4 启动后端服务

先测试能否正常启动
# 在虚拟环境中运行后端(前台运行,方便看日志)
python backend.py

如果看到类似 Running on http://0.0.0.0:5000,说明后端代码没问题。

Ctrl + C 停止,接下来用 Gunicorn 在后台运行。

使用 Gunicorn 后台启动
# 用 nohup 让进程在后台运行,关闭终端也不会停止
# 日志输出到 app.log
nohup gunicorn --bind 0.0.0.0:5000 --workers 2 backend:app > app.log 2>&1 &

命令解释

  • nohup:忽略挂断信号,终端关闭后程序继续运行
  • gunicorn:生产级 Python Web 服务器
  • --bind 0.0.0.0:5000:绑定到服务器的 5000 端口,允许外网访问(Nginx 会通过内网转发过来)
  • --workers 2:启动 2 个工作进程,能同时处理多个请求
  • backend:app:加载 backend.py 文件中的 app 对象(Flask 实例)
  • > app.log 2>&1:把正常运行日志和错误日志都写入 app.log
  • &:放到后台执行
遇到的问题:端口被占用

现象:日志里反复出现:

[ERROR] Connection in use: ('0.0.0.0', 5000)
[ERROR] connection to ('0.0.0.0', 5000) failed: [Errno 98] Address already in use

原因:之前测试启动的后端进程没有关闭,或者多次执行了启动命令,多个进程抢占了 5000 端口。

解决

# 查看占用 5000 端口的进程
lsof -i :5000

# 杀掉所有 gunicorn 和 python 后端进程
pkill -f gunicorn
pkill -f "python backend.py"

# 清理旧日志
rm -f app.log

# 重新启动
source venv/bin/activate
nohup gunicorn --bind 0.0.0.0:5000 --workers 2 backend:app > app.log 2>&1 &

# 确认只有一个进程在跑
lsof -i :5000

3.5 验证后端是否正常运行

在宝塔终端执行:

# 测试健康检查接口
curl http://127.0.0.1:5000/health

正常返回:

{"status": "healthy", "timestamp": 1234567890, "version": "1.0.0"}

再测试聊天接口:

curl -X POST http://127.0.0.1:5000/api/chat \
  -H "Content-Type: application/json" \
  -d '{"messages": [{"role": "user", "content": "你好"}]}'

如果返回了 DeepSeek 的回复,说明后端完全正常。


四、完整功能验证

  1. 打开浏览器,访问 http://你的服务器IP
  2. 在聊天框输入消息,点击发送
  3. 如果能看到 AI 回复,说明前后端联动成功!

五、常见问题速查

Q1:浏览器访问 IP 显示"没有找到站点"

原因:Nginx 没有匹配到对应的站点。

排查

  • 检查宝塔网站列表里的域名是否和你访问的 IP 一致
  • 检查 Nginx 配置文件的 server_name 是否填了 _(匹配所有)
  • 检查阿里云安全组是否开放了对应端口

Q2:前端页面能打开,但发送消息报错 500

原因:后端内部错误。

排查

# 查看最新错误日志
cat /www/wwwroot/deepseek-ai/app.log
  • 检查 .env 里的 DEEPSEEK_API_KEY 是否已填入真实 Key
  • 检查后端进程是否还在跑:lsof -i :5000

Q3:阿里云安全组已经开放端口,但还是访问不了

原因:宝塔面板本身也有防火墙。

排查:宝塔面板 → “安全” → 检查是否放行了对应端口。

Q4:服务器重启后后端不工作了

原因nohup 启动的进程不会随系统开机自动启动。

解决:服务器重启后,重新执行启动命令:

cd /www/wwwroot/deepseek-ai
source venv/bin/activate
nohup gunicorn --bind 0.0.0.0:5000 --workers 2 backend:app > app.log 2>&1 &

如果需要开机自动启动,可以在宝塔安装 Supervisor 插件来管理进程。


六、文件目录结构

部署完成后,服务器上的文件结构应该是这样:

/www/wwwroot/deepseek-ai/
├── testAI.html          # 前端页面
├── backend.py           # Flask 后端主程序
├── requirements.txt     # Python 依赖列表
├── .env                 # 环境变量配置(含 API Key)
├── venv/                # Python 虚拟环境目录
│   ├── bin/
│   └── lib/
└── app.log              # 后端运行日志

七、技术栈总结

层级 技术 作用
前端 HTML + CSS + JS 用户交互界面
Web 服务器 Nginx 静态文件托管、反向代理、端口转发
后端框架 Flask 提供 REST API
WSGI 服务器 Gunicorn 生产环境运行 Flask
代理服务 DeepSeek API AI 大模型对话能力

1. 希望本文能对大家有所帮助,如有错误,敬请指出
2. 原创不易,还请各位客官动动发财的小手支持一波(关注、评论、点赞、收藏)
3. 拜谢各位!后续将继续奉献优质好文

在这里插入图片描述

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐