411257447-6f293c7f-47b4-47eb-9202-fe68a942d35b.png
411257447-6f293c7f-47b4-47eb-9202-fe68a942d35b.png

本文为您详细介绍如何在 群晖 NAS 上成功部署 Lobe-Chat 数据库版,并通过动态 DNS 域名 + 自定义端口实现安全访问。该方案特别解决了“使用域名+路由器端口映射时登录跳转失败”的常见问题,经过实际验证稳定运行。

✅ 适用场景:

  • 您已拥有一个支持 HTTPS 的动态 DNS 域名(如 demo.nas.com
  • 您希望通过非标准端口访问服务(如 2321028000
  • 希望通过 Nginx 反向代理实现 HTTPS 加密与安全访问
  • 遇到登录时报错或无响应问题,本教程可彻底解决

一、部署前准备:关键配置规划

在开始操作之前,请先完成以下信息确认和端口分配:

服务类型内网运行端口反向代理后对外端口访问地址(HTTPS)
Lobe-Chat Web 服务321023210https://demo.nas.com:23210
Casdoor 鉴权服务800028000https://demo.nas.com:28000
MinIO S3 API 服务900029000https://demo.nas.com:29000
MinIO 控制台 UI 服务900129001https://demo.nas.com:29001

💡 说明

  • 所有服务均运行于群晖 NAS 内网,通过 docker-compose 管理。
  • 外部访问将使用 域名 + 自定义端口 的方式,绕过 HTTP/HTTPS 默认 80/443 端口限制。
  • 若您已有 PostgreSQL 使用 5432 端口,请避免端口冲突,本教程将 Postgres 映射至 55432

二、部署阶段一:初始化项目目录并生成基础配置

  1. 在群晖命令行或终端工具中创建项目文件夹:
mkdir lobe-chat-db && cd lobe-chat-db
  1. 下载并运行官方一键部署脚本,选择「端口模式」(1),按提示输入您的域名 demo.nas.com
bash <(curl -fsSL https://lobe.li/setup.sh) -l zh_CN

📌 注意:

  • 脚本运行结束后,不要关闭终端窗口
  • 请保持该终端处于暂停状态(可新开一个会话继续操作)。
  • 此步为生成 .envdocker-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

✅ 修改要点:

  1. 所有 http:// 替换为 https://,端口按上文规划填写。
  2. 设置 MinIO 密码 MINIO_ROOT_PASSWORD 并保证其复杂性。
  3. 确保 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

  1. 访问 https://demo.nas.com:28000,使用脚本生成的管理员账号登录;
  2. 进入 身份认证 → 应用 列表,找到 LobeChat
  3. 点击「编辑」,在 重定向 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 与端口,确保一致性即可稳定运行。