本文最后更新于 2025-02-14,文章内容可能已经过时。

https://www.5ee.net/archives/cQC3ExV7

由于之前的过于繁琐,写一个快速精简版精简版,简化流程。
其实依旧不是特别精简,哈哈
当然,此教程写法将不再过于累赘,所有操作都使用编排或者1panel一键

环境:本地服务器,通过ddns映射到公网,1panel 反向代理和证书 提供主要功能,爱快 ddns和端口映射

  • 数据库- 带有pgvector插件的PostgreSQL数据库

  • s3存储 - minio

  • 鉴权- Logto

  • lobechat数据库版

安装pgvector数据库

编排

使用方式

  • 容器-编排-创建编排

  • 复制代码-命名-确认

代码

注释的地方根据需求更改

networks:
  1panel-network:
    external: true

services:
  pg17:
    container_name: pgvector17 #命名
    image: pgvector/pgvector:pg17  # 镜像
    ports:
      - "5432:5432" # 外部端口:容器端口
    restart: unless-stopped
    networks:
      - 1panel-network
    volumes:
      - /opt/1panel/apps/postgresql/pgvector17/data:/var/lib/postgresql/data:rw #持久化内存
    environment:
      - POSTGRES_USER=sky #数据库用户名
      - POSTGRES_PASSWORD=mypassword #数据库密码
      - PGDATA=/var/lib/postgresql/data

检测连接

查看日志

  • 容器-对应容器-日志

提示跟下面差不多,无报错则成功安装

PostgreSQL Database directory appears to contain a database; Skipping initialization

2025-02-07 02:29:34.991 UTC [1] LOG:  starting PostgreSQL 17.0 (Debian 17.0-1.pgdg120+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 12.2.0-14) 12.2.0, 64-bit
2025-02-07 02:29:34.991 UTC [1] LOG:  listening on IPv4 address "0.0.0.0", port 5432
2025-02-07 02:29:34.991 UTC [1] LOG:  listening on IPv6 address "::", port 5432
2025-02-07 02:29:34.993 UTC [1] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
2025-02-07 02:29:34.999 UTC [29] LOG:  database system was shut down at 2025-02-07 02:29:34 UTC
2025-02-07 02:29:35.008 UTC [1] LOG:  database system is ready to accept connections
2025-02-07 02:34:35.098 UTC [27] LOG:  checkpoint starting: time
2025-02-07 02:34:35.103 UTC [27] LOG:  checkpoint complete: wrote 3 buffers (0.0%); 0 WAL file(s) added, 0 removed, 0 recycled; write=0.002 s, sync=0.001 s, total=0.006 s; sync files=2, longest=0.001 s, average=0.001 s; distance=0 kB, estimate=0 kB; lsn=0/23377F0, redo lsn=0/2337798

连接远程服务器

通过1panel内置的数据库功能,添加远程服务器,点击有验证,是否可用(后面的一些组件使用的都是这个数据库)

  • 数据库-pgSQL-添加远程服务器

创建数据库

创建两个数据库,这个地方需要手动创建,必须要的操作,在鉴权和程序安装的位置需要用到数据库

  • mycasdoor 鉴权服务使用

  • mylobechat 主程序服务使用

支持 S3 协议的对象存储服务-minlO

如果你已经有了s3对象存储,可以跳过当前这个步骤

它的使用方式非常简单,我们只需要安装-创建,更改权限,和秘钥~

1panel一键安装

  • 应用商店-MinIO

  • 如果端口占用请修改端口

  • 端口外部访问 -安装

反向代理

每个人的环境不同,反向代理方式也略微有区别,但区别不大,这里我只提供我自己的方案,反向代理不明白的可以用AI辅助

我的方案是ddns,使用爱快软路由,

新建两个反向代理

使用1panel一键创建反向代理

#映射端口
#9000:49000
#9002:49002

server {
    listen 49000 ssl http2; #因为是非标准443,需要手动改nginx 端口ssl 应用证书,标准443 不需要
    server_name minio.5ee.net; 
#其他
}

#这个地方是我使用的本地服务器,ddns,很多种方式实现 会有些许区别

webui 反向代理

location ^~ / {
    proxy_pass http://127.0.0.1:9002; 
    proxy_set_header Host $http_host; 
    proxy_set_header X-Real-IP $remote_addr; 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    proxy_set_header REMOTE-HOST $remote_addr; 
    proxy_set_header Upgrade $http_upgrade; 
    proxy_set_header Connection "upgrade"; # 强制 Connection: upgrade
    proxy_set_header X-Forwarded-Proto $scheme; 
    proxy_http_version 1.1; 
    add_header X-Cache $upstream_cache_status; 
    add_header Cache-Control no-cache; 
}

api反向代理

location ^~ / {
    proxy_cache_convert_head off;
    proxy_pass http://127.0.0.1:9000; 
    proxy_set_header Host $http_host; 
    proxy_set_header X-Real-IP $remote_addr; 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    proxy_set_header REMOTE-HOST $remote_addr; 
    proxy_set_header Upgrade $http_upgrade; 
    proxy_set_header Connection $http_connection; 
    proxy_set_header X-Forwarded-Proto $scheme; 
}

注意事项

如果webui访问对象浏览器时出现wss 问题,设置好反向代理要重启nginx或者重启服务器(重载不行哦)

minIO配置

我这边并没有设置minIO相关的一些权限和高级使用方式,使用的是最基本的功能,有特殊需求的请自行解决

新建一个桶

  • Buckets-Create Bucket-输入Name-Create Bucket

给桶设置一个规则

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowPublicReadGetObject",
            "Effect": "Allow",
            "Principal": {
                "AWS": [
                    "*"
                ]
            },
            "Action": [
                "s3:GetObject"
            ],
            "Resource": [
                "arn:aws:s3:::lobechat/*"
            ]
        },
        {
            "Sid": "AllowPutObjectWithCredentials",
            "Effect": "Allow",
            "Principal": {
                "AWS": [
                    "*"
                ]
            },
            "Action": [
                "s3:PutObject"
            ],
            "Resource": [
                "arn:aws:s3:::lobechat/*"
            ]
        }
    ]
}

新建一个秘钥

Access Key:E4c8Q1iXg625sMBxxxx

Secret Key:hX7T0kGl0Pdg9v2B93DgvOk9Maxxxxxxxxxx

以下5个所需要的配置

  • ACCESS_KEY:E4c8Q1iXg625sxxx

  • SECRET_ACCESS_KEY:hX7T0kGl0Pdg9v2B93Dgxxxxxxxxxx

  • API域名:https://minio.5ee.net:49000

  • 桶名称 :lobechat

  • 访问域名:https://minio.5ee.net:49002

鉴权安装

这个地方我尝试了很多方案,选择私有化部署casdoor,(Logto的坑比较多,不是很建议)

或者使用一些cf github等云方案也是不错的选择,

编排

networks:
  1panel-network:
    external: true

services:
    mycasdoor:
        container_name: mycasdoor
        image: casbin/casdoor:latest 
        ports:
          - "8000:8000" # 端口映射:主机端口 8000 映射到容器端口 8000
        restart: unless-stopped
        networks:
          - 1panel-network
        environment:
          - RUNNING_IN_DOCKER=true
          - dataSourceName=user=mycasdoor password=3SD6a7iawN2NR3mh host=pgvector17 port=5432 sslmode=disable dbname=mycasdoor    # 用户名,密码,地址,端口,ssl,名称
          - dbName=mycasdoor
          - driverName=postgres
       

反向代理

标准的一键反向代理即可,不需要特殊设置

location ^~ / {
        proxy_pass http://127.0.0.1:8000;
        # WebSocket 支持 (如果 Casdoor 使用 WebSocket)
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        # 设置 Host 头部为 Casdoor 域名,确保 Casdoor 能够正确处理请求
        proxy_set_header Host $http_host;   # 或者指定为 l.5ee.net 如果有问题
        # 传递客户端真实 IP 地址
        proxy_set_header X-Real-IP $remote_addr;
        # 传递客户端请求的原始协议 (HTTP 或 HTTPS)
        proxy_set_header X-Forwarded-Proto $scheme;
        # 传递客户端请求的原始主机名
        proxy_set_header X-Forwarded-Host $http_host; # 或者 $http_host
        # 传递客户端请求的原始端口
        proxy_set_header X-Forwarded-Port $server_port;
}

配置

修改管理员账号密码

  • 用户管理-用户-编辑

  • 编辑密码

新建仅登录组织

这个是用来给你新建的lobechat应用注册登录赋予一个组织

  • 用户管理-组织-新建

  • 名称:login-only-org

  • 显示名称:仅限 用户登录组织

核心概念:

  • 默认应用 (app-built-in): 系统内置的后台管理应用。

  • 默认组织 (built-in): 你的管理员账户 (admin) 所属的初始组织。

权限问题:

当你将其他应用(如 LobeChat)与默认组织 (built-in) 关联时,会出现权限问题。由于 LobeChat 用户与管理员 (admin) 处于同一组织,他们不仅可以访问 LobeChat,还会获得与管理员相同的权限,从而能够登录后台管理应用 (app-built-in)。这是因为在同一个组织内,权限是共享的。

解决方案:

为了隔离权限,你需要为 LobeChat 创建一个全新的、空白的组织。将 LobeChat 应用关联到这个新组织。这样,LobeChat 用户将仅限于访问 LobeChat 应用,而无法访问后台管理应用 (app-built-in),因为它们现在属于不同的组织,权限不再共享。

新建应用

  • 身份认证-应用-添加

  • 名称:lobechat

  • 显示名称:lobechat

  • 客户端id:8c21ac206c67XXXXXXX(这个默认生成的待会要用)

  • 客户端秘钥:45a9498773004dccfc79855cff08a24XXXX(这个默认生成的待会要用)

  • 重定向url:https://lobechat.5ee.net:33210/api/auth/callback/casdoor

其他的参数根据所需自行设置,所需要的最基本只有这些

lobechat安装

LobeChat 身份验证服务设置 · LobeChat Docs · LobeHub

lobechat一些环境变量参数去官方查一下

编排

networks:
  1panel-network:
    external: true

services:
  mylobechat:
    container_name: mylobechat
    image: lobehub/lobe-chat-database:latest
    ports:
      - "3210:3210"
    restart: unless-stopped
    networks:
      - 1panel-network
    environment:
      - APP_URL=https://lobechat.5ee.net:33210 # 反向代理后访问的域名
      - KEY_VAULTS_SECRET='dvy9O/6gMcy8k7Jnfbb1mI8he03efDQ6m0iknR8XppQ=' 用于加密 会话令牌的密钥。您可以使用以下命令生成秘钥: openssl rand -base64 32.
      - DATABASE_URL=postgres://数据库用户名:数据库密码@pgvector17(数据库容器名,也可以使用ip等):5432/数据库名
      - NEXT_AUTH_SECRET=3904039cd41ea1bdf6c93db0db96e250 # 用于加密 会话令牌的密钥。您可以使用以下命令生成秘钥: openssl rand -base64 32.
      - NEXT_AUTH_SSO_PROVIDERS=casdoor # 鉴权类型
      - AUTH_CASDOOR_ID=8c21ac206c67XXXXX # 鉴权客户端id
      - AUTH_CASDOOR_SECRET=45a9498773004dccfcxxxx # 鉴权客户端秘钥
      - AUTH_CASDOOR_ISSUER=https://l.5ee.net:44448 # 鉴权访问域名
      - S3_ACCESS_KEY_ID=xxxx # minio key
      - S3_SECRET_ACCESS_KEY=xxxx # minio 秘钥
      - S3_BUCKET=lobechat # 桶名称
      - S3_ENDPOINT=https://minio.5ee.net:49000 # api访问域名
      - S3_PUBLIC_DOMAIN=https://minio.5ee.net:49000 # minio文件访问域名
      - S3_ENABLE_PATH_STYLE=1 # path组合方式,必须要的哦

反向代理

location ^~ / {
    proxy_pass http://10.255.255.243:3210; 
    proxy_redirect off; 
    proxy_set_header Host $http_host; 
    proxy_set_header X-Real-IP $remote_addr; 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    add_header Cache-Control no-cache; 
    proxy_ssl_server_name off; 
}