在这里插入图片描述

项目描述

  • 上一篇文章是前后端一把梭,现在是连部署也一起干了
  • 真实购买的服务器,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

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐