从零搭一个自己的 ChatGPT 网页版:Docker、Nginx、HTTPS 配置全流程
ChatGPT 部署完整教程|附配置文件
本文将从零开始讲解如何在服务器上部署一个可访问的 ChatGPT Web 服务,适合个人使用、团队内部使用或作为 AI 助手入口。教程包含环境准备、项目选择、Docker 部署、Nginx 反向代理、HTTPS 配置、环境变量说明、常见问题排查,并附带完整配置文件示例。
一、前言:部署 ChatGPT 到底是什么意思?
严格来说,ChatGPT 本身并不能直接“私有化部署”。
ChatGPT 是 OpenAI 提供的对话式 AI 产品,它背后依赖大模型服务。普通用户无法把官方 ChatGPT 完整部署到自己的服务器上。
但我们通常所说的“部署 ChatGPT”,一般指的是:
- 使用 OpenAI API 或其他大模型 API;
- 部署一个类似 ChatGPT 的 Web 前端;
- 用户通过浏览器访问自己的域名;
- 前端调用后端接口;
- 后端再请求 OpenAI、Azure OpenAI、DeepSeek、通义千问、智谱、Claude 等模型服务;
- 最终实现类似 ChatGPT 的聊天体验。
因此,本文的部署目标是:
在自己的服务器上部署一个 ChatGPT 风格的 Web 应用,并通过 API Key 接入大模型服务。
二、部署方案选择
目前常见的 ChatGPT Web 部署方案主要有以下几类。
1. NextChat
原名 ChatGPT-Next-Web,是非常流行的开源 ChatGPT Web 项目。
优点:
- 部署简单;
- 支持 Docker;
- UI 简洁;
- 支持多种模型接口;
- 适合个人和小团队使用。
适合人群:
- 想快速搭建一个可用 ChatGPT Web 页面的用户;
- 对后端开发要求不高;
- 希望通过 Docker 一键部署。
2. LobeChat
LobeChat 是功能更丰富的 AI 聊天应用。
优点:
- 界面现代;
- 插件生态较好;
- 支持多模型;
- 适合高级用户。
适合人群:
- 需要更丰富会话管理;
- 需要模型市场、插件或 Agent 能力;
- 希望打造更完整 AI 工作台。
3. 自研前后端
如果你有开发能力,也可以使用:
- Vue / React 前端;
- Node.js / Python / Go 后端;
- OpenAI SDK;
- 数据库存储历史会话。
优点是高度可控,缺点是开发和维护成本较高。
三、本文采用的部署方案
为了兼顾简单性、稳定性和可维护性,本文采用以下方案:
用户浏览器
↓
Nginx HTTPS 反向代理
↓
ChatGPT Web Docker 容器
↓
OpenAI API / 兼容 API 服务
服务器环境示例:
系统:Ubuntu 22.04 LTS
CPU:1 核及以上
内存:1GB 及以上
磁盘:10GB 及以上
域名:chat.example.com
部署方式:Docker Compose
反向代理:Nginx
HTTPS:Let's Encrypt SSL 证书
如果只是个人使用,1 核 1GB 的轻量服务器通常也能运行。因为真正消耗计算资源的是大模型 API 服务,而不是你的 Web 前端服务器。
四、部署前准备工作
在正式部署之前,你需要准备以下内容。
1. 一台云服务器
可以使用以下任意云服务商:
- 阿里云;
- 腾讯云;
- 华为云;
- AWS;
- Google Cloud;
- Azure;
- Vultr;
- DigitalOcean;
- Hetzner。
推荐系统选择:
Ubuntu 22.04 LTS
2. 一个域名
例如:
chat.example.com
将该域名解析到你的服务器公网 IP。
DNS 解析示例:
| 类型 | 主机记录 | 记录值 |
|---|---|---|
| A | chat | 你的服务器公网 IP |
解析完成后,可以在本地测试:
ping chat.example.com
如果能够解析到服务器 IP,说明 DNS 基本生效。
3. 一个 API Key
如果使用 OpenAI,需要准备 OpenAI API Key。
格式通常类似:
sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
如果使用兼容 OpenAI API 的服务,也需要准备对应平台的 Key,例如:
- Azure OpenAI;
- DeepSeek;
- Moonshot;
- 通义千问;
- 智谱 GLM;
- OpenRouter;
- SiliconFlow;
- 火山方舟等。
本文以兼容 OpenAI API 的部署方式为主。
五、服务器基础环境安装
使用 SSH 登录服务器:
ssh root@你的服务器IP
更新系统软件包:
apt update && apt upgrade -y
安装常用工具:
apt install -y curl wget git vim unzip ufw ca-certificates gnupg lsb-release
六、安装 Docker
1. 卸载旧版本 Docker
apt remove -y docker docker-engine docker.io containerd runc
2. 安装 Docker 官方依赖
apt install -y ca-certificates curl gnupg
创建 keyrings 目录:
install -m 0755 -d /etc/apt/keyrings
添加 Docker GPG Key:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \
gpg --dearmor -o /etc/apt/keyrings/docker.gpg
设置权限:
chmod a+r /etc/apt/keyrings/docker.gpg
添加 Docker 软件源:
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
tee /etc/apt/sources.list.d/docker.list > /dev/null
更新软件源:
apt update
安装 Docker:
apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
3. 验证 Docker 是否安装成功
docker version
查看 Docker Compose:
docker compose version
如果能正常显示版本号,说明 Docker 已安装完成。
七、创建部署目录
建议所有服务统一放到 /opt 目录下:
mkdir -p /opt/chatgpt-web
cd /opt/chatgpt-web
目录结构规划如下:
/opt/chatgpt-web
├── docker-compose.yml
├── .env
└── nginx
└── chatgpt.conf
创建 nginx 配置目录:
mkdir -p nginx
八、编写环境变量文件
在 /opt/chatgpt-web 下创建 .env 文件:
vim .env
示例配置如下:
# 站点访问密码,可选
# 如果不希望公开访问,建议设置访问密码
CODE=your_access_password
# OpenAI API Key
OPENAI_API_KEY=sk-your-api-key
# OpenAI API 地址
# 官方地址:
BASE_URL=https://api.openai.com
# 如果你使用的是兼容 OpenAI 的第三方平台,可以改成:
# BASE_URL=https://api.deepseek.com
# BASE_URL=https://openrouter.ai/api
# BASE_URL=https://api.moonshot.cn/v1
# 默认模型
DEFAULT_MODEL=gpt-4o-mini
# 是否隐藏用户 API Key 输入框
HIDE_USER_API_KEY=1
# 是否禁止用户自行设置模型
DISABLE_GPT4=0
# 应用端口
PORT=3000
说明:
| 配置项 | 说明 |
|---|---|
CODE |
访问密码,建议设置 |
OPENAI_API_KEY |
模型服务 API Key |
BASE_URL |
API 服务地址 |
DEFAULT_MODEL |
默认使用模型 |
HIDE_USER_API_KEY |
是否隐藏用户自定义 Key |
PORT |
容器内部监听端口 |
如果你只给自己使用,可以设置一个较复杂的 CODE,避免别人访问后消耗你的 API 额度。
九、编写 Docker Compose 配置文件
创建 docker-compose.yml:
vim docker-compose.yml
写入以下内容:
version: "3.8"
services:
chatgpt-web:
image: yidadaa/chatgpt-next-web:latest
container_name: chatgpt-web
restart: always
ports:
- "3000:3000"
env_file:
- .env
environment:
- CODE=${CODE}
- OPENAI_API_KEY=${OPENAI_API_KEY}
- BASE_URL=${BASE_URL}
- DEFAULT_MODEL=${DEFAULT_MODEL}
- HIDE_USER_API_KEY=${HIDE_USER_API_KEY}
- DISABLE_GPT4=${DISABLE_GPT4}
networks:
- chatgpt-net
networks:
chatgpt-net:
driver: bridge
该配置会拉取 chatgpt-next-web 镜像,并将容器的 3000 端口映射到宿主机 3000 端口。
启动服务:
docker compose up -d
查看容器状态:
docker ps
查看日志:
docker logs -f chatgpt-web
如果看到应用正常启动,说明容器运行成功。
十、测试本地端口访问
如果你的服务器安全组开放了 3000 端口,可以临时访问:
http://你的服务器IP:3000
如果无法访问,请检查:
- 容器是否运行;
- 服务器防火墙是否放行 3000;
- 云服务商安全组是否放行 3000;
- 应用日志是否有错误;
- API Key 是否填写正确。
为了安全起见,正式生产环境不建议直接暴露 3000 端口,而是通过 Nginx 反向代理到 HTTPS 域名。
十一、安装 Nginx
安装 Nginx:
apt install -y nginx
启动 Nginx:
systemctl start nginx
设置开机自启:
systemctl enable nginx
查看状态:
systemctl status nginx
如果显示 active running,说明 Nginx 正常运行。
十二、配置 Nginx 反向代理
创建 Nginx 配置文件:
vim /etc/nginx/sites-available/chatgpt.conf
写入以下内容:
server {
listen 80;
server_name chat.example.com;
client_max_body_size 20m;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
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;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 300s;
proxy_send_timeout 300s;
}
}
将配置文件启用:
ln -s /etc/nginx/sites-available/chatgpt.conf /etc/nginx/sites-enabled/chatgpt.conf
测试 Nginx 配置是否正确:
nginx -t
如果显示:
syntax is ok
test is successful
则重载 Nginx:
systemctl reload nginx
现在可以访问:
http://chat.example.com
如果正常打开页面,说明反向代理已经配置成功。
十三、配置 HTTPS 证书
生产环境强烈建议开启 HTTPS。
这里使用 Let's Encrypt 免费证书。
1. 安装 Certbot
apt install -y certbot python3-certbot-nginx
2. 申请 SSL 证书
执行:
certbot --nginx -d chat.example.com
按照提示输入邮箱并确认协议。
Certbot 会自动修改 Nginx 配置并启用 HTTPS。
完成后,可以访问:
https://chat.example.com
3. 测试证书自动续期
Let's Encrypt 证书有效期通常为 90 天,Certbot 会自动续期。可以手动测试:
certbot renew --dry-run
如果没有报错,说明自动续期正常。
十四、完整 Nginx HTTPS 配置示例
如果你希望手动维护 Nginx 配置,可以参考以下完整示例:
server {
listen 80;
server_name chat.example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name chat.example.com;
ssl_certificate /etc/letsencrypt/live/chat.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/chat.example.com/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
client_max_body_size 20m;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
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 https;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_buffering off;
proxy_cache off;
proxy_read_timeout 300s;
proxy_send_timeout 300s;
}
}
注意将 chat.example.com 替换为你的真实域名。
十五、防火墙与安全组配置
如果你使用 UFW 防火墙,可以执行:
ufw allow OpenSSH
ufw allow 80
ufw allow 443
ufw enable
查看状态:
ufw status
建议不要开放 3000 端口到公网。
如果之前开放过,可以关闭:
ufw deny 3000
同时在云服务器控制台安全组中,只放行:
22
80
443
其中:
22用于 SSH;80用于 HTTP 访问和证书签发;443用于 HTTPS 访问。
如果你有固定 IP,SSH 端口最好限制为仅允许自己的 IP 访问。
十六、更新 ChatGPT Web
当项目镜像有新版本时,可以执行:
cd /opt/chatgpt-web
docker compose pull
docker compose up -d
清理无用镜像:
docker image prune -f
查看新容器是否正常:
docker ps
docker logs -f chatgpt-web
十七、重启与停止服务
重启服务:
cd /opt/chatgpt-web
docker compose restart
停止服务:
docker compose down
重新启动:
docker compose up -d
查看日志:
docker logs -f chatgpt-web
十八、使用第三方兼容 OpenAI API 的模型
很多模型平台提供了兼容 OpenAI 格式的 API。通常只需要修改 .env 中的 BASE_URL、OPENAI_API_KEY 和 DEFAULT_MODEL。
1. 使用 DeepSeek 示例
OPENAI_API_KEY=sk-your-deepseek-key
BASE_URL=https://api.deepseek.com
DEFAULT_MODEL=deepseek-chat
2. 使用 Moonshot 示例
OPENAI_API_KEY=sk-your-moonshot-key
BASE_URL=https://api.moonshot.cn/v1
DEFAULT_MODEL=moonshot-v1-8k
3. 使用 OpenRouter 示例
OPENAI_API_KEY=sk-or-your-openrouter-key
BASE_URL=https://openrouter.ai/api/v1
DEFAULT_MODEL=openai/gpt-4o-mini
修改完成后重启容器:
cd /opt/chatgpt-web
docker compose restart
十九、推荐的生产环境配置
如果你是团队内部使用,建议配置如下:
CODE=一个复杂访问密码
OPENAI_API_KEY=你的服务端统一APIKey
BASE_URL=https://api.openai.com
DEFAULT_MODEL=gpt-4o-mini
HIDE_USER_API_KEY=1
DISABLE_GPT4=0
PORT=3000
同时建议:
- 开启 HTTPS;
- 不暴露 3000 端口;
- 设置访问密码;
- 定期查看 API 用量;
- 不要把 API Key 写到公开仓库;
- 限制服务器 SSH 登录 IP;
- 开启云服务商账单告警;
- 使用强密码或密钥登录服务器。
二十、常见问题排查
1. 页面打不开
检查容器是否启动:
docker ps
检查端口监听:
ss -tunlp | grep 3000
检查 Nginx 状态:
systemctl status nginx
检查 Nginx 配置:
nginx -t
查看日志:
docker logs -f chatgpt-web
tail -f /var/log/nginx/error.log
2. 提示 API Key 无效
常见原因:
- API Key 填写错误;
- API Key 已过期;
- API Key 没有余额;
- 使用了错误的 API 地址;
- 第三方平台模型名称填写错误;
- 服务商不支持当前模型。
解决方法:
- 登录模型服务商后台检查 Key;
- 确认账户余额;
- 确认 API endpoint;
- 修改
.env后重启容器。
3. 聊天时一直转圈
可能原因:
- Nginx 超时时间太短;
- API 服务响应慢;
- 网络无法访问模型服务;
- 容器环境变量未生效。
建议检查:
docker logs -f chatgpt-web
同时确认 Nginx 中存在:
proxy_read_timeout 300s;
proxy_send_timeout 300s;
proxy_buffering off;
4. 修改配置后不生效
如果你修改了 .env,需要重启容器:
cd /opt/chatgpt-web
docker compose down
docker compose up -d
仅 reload Nginx 不会让 Docker 容器重新读取 .env。
5. HTTPS 证书申请失败
检查:
- 域名是否解析到当前服务器;
- 80 端口是否开放;
- Nginx 是否正常运行;
- 是否有其他程序占用 80 端口;
- 云服务商安全组是否放行 80。
查看端口占用:
ss -tunlp | grep ':80'
二十一、备份与迁移
如果你只是使用基础 Docker 部署,一般需要备份以下文件:
/opt/chatgpt-web/docker-compose.yml
/opt/chatgpt-web/.env
/etc/nginx/sites-available/chatgpt.conf
备份命令示例:
tar -czvf chatgpt-web-backup.tar.gz \
/opt/chatgpt-web \
/etc/nginx/sites-available/chatgpt.conf
迁移到新服务器时:
- 安装 Docker;
- 安装 Nginx;
- 解压备份文件;
- 修改域名解析;
- 重新启动 Docker Compose;
- 重新申请或迁移 SSL 证书。
二十二、完整文件汇总
1. .env
CODE=your_access_password
OPENAI_API_KEY=sk-your-api-key
BASE_URL=https://api.openai.com
DEFAULT_MODEL=gpt-4o-mini
HIDE_USER_API_KEY=1
DISABLE_GPT4=0
PORT=3000
2. docker-compose.yml
version: "3.8"
services:
chatgpt-web:
image: yidadaa/chatgpt-next-web:latest
container_name: chatgpt-web
restart: always
ports:
- "127.0.0.1:3000:3000"
env_file:
- .env
environment:
- CODE=${CODE}
- OPENAI_API_KEY=${OPENAI_API_KEY}
- BASE_URL=${BASE_URL}
- DEFAULT_MODEL=${DEFAULT_MODEL}
- HIDE_USER_API_KEY=${HIDE_USER_API_KEY}
- DISABLE_GPT4=${DISABLE_GPT4}
networks:
- chatgpt-net
networks:
chatgpt-net:
driver: bridge
这里推荐使用:
ports:
- "127.0.0.1:3000:3000"
这样 3000 端口只监听本机,不直接暴露到公网,更安全。
3. Nginx HTTPS 配置
server {
listen 80;
server_name chat.example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name chat.example.com;
ssl_certificate /etc/letsencrypt/live/chat.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/chat.example.com/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
client_max_body_size 20m;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
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 https;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_buffering off;
proxy_cache off;
proxy_read_timeout 300s;
proxy_send_timeout 300s;
}
}
二十三、部署完成后的访问方式
部署完成后,在浏览器中访问:
https://chat.example.com
如果你配置了访问密码,首次使用时输入 .env 中的 CODE 即可。
之后你就可以像使用 ChatGPT 一样进行对话。
二十四、总结
本文完整介绍了如何在 Ubuntu 服务器上使用 Docker Compose 部署一个 ChatGPT Web 服务,并通过 Nginx 配置反向代理和 HTTPS 访问。
整体流程可以概括为:
准备服务器和域名
安装 Docker
创建部署目录
编写 .env 配置
编写 docker-compose.yml
启动 ChatGPT Web 容器
安装并配置 Nginx
申请 HTTPS 证书
测试访问
完成部署
对于个人或小团队来说,这种部署方式成本低、维护简单、扩展灵活。你既可以接入 OpenAI 官方 API,也可以根据实际需求切换到兼容 OpenAI API 的其他模型平台。
最后需要特别注意:API Key 一定不要泄露,访问入口也不要完全裸奔公开。建议至少配置访问密码、HTTPS 和服务器防火墙,并定期检查 API 消耗情况,避免产生不必要的费用。