本教程是社区贡献,不受Open WebUI团队支持。它仅作为如何为您的特定用例自定义Open WebUI的演示。想要贡献?请查看贡献教程。
使用Nginx配置HTTPS
确保用户与Open WebUI之间的安全通信至关重要。HTTPS(超文本传输安全协议)加密传输的数据,保护其免受窃听和篡改。通过将Nginx配置为反向代理,您可以无缝地为Open WebUI部署添加HTTPS,增强安全性和可信度。
本指南提供三种设置HTTPS的方法:
- 自签名证书:适用于开发和内部使用,使用docker。
- Let's Encrypt:适用于需要可信SSL证书的生产环境,使用docker。
- Windows+自签名:在Windows上进行开发和内部使用的简化说明,无需docker。
选择最适合您部署需求的方法。
- Nginx代理管理器
- Let's Encrypt
- 自签名
- Windows
Nginx代理管理器
Nginx代理管理器(NPM)允许您轻松管理反向代理并使用Let's Encrypt的有效SSL证书保护您的本地应用程序(如Open WebUI)。此设置启用HTTPS访问,这对于在许多移动浏览器上使用语音输入功能是必需的,因为它们的安全要求,而无需直接将应用程序的特定端口暴露到互联网。
前置条件
- 运行Docker和open-webui容器的家庭服务器。
- 域名(免费选项如DuckDNS或付费选项如Namecheap/GoDaddy)。
- Docker和DNS配置的基础知识。
步骤
-
为Nginx文件创建目录:
mkdir ~/nginx_config
cd ~/nginx_config -
使用Docker设置Nginx代理管理器:
nano docker-compose.yml
services:
app:
image: 'jc21/nginx-proxy-manager:latest'
restart: unless-stopped
ports:
- '80:80'
- '81:81'
- '443:443'
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
运行容器:
docker-compose up -d
-
配置DNS和域名:
- 登录您的域名提供商(例如DuckDNS)并创建域名。
- 将域名指向您的代理本地IP(例如192.168.0.6)。
- 如果使用DuckDNS,请从其仪表板获取API令牌。
以下是在 https://www.duckdns.org/domains 中操作的简单示例:
- 设置SSL证书:
- 在http://server_ip:81访问Nginx代理管理器。例如:
192.168.0.6:81
- 使用默认凭据登录(admin@example.com / changeme)。按要求更改它们。
- 转到SSL证书 → 添加SSL证书 → Let's Encrypt。
- 输入您的电子邮件和从DuckDNS获得的域名。一个域名包 含星号,另一个不包含。示例:
*.hello.duckdns.org
和hello.duckdns.org
。 - 选择使用DNS质询,选择DuckDNS,并粘贴您的API令牌。示例:
dns_duckdns_token=f4e2a1b9-c78d-e593-b0d7-67f2e1c9a5b8
- 同意Let's Encrypt条款并保存。如需要更改传播时间(120秒)。
- 创建代理主机:
- 对于每个服务(例如openwebui、nextcloud),转到主机 → 代理主机 → 添加代理主机。
- 填写域名(例如openwebui.hello.duckdns.org)。
- 将方案设置为HTTP(默认),启用
Websockets支持
并指向您的Docker IP(如果带有open-webui的docker与NGINX管理器在同一台计算机上运行,这将是之前的相同IP(示例:192.168.0.6
) - 选择之前生成的SSL证书,强制SSL,并启用HTTP/2。
- 将您的url添加到open-webui(否则会出现HTTPS错误):
- 转到您的open-webui → 管理面板 → 设置 → 常规
- 在Webhook URL文本字段中,输入您将通过Nginx反向代理连接到open-webui的URL。示例:
hello.duckdns.org
(这个不是必需的)或openwebui.hello.duckdns.org
(这个是必需的)。
访问WebUI:
通过HTTPS访问Open WebUI,地址为hello.duckdns.org
或openwebui.hello.duckdns.org
(根据您的设置方式)。
防火墙注意事项:请注意,本地防火墙软件(如Portmaster)可能会阻止内部Docker网络流量或所需端口。如果您遇到问题,请检查您的防火墙规则以确保允许此设置所需的通信。
Let's Encrypt
Let's Encrypt提供免费的SSL证书,受到大多数浏览器信任,适用于生产环境。
前置条件
- 系统上已安装Certbot。
- DNS记录已正确配置以指向您的服务器。
步骤
-
为Nginx文件创建目录:
mkdir -p conf.d ssl
-
创建Nginx配置文件:
conf.d/open-webui.conf
:server {
listen 80;
server_name your_domain_or_IP;
location / {
proxy_pass http://host.docker.internal:3000;
# 添加WebSocket支持(版本0.5.0及以上版本必需)
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
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_buffering off;
# (可选)增加最大请求大小以支持大附件和长音频消息
client_max_body_size 20M;
proxy_read_timeout 10m;
}
} -
简化的Let's Encrypt脚本:
enable_letsencrypt.sh
:#!/bin/bash
# 描述:使用Certbot获取和安装Let's Encrypt SSL证书的简化脚本。
DOMAIN="your_domain_or_IP"
EMAIL="your_email@example.com"
# 如果未安装Certbot则安装
if ! command -v certbot &> /dev/null; then
echo "未找到Certbot。正在安装..."
sudo apt-get update
sudo apt-get install -y certbot python3-certbot-nginx
fi
# 获取SSL证书
sudo certbot --nginx -d "$DOMAIN" --non-interactive --agree-tos -m "$EMAIL"
# 重新加载Nginx以应用更改
sudo systemctl reload nginx
echo "Let's Encrypt SSL证书已安装,Nginx已重新加载。"使脚本可执行:
chmod +x enable_letsencrypt.sh
-
更新Docker Compose配置:
将Nginx服务添加到您的
docker-compose.yml
:services:
nginx:
image: nginx:alpine
ports:
- "80:80"
- "443:443"
volumes:
- ./conf.d:/etc/nginx/conf.d
- ./ssl:/etc/nginx/ssl
depends_on:
- open-webui -
启动Nginx服务:
docker compose up -d nginx
-
运行Let's Encrypt脚本:
执行脚本以获取和安装SSL证书:
./enable_letsencrypt.sh
访问WebUI
通过HTTPS访问Open WebUI:
自签名证书
使用自签名证书适用于开发环境或内部使用,在这些场景中信任度不是关键问题。
步骤
-
为Nginx文件创建目录:
mkdir -p conf.d ssl
-
创建Nginx配置文件:
conf.d/open-webui.conf
:server {
listen 443 ssl;
server_name your_domain_or_IP;
ssl_certificate /etc/nginx/ssl/nginx.crt;
ssl_certificate_key /etc/nginx/ssl/nginx.key;
ssl_protocols TLSv1.2 TLSv1.3;
location / {
proxy_pass http://host.docker.internal:3000;
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_buffering off;
# (可选)增加最大请求大小以支持大附件和长音频消息
client_max_body_size 20M;
proxy_read_timeout 10m;
}
} -
生成自签名SSL证书:
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout ssl/nginx.key \
-out ssl/nginx.crt \
-subj "/CN=your_domain_or_IP" -
更新Docker Compose配置:
将Nginx服务添加到您的
docker-compose.yml
中:services:
nginx:
image: nginx:alpine
ports:
- "443:443"
volumes:
- ./conf.d:/etc/nginx/conf.d
- ./ssl:/etc/nginx/ssl
depends_on:
- open-webui -
启动Nginx服务:
docker compose up -d nginx
访问WebUI
通过HTTPS访问Open WebUI:
在Windows上不使用Docker而使用自签名证书和Nginx
对于基本的内部/开发安装,您可以使用nginx和自签名证书将Open WebUI代理到https,从而允许通过局域网使用麦克风输入等功能。(默认情况下,大多数浏览器不允许在不安全的非localhost URL上使用麦克风输入)
本指南假设您使用pip安装了Open WebUI并正在运行open-webui serve