本文为您详细介绍如何在 群晖 NAS 上成功部署 Lobe-Chat 数据库版,并通过动态 DNS 域名 + 自定义端口实现安全访问。该方案特别解决了“使用域名+路由器端口映射时登录跳转失败”的常见问题,经过实际验证稳定运行。
✅ 适用场景:
- 您已拥有一个支持 HTTPS 的动态 DNS 域名(如
demo.nas.com
)- 您希望通过非标准端口访问服务(如
23210
、28000
)- 希望通过 Nginx 反向代理实现 HTTPS 加密与安全访问
- 遇到登录时报错或无响应问题,本教程可彻底解决
一、部署前准备:关键配置规划
在开始操作之前,请先完成以下信息确认和端口分配:
服务类型 | 内网运行端口 | 反向代理后对外端口 | 访问地址(HTTPS) |
---|---|---|---|
Lobe-Chat Web 服务 | 3210 | 23210 | https://demo.nas.com:23210 |
Casdoor 鉴权服务 | 8000 | 28000 | https://demo.nas.com:28000 |
MinIO S3 API 服务 | 9000 | 29000 | https://demo.nas.com:29000 |
MinIO 控制台 UI 服务 | 9001 | 29001 | https://demo.nas.com:29001 |
💡 说明:
- 所有服务均运行于群晖 NAS 内网,通过 docker-compose 管理。
- 外部访问将使用 域名 + 自定义端口 的方式,绕过 HTTP/HTTPS 默认 80/443 端口限制。
- 若您已有 PostgreSQL 使用 5432 端口,请避免端口冲突,本教程将 Postgres 映射至
55432
。
二、部署阶段一:初始化项目目录并生成基础配置
- 在群晖命令行或终端工具中创建项目文件夹:
mkdir lobe-chat-db && cd lobe-chat-db
- 下载并运行官方一键部署脚本,选择「端口模式」(1),按提示输入您的域名
demo.nas.com
:
bash <(curl -fsSL https://lobe.li/setup.sh) -l zh_CN
📌 注意:
- 脚本运行结束后,不要关闭终端窗口。
- 请保持该终端处于暂停状态(可新开一个会话继续操作)。
- 此步为生成
.env
与docker-compose.yml
文件的初始步骤。
三、部署阶段二:核心配置修改与问题修复
(一)docker-compose.yml
文件关键修改
⚠️ 问题背景:
使用动态域名(如demo.nas.com
)访问时,Casdoor 无法正确响应 OAuth 登录跳转,出现“短暂无响应 → 超时异常”错误。
根本原因:容器内 DNS 无法解析外部域名,导致回调地址校验失败。
✅ 核心修复措施:添加 extra_hosts
解析映射
在 network-service
服务中,添加域名到局域网 IP 的静态解析项:
services:
network-service:
image: alpine
container_name: lobe-network
restart: always
ports:
- '${MINIO_PORT}:${MINIO_PORT}' # MinIO API (如 9000)
- '9001:9001' # MinIO Console
- '${CASDOOR_PORT}:${CASDOOR_PORT}' # Casdoor (如 8000)
- '${LOBE_PORT}:3210' # Lobe-Chat 主服务
command: tail -f /dev/null
extra_hosts:
# 关键修复:让容器能解析 demo.nas.com → 192.168.0.168
- "demo.nas.com:192.168.0.168"
🔍 补充说明:
extra_hosts
可强制指定容器内/etc/hosts
的解析规则。- 此设置确保 Casdoor 能正确识别
https://demo.nas.com:28000
为合法回调地址。- 若使用的是静态 IP(如
192.168.0.168
),请替换为您实际的 NAS 内网 IP。
(二).env
配置文件调整
确保 .env
文件中所有 URL 使用 HTTPS 模式,并设置 MinIO 密码:
# ===================
# ===== 预设配置 =====
# ===================
# 服务端口(内部映射)
LOBE_PORT=3210
CASDOOR_PORT=8000
MINIO_PORT=9000
# 外部访问地址(HTTPS + 自定义端口)
APP_URL=https://demo.nas.com:23210
AUTH_URL=https://demo.nas.com:23210/api/auth
# 数据库配置
LOBE_DB_NAME=lobechat
POSTGRES_PASSWORD=uWNZuhlfhexf8dxC
# Casdoor 鉴权服务
AUTH_CASDOOR_ISSUER=https://demo.nas.com:28000
AUTH_CASDOOR_ID=a387a41227719b1a5549
AUTH_CASDOOR_SECRET=47d9338d1176a92cdde9791a4065567d
# MinIO S3 配置
MINIO_ROOT_USER=admin
MINIO_ROOT_PASSWORD=<YOUR PASSWORD> # ← 设置密码
MINIO_LOBE_BUCKET=lobe
# MinIO 访问路径(完整 HTTPS 地址)
S3_PUBLIC_DOMAIN=https://demo.nas.com:29000
S3_ENDPOINT=https://demo.nas.com:29000
# Casdoor 附加配置
origin=https://demo.nas.com:28000
✅ 修改要点:
- 所有
http://
替换为https://
,端口按上文规划填写。- 设置 MinIO 密码
MINIO_ROOT_PASSWORD
并保证其复杂性。- 确保
AUTH_CASDOOR_ISSUER
与实际访问 URL 完全一致(含https://
和端口)。
四、部署阶段三:启动服务与日志检查
返回至之前未关闭的终端窗口,重新执行脚本剩余流程(按回车确认),自动完成以下操作:
- 生成 Casdoor 管理员账号
- 创建默认用户与密码
- 初始化数据库、存储桶等资源
完成后输入以下命令启动所有服务:
docker-compose up -d
查看日志以验证是否正常运行:
docker logs -f lobe-chat
✅ 成功日志示例:
[Database] Start to migration...
✅ database migration pass.
-------------------------------------
▲ Next.js 14.x.x
- Local: http://localhost:3210
- Network: http://0.0.0.0:3210
✓ Starting...
✓ Ready in 95ms
✅ 成功标志:看到 Ready in xx ms
且无报错日志。
五、反向代理配置:Nginx 全站 HTTPS 部署
为了实现真正的 HTTPS 安全访问,必须通过 Nginx 做反向代理。
创建 Nginx 配置文件
进入群晖 Nginx
目录,创建配置文件:
cd /etc/nginx/sites-enabled/
sudo nano lobe-chat.service.conf
粘贴以下完整配置内容(支持域名+端口、HTTPS 加密):
(一)LobeChat Web 服务反向代理(重要!)
# ================
# Lobe-Chat Web 服务 (https://demo.nas.com:23210)
# ================
server {
listen 23210 default_server;
server_name _;
return 403; # 禁止 IP 直接访问
}
server {
listen 23210 ssl http2;
server_name demo.nas.com;
# HTTPS 证书路径(群晖内置)
ssl_certificate /usr/syno/etc/certificate/system/default/fullchain.pem;
ssl_certificate_key /usr/syno/etc/certificate/system/default/privkey.pem;
# 安全协议与加密套件
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!3DES:!ADH:!RC4:!DH:!DHE;
# 非标准端口强制跳转 HTTPS
error_page 497 301 =307 https://$host:$server_port$request_uri;
# 封禁搜索引擎爬虫、恶意代理
if ($http_user_agent ~* "FeedDemon|Indy Library|Alexa Toolbar|AskTbFXTV|AhrefsBot|CrawlDaddy|CoolpadWebkit|Java|Feedly|UniversalFeedParser|ApacheBench|Microsoft URL Control|Swiftbot|ZmEu|oBot|jaunty|Python-urllib|lightDeckReports Bot|YYSpider|DigExt|HttpClient|MJ12bot|heritrix|EasouSpider|Ezooms|Baiduspider|360Spider|bingbot|Bytespider|YisouSpider|Googlebot|YandexBot|^$") {
return 403;
}
location / {
proxy_pass http://192.168.0.168:3210;
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;
}
}
(二)Casdoor 鉴权服务反向代理(关键!)
# ================
# Casdoor 鉴权服务 (https://demo.nas.com:28000)
# ================
server {
listen 28000 default_server;
server_name _;
return 403;
}
server {
listen 28000 ssl http2;
server_name demo.nas.com;
ssl_certificate /usr/syno/etc/certificate/system/default/fullchain.pem;
ssl_certificate_key /usr/syno/etc/certificate/system/default/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!3DES:!ADH:!RC4:!DH:!DHE;
error_page 497 301 =307 https://$host:$server_port$request_uri;
if ($http_user_agent ~* "FeedDemon|Indy Library|Alexa Toolbar|AskTbFXTV|AhrefsBot|CrawlDaddy|CoolpadWebkit|Java|Feedly|UniversalFeedParser|ApacheBench|Microsoft URL Control|Swiftbot|ZmEu|oBot|jaunty|Python-urllib|lightDeckReports Bot|YYSpider|DigExt|HttpClient|MJ12bot|heritrix|EasouSpider|Ezooms|Baiduspider|360Spider|bingbot|Bytespider|YisouSpider|Googlebot|YandexBot|^$") {
return 403;
}
location / {
proxy_pass http://192.168.0.168:8000;
proxy_http_version 1.1;
# 关键:必须保留原始 Host
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;
# 保证 OIDC 配置可被正确访问
proxy_cache_bypass $http_upgrade;
}
# 必须单独代理 .well-known/openid-configuration
location /.well-known/openid-configuration {
proxy_pass http://192.168.0.168:8000;
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;
}
}
(三)MinIO S3 服务反向代理
# ================
# MinIO API 服务 (https://demo.nas.com:29000)
# ================
server {
listen 29000 default_server;
server_name _;
return 403;
}
server {
listen 29000 ssl http2;
server_name demo.nas.com;
ssl_certificate /usr/syno/etc/certificate/system/default/fullchain.pem;
ssl_certificate_key /usr/syno/etc/certificate/system/default/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!3DES:!ADH:!RC4:!DH:!DHE;
error_page 497 301 =307 https://$host:$server_port$request_uri;
if ($http_user_agent ~* "FeedDemon|Indy Library|Alexa Toolbar|AskTbFXTV|AhrefsBot|CrawlDaddy|CoolpadWebkit|Java|Feedly|UniversalFeedParser|ApacheBench|Microsoft URL Control|Swiftbot|ZmEu|oBot|jaunty|Python-urllib|lightDeckReports Bot|YYSpider|DigExt|HttpClient|MJ12bot|heritrix|EasouSpider|Ezooms|Baiduspider|360Spider|bingbot|Bytespider|YisouSpider|Googlebot|YandexBot|^$") {
return 403;
}
# 支持大文件上传
client_max_body_size 0;
proxy_buffering off;
ignore_invalid_headers off;
location / {
proxy_pass http://192.168.0.168:9000;
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 Host $http_host;
# 提升连接稳定性
proxy_connect_timeout 300;
proxy_http_version 1.1;
proxy_set_header Connection "";
chunked_transfer_encoding off;
}
}
(四)MinIO S3 控制台 WebUI 服务反向代理(可选)
# ================
# MinIO 控制台服务 (https://demo.nas.com:29001)
# ================
server {
listen 29001 default_server;
server_name _;
return 403;
}
server {
listen 29001 ssl http2;
server_name demo.nas.com;
ssl_certificate /usr/syno/etc/certificate/system/default/fullchain.pem;
ssl_certificate_key /usr/syno/etc/certificate/system/default/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!3DES:!ADH:!RC4:!DH:!DHE;
error_page 497 301 =307 https://$host:$server_port$request_uri;
if ($http_user_agent ~* "FeedDemon|Indy Library|Alexa Toolbar|AskTbFXTV|AhrefsBot|CrawlDaddy|CoolpadWebkit|Java|Feedly|UniversalFeedParser|ApacheBench|Microsoft URL Control|Swiftbot|ZmEu|oBot|jaunty|Python-urllib|lightDeckReports Bot|YYSpider|DigExt|HttpClient|MJ12bot|heritrix|EasouSpider|Ezooms|Baiduspider|360Spider|bingbot|Bytespider|YisouSpider|Googlebot|YandexBot|^$") {
return 403;
}
location / {
proxy_pass http://192.168.6.12:9001;
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 Host $http_host;
# 提升连接稳定性
proxy_connect_timeout 300;
proxy_http_version 1.1;
proxy_set_header Connection "";
chunked_transfer_encoding off;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
💡 提示:将以上四部分配置合并为一个 lobe-chat.service.conf 文件保存。
在文件保存后,重载 Nginx 服务,使配置生效。
# 检测配置有效性,观察有无报错
nginx -t
# 若测试无报错则执行重载服务
sudo systemctl reload nginx
六、关键操作:更新 Casdoor 登录回调地址
由于我们使用的是 HTTPS + 自定义端口,必须手动更新 Casdoor 中 LobeChat 应用的 重定向 URL:
- 访问
https://demo.nas.com:28000
,使用脚本生成的管理员账号登录; - 进入 身份认证 → 应用 列表,找到
LobeChat
; - 点击「编辑」,在 重定向 URLs 字段中添加以下地址:
https://demo.nas.com:23210/api/auth/callback/casdoor
✅ 注意:此地址必须与.env
文件中APP_URL
一致。
保存并退出后,缓存清除等待 10 秒即可生效。
七、最终访问与验证
✅ 完成所有步骤后,打开浏览器输入:
https://demo.nas.com:23210
- 正常跳转至登录页面
- 使用脚本生成的用户名密码即可登录
- 一切功能正常工作
八、附加建议与参考文档
功能 | 推荐操作 |
---|---|
使用 MinIO 作为 Casdoor 头像存储 | 🔗 官方指南:使用 MinIO 存储头像 |
多设备访问 / 合并账户 | 可在 Casdoor 中配置多身份源登录 |
定期备份数据库与 S3 数据 | 建议使用群晖「计划任务」自动化备份 |
参考资料
✅ 本教程已完整覆盖从环境准备、配置修复、反向代理到最终上线的全过程,尤其针对“域名+端口映射失败”问题提供精准解决方案。
建议您根据自身网络环境调整 IP 与端口,确保一致性即可稳定运行。