├── .env.example ├── .gitignore ├── README.md ├── docker-compose.yaml ├── local ├── .env.example ├── README.md └── docker-compose.yaml └── localv2 ├── .env.example ├── docker-compose.yml └── init_data.json /.env.example: -------------------------------------------------------------------------------- 1 | # postgres 2 | PGUSER=postgres 3 | # The password for the default postgres user. 4 | POSTGRES_PASSWORD=lobechat666 5 | # The name of the default postgres database. 6 | POSTGRES_DB=lobechat 7 | # postgres data directory 8 | PGDATA=/var/lib/postgresql/data/pgdata 9 | 10 | # DB 必须 11 | KEY_VAULTS_SECRET=jgwsK28dspyVQoIf8/M3IIHl1h6LYYceSYNXeLpy6uk= 12 | DATABASE_URL=postgres://postgres:lobechat666@pg:5432/lobechat 13 | 14 | # NEXT_AUTH 相关 15 | NEXT_AUTH_SECRET=3904039cd41ea1bdf6c93db0db96e250 16 | NEXT_AUTH_SSO_PROVIDERS=auth0 17 | NEXTAUTH_URL=https://lobechat.org/api/auth 18 | AUTH0_CLIENT_ID=xxxxxx 19 | AUTH0_CLIENT_SECRET=cSX_xxxxx 20 | AUTH0_ISSUER=https://lobe-chat-demo.us.auth0.com 21 | 22 | # S3 相关 23 | S3_ACCESS_KEY_ID=xxxxxxxxxx 24 | S3_SECRET_ACCESS_KEY=xxxxxxxxxx 25 | S3_ENDPOINT=https://xxxxxxxxxx.r2.cloudflarestorage.com 26 | S3_BUCKET=lobechat 27 | NEXT_PUBLIC_S3_DOMAIN=https://s3-for-lobechat.your-domain.com -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .env 2 | local/.env 3 | local/data 4 | local/s3_data 5 | 6 | localv2/.env 7 | localv2/data 8 | localv2/s3_data -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # LobeChat Database Depoly 2 | 3 | > 支持数据库存储的 LobeChat 部署方案 4 | 5 | # 设置 auth0 6 | 7 | 参考 https://lobehub.com/zh/docs/self-hosting/advanced/auth/next-auth/auth0 8 | 9 | # 设置 cloudflare r2 10 | 11 | 参考 https://lobehub.com/zh/docs/self-hosting/advanced/s3/cloudflare-r2 12 | -------------------------------------------------------------------------------- /docker-compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | lobechat-db: 3 | image: lobehub/lobe-chat-database:v1.9.3 4 | restart: always 5 | env_file: .env 6 | ports: 7 | - 3210:3210 8 | networks: 9 | - lobedb 10 | depends_on: 11 | - pg 12 | 13 | # The postgres database. 14 | pg: 15 | image: postgres:15-alpine 16 | restart: always 17 | env_file: .env 18 | ports: 19 | - 5432:5432 20 | networks: 21 | - lobedb 22 | environment: 23 | PGUSER: ${PGUSER:-postgres} 24 | POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-lobechat666} 25 | POSTGRES_DB: ${POSTGRES_DB:-lobechat} 26 | PGDATA: ${PGDATA:-/var/lib/postgresql/data/pgdata} 27 | volumes: 28 | - ./volumes/db/data:/var/lib/postgresql/data 29 | healthcheck: 30 | test: ["CMD", "pg_isready"] 31 | interval: 1s 32 | timeout: 3s 33 | retries: 30 34 | networks: 35 | lobedb: 36 | -------------------------------------------------------------------------------- /local/.env.example: -------------------------------------------------------------------------------- 1 | # Logto secret 2 | AUTH_LOGTO_ID= 3 | AUTH_LOGTO_SECRET= 4 | 5 | # MinIO S3 配置 6 | # minio root 用户名,要求超过3个字符 7 | MINIO_ROOT_USER=admin 8 | # minio root 用户密码,要求超过8个字符 9 | MINIO_ROOT_PASSWORD=minio_admin_pass 10 | 11 | # 在下方配置 minio 中添加的桶,lobe为默认桶名,要和 minio 中的一致 12 | MINIO_LOBE_BUCKET=lobe 13 | # 替换成 minio 中的对应值 14 | S3_ACCESS_KEY_ID=minio_Access_Key 15 | S3_SECRET_ACCESS_KEY=minio_Secret_Key 16 | 17 | 18 | # Proxy,如果你需要的话(比如你使用 GitHub 作为鉴权服务提供商) 19 | # HTTP_PROXY=http://localhost:7890 20 | # HTTPS_PROXY=http://localhost:7890 21 | 22 | # 其他环境变量,视需求而定,可以参照客户端版本的环境变量配置,注意不要有 ACCESS_CODE 23 | # OPENAI_API_KEY=sk-xxxx 24 | # OPENAI_PROXY_URL=https://api.openai.com/v1 25 | # OPENAI_MODEL_LIST=... 26 | 27 | 28 | # ----- 相关配置 start ----- 29 | # 如没有特殊需要不用更改 30 | LOBE_PORT=3210 31 | LOGTO_PORT=3001 32 | MINIO_PORT=9000 33 | 34 | # Postgres 相关,也即 DB 必须的环境变量 35 | LOBE_DB_NAME=lobechat 36 | POSTGRES_PASSWORD=uWNZugjBqixf8dxC -------------------------------------------------------------------------------- /local/README.md: -------------------------------------------------------------------------------- 1 | # LobeChat Database 完全本地部署 2 | 3 | ![](https://github.com/alwqx/picx-images-hosting/raw/master/blog/2024/lobe-logo.969nnpc3dn.webp) 4 | 5 | ## 为什么部署 LobeChat Database 版本 6 | 7 | LobeChat 作为一款`界面美观`、`交互简洁`的大模型前端,非常适合作为 Ollama 运行本地大模型的前端交互界面使用。 8 | 9 | 非 database 版本的 LobeChat 将设置、对话数据存储到浏览器缓存 (IndexedDB) 中,如果清理了浏览器缓存,或者跨设备使用,则需要重新设置 LobeChat,必要时还要同步对话数据,**降低了使用的便利性**。 10 | 11 | 笔者在 2024 年 8 月份 [部署本地化的 LobeChat Database 服务](https://alwq.xyz/post/2024-08-07-lobechat-database-deploy/),但是鉴权服务还不支持本地部署。**由于大陆的网络原因**,使用的 auth0 鉴权服务经常失败。今天 (2024.9.22) 发现官方仓库支持完全本地部署的 LobeChat Database 版本了,于是开始重新部署,期间也踩了很多坑。这里记录下来仅供参考。 12 | 13 | 完全本地化部署的 LobeChat Database 已经达到`个人生产可用的级别`,**可以在个人笔记本、家庭服务器等单机环境中部署一套使用**。 14 | 15 | ## 概览 16 | 17 | 根据文档 [使用 Docker Compose 部署 LobeChat 服务端数据库版本](https://lobehub.com/zh/docs/self-hosting/server-database/docker-compose),想要完整的运行 LobeChat 数据库版本,你需要至少拥有如下 4 个服务: 18 | 19 | 1. LobeChat 数据库版本自身 20 | 2. 带有 PGVector 插件的 PostgreSQL 数据库 21 | 3. 支持 S3 协议的对象存储服务 22 | 4. 受 LobeChat 支持的 SSO 登录鉴权服务 23 | 24 | 这些服务可以通过`自建`或者`在线云服务组合搭配`,以满足不同层次的部署需求。本文中的本地环境,全部使用容器部署这些服务。它们的镜像版本如下: 25 | 26 | | 服务 | 镜像版本 | 27 | | :------------------------------------- | :--------------------------------------- | 28 | | LobeChat 数据库版本 | lobehub/lobe-chat-database:v1.19.21 | 29 | | 带有 PGVector 插件的 PostgreSQL 数据库 | pgvector/pgvector:pg16 | 30 | | 支持 S3 协议的对象存储服务 | minio/minio:RELEASE.2024-09-13T20-26-02Z | 31 | | LobeChat 支持的 SSO 登录鉴权服务 | svhd/logto:1.20 | 32 | 33 | 部署时会先跑起来所有服务,在 logto 和 minio 服务中生成鉴权等配置信息,更新到 LobeChat 容器的环境变量中,再重启 LobeChat 才最终部署完成。 34 | 35 | ## 启动全部服务 36 | 37 | 1. clone 代码仓库 38 | 39 | ```shell 40 | git clone https://github.com/dockerq/lobechat-database-deploy.git 41 | ``` 42 | 43 | 2. 进入代码仓库的 local 目录 44 | 45 | ```shell 46 | cd lobechat-database-deploy/local 47 | ``` 48 | 49 | 3. 拷贝`.env`配置文件 50 | 51 | ```shell 52 | cp .env.example .env 53 | ``` 54 | 55 | 4. 启动全部服务 56 | 57 | ```shell 58 | docker compose up -d 59 | [+] Running 6/6 60 | ✔ Network local_lobe-network Created 0.0s 61 | ✔ Container lobe-postgres Healthy 6.8s 62 | ✔ Container lobe-network Started 0.7s 63 | ✔ Container lobe-minio Started 0.2s 64 | ✔ Container lobe-logto Started 5.7s 65 | ✔ Container lobe-database Started 6.3s 66 | ``` 67 | 68 | ## 配置 Logto 69 | 70 | 打开浏览器,访问`http://localhost:3002`进入 Logto web ui 页面。 71 | 72 | ![](https://github.com/alwqx/picx-images-hosting/raw/master/blog/2024/lobe-local-1-logto-register.6t72zse1ix.webp) 73 | 74 | 点击`注册`,输入用户名和密码后,发现报错 **Internal server error**。 75 | 76 | 参考 Logto 开源代码仓库的 Issue [bug: Error on create a password](https://github.com/logto-io/logto/issues/6577#issuecomment-2359921567),在 Postgres 中执行: 77 | 78 | ```shell 79 | update sign_in_experiences set password_policy='{"rejects": {"pwned": false}}' where tenant_id='admin'; 80 | ``` 81 | 82 | 后可正常注册。 83 | 84 | 附:笔者没有按照上面的操作,而是多次点击注册按钮,竟然也成功了。 85 | 86 | ### 创建 Next.js (App Router) 87 | 88 | 创建一个 `Next.js (App Router)` 应用,添加以下配置: 89 | 90 | 1. 重定向 URI(Redirect URI) 为 `http://localhost:3210/api/auth/callback/logto` 91 | 2. 登出回调 URI (Post sign-out redirect URI) 为 `http://localhost:3210/` 92 | 93 | 点击“下一步”,可以看到`App ID` 和 `App secrets`,复制填入 .env 文件中对应的 AUTH_LOGTO_ID 和 AUTH_LOGTO_SECRET。 94 | 95 | ![](https://github.com/alwqx/picx-images-hosting/raw/master/blog/2024/20240922-lobe-local-3-logto-secret.8l01uptpi5.webp) 96 | 97 | ## 配置 MinIO S3 98 | 99 | 浏览器输入 `http://localhost:9001`,进入 MinIO WebUI,默认管理员账号密码在 .env 中: 100 | 101 | ```env 102 | # MinIO S3 配置 103 | # minio root 用户名,要求超过 3 个字符 104 | MINIO_ROOT_USER=admin 105 | # minio root 用户密码,要求超过 8 个字符 106 | MINIO_ROOT_PASSWORD=minio_admin_pass 107 | ``` 108 | 109 | 创建符合你的 .env 文件中 MINIO_LOBE_BUCKET 字段的桶,`默认为 lobe`。并更新 lobe 桶的访问策略为定制: 110 | 111 | ![](https://github.com/alwqx/picx-images-hosting/raw/master/blog/2024/20240922-lobe-local-4-minio-access-policy.5mnrr7qk1j.webp) 112 | 113 | 对应的 JSON 内容复制自 [Lobe 文档](https://lobehub.com/zh/docs/self-hosting/server-database/docker-compose#%E9%85%8D%E7%BD%AE-min-io-s-3)。 114 | 115 | 最后,创建一个新的访问密钥,将生成的 Access Key 和 Secret Key 填入你的 .env 文件中的 S3_ACCESS_KEY_ID 和 S3_SECRET_ACCESS_KEY 中。 116 | 117 | ## 重启 LobeChat 服务 118 | 119 | 经过上面 2 步,LobeChat 的鉴权、S3 配置项都填充了对应的值。这时重新启动 LobeChat 容器即可: 120 | 121 | 1. 停掉 lobe 服务 122 | 123 | ```shell 124 | docker compose down lobe 125 | [+] Running 2/1 126 | ✔ Container lobe-database Removed 10.1s 127 | ! Network local_lobe-network Resource is still in use 0.0s 128 | ``` 129 | 130 | 2. 重新启动 lobe 服务 131 | 132 | ```shell 133 | docker compose up -d lobe 134 | [+] Running 5/5 135 | ✔ Container lobe-postgres Healthy 1.1s 136 | ✔ Container lobe-network Running 0.0s 137 | ✔ Container lobe-logto Running 0.0s 138 | ✔ Container lobe-minio Running 0.0s 139 | ✔ Container lobe-database Started 1.2s 140 | ``` 141 | 142 | ## 大功告成 143 | 144 | 访问 `http://localhost:3210` 即可进入 LobeChat 的 web 界面。 145 | 146 | 点击页面左上角的头像,可以看到**登录/注册**按钮: 147 | 148 | ![](https://github.com/alwqx/picx-images-hosting/raw/master/blog/2024/20240922-lobe-local-5-login.9kg57wcn9j.webp) 149 | 150 | 点击后跳转到 Logto 的鉴权页面。**这时我们是第一次登录**,根据 Logto 提示创建用户后登录,就能正确进入 LobeChat Database 版本的前端,愉快使用 LobeChat 了~ 151 | 152 | ## 出现的相关问题 153 | 154 | ### Logto https 访问 155 | 156 | Logto 服务的 Admin Console,使用了 [Web Crypto API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Crypto_API),只能通过 https 协议或者 `http://localhost:3002`来访问。参考 [Logto doc | Quick Troubleshooting](https://docs.logto.io/docs/get-started/#quick-troubleshooting) 157 | 158 | ### Logto 注册失败 159 | 160 | 本文使用的 Logto 镜像是`svhd/logto:1.20` 1.20 版本,还存在一些 bug。比如默认注册用户报错 **Internal server error** 161 | 162 | 参考 Logto 官方 Issue [bug: Error on create a password](https://github.com/logto-io/logto/issues/6577#issuecomment-2359921567) 解决。 163 | 164 | ### LobeChat 端口 165 | 166 | LobeChat 容器中暴露的 3210 端口不要轻易改动,会导致 LobeChat 内部代码 tRPC 因为容器映射的端口改变导致建连失败。 167 | 168 | ### LobeChat 使用自定义嵌入模型 169 | 170 | 当前不支持使用 ollama 推理的嵌入模型,只能用系统默认的 OpenAI 的嵌入模型。 171 | 172 | - [[Request] 内嵌功能适配 Azure OpenAI](https://github.com/lobehub/lobe-chat/issues/4017) 173 | 174 | ### LobeChat 使用新的本地 ZITADEL 鉴权 175 | 176 | 详情见 [[Request] 提供一个 ZITADEL 身份验证服务本地部署参考](https://github.com/lobehub/lobe-chat/issues/4060) 177 | -------------------------------------------------------------------------------- /local/docker-compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | network-service: 3 | image: alpine:3.20 4 | container_name: lobe-network 5 | ports: 6 | - "${MINIO_PORT}:${MINIO_PORT}" # MinIO API 7 | - "9001:9001" # MinIO Console 8 | - "${LOGTO_PORT}:${LOGTO_PORT}" # Logto 9 | - "3002:3002" # Logto Admin 10 | - "${LOBE_PORT}:3210" # LobeChat 11 | command: tail -f /dev/null 12 | networks: 13 | - lobe-network 14 | 15 | postgresql: 16 | image: pgvector/pgvector:pg16 17 | container_name: lobe-postgres 18 | ports: 19 | - "5432:5432" 20 | volumes: 21 | - "./data:/var/lib/postgresql/data" 22 | environment: 23 | - "POSTGRES_DB=${LOBE_DB_NAME}" 24 | - "POSTGRES_PASSWORD=${POSTGRES_PASSWORD}" 25 | healthcheck: 26 | test: ["CMD-SHELL", "pg_isready -U postgres"] 27 | interval: 5s 28 | timeout: 5s 29 | retries: 5 30 | restart: always 31 | networks: 32 | - lobe-network 33 | 34 | minio: 35 | image: minio/minio:RELEASE.2024-09-13T20-26-02Z 36 | container_name: lobe-minio 37 | network_mode: "service:network-service" 38 | volumes: 39 | - "./s3_data:/etc/minio/data" 40 | environment: 41 | - "MINIO_ROOT_USER=${MINIO_ROOT_USER}" 42 | - "MINIO_ROOT_PASSWORD=${MINIO_ROOT_PASSWORD}" 43 | - "MINIO_API_CORS_ALLOW_ORIGIN=http://localhost:${LOBE_PORT}" 44 | restart: always 45 | command: > 46 | server /etc/minio/data --address ":${MINIO_PORT}" --console-address ":9001" 47 | 48 | logto: 49 | image: svhd/logto:1.20 50 | container_name: lobe-logto 51 | network_mode: "service:network-service" 52 | depends_on: 53 | postgresql: 54 | condition: service_healthy 55 | environment: 56 | - "TRUST_PROXY_HEADER=false" 57 | - "PORT=${LOGTO_PORT}" 58 | - "DB_URL=postgresql://postgres:${POSTGRES_PASSWORD}@postgresql:5432/logto" 59 | - "ENDPOINT=http://localhost:${LOGTO_PORT}" 60 | - "ADMIN_ENDPOINT=http://localhost:3002" 61 | entrypoint: ["sh", "-c", "npm run cli db seed -- --swe && npm start"] 62 | 63 | lobe: 64 | image: lobehub/lobe-chat-database:v1.19.21 65 | container_name: lobe-database 66 | network_mode: "service:network-service" 67 | depends_on: 68 | postgresql: 69 | condition: service_healthy 70 | network-service: 71 | condition: service_started 72 | minio: 73 | condition: service_started 74 | logto: 75 | condition: service_started 76 | 77 | environment: 78 | - "APP_URL=http://localhost:${LOBE_PORT}" 79 | - "NEXT_AUTH_SSO_PROVIDERS=logto" 80 | - "KEY_VAULTS_SECRET=Kix2wcUONd4CX51E/ZPAd36BqM4wzJgKjPtz2sGztqQ=" 81 | - "NEXT_AUTH_SECRET=NX2kaPE923dt6BL2U8e9oSre5RfoT7hg" 82 | - "NEXTAUTH_URL=http://localhost:${LOBE_PORT}/api/auth" 83 | - "LOGTO_ISSUER=http://localhost:${LOGTO_PORT}/oidc" 84 | - "DATABASE_URL=postgresql://postgres:${POSTGRES_PASSWORD}@postgresql:5432/${LOBE_DB_NAME}" 85 | - "S3_ENDPOINT=http://localhost:${MINIO_PORT}" 86 | - "S3_BUCKET=${MINIO_LOBE_BUCKET}" 87 | - "S3_PUBLIC_DOMAIN=http://localhost:${MINIO_PORT}" 88 | - "S3_ENABLE_PATH_STYLE=1" 89 | env_file: 90 | - .env 91 | restart: always 92 | 93 | volumes: 94 | data: 95 | driver: local 96 | s3_data: 97 | driver: local 98 | 99 | networks: 100 | lobe-network: 101 | driver: bridge 102 | -------------------------------------------------------------------------------- /localv2/.env.example: -------------------------------------------------------------------------------- 1 | # Proxy,如果你需要的话(比如你使用 GitHub 作为鉴权服务提供商) 2 | # HTTP_PROXY=http://localhost:7890 3 | # HTTPS_PROXY=http://localhost:7890 4 | 5 | 6 | # 其他环境变量,视需求而定,可以参照客户端版本的环境变量配置,注意不要有 ACCESS_CODE 7 | # OPENAI_API_KEY=sk-xxxx 8 | # OPENAI_PROXY_URL=https://api.openai.com/v1 9 | # OPENAI_MODEL_LIST=... 10 | 11 | 12 | # =================== 13 | # ===== 预设配置 ===== 14 | # =================== 15 | # 如没有特殊需要不用更改 16 | LOBE_PORT=23210 17 | CASDOOR_PORT=28000 18 | MINIO_PORT=29000 19 | APP_URL=http://127.0.0.1:23210 20 | AUTH_URL=http://127.0.0.1:23210/api/auth 21 | 22 | # Postgres 相关,也即 DB 必须的环境变量 23 | LOBE_DB_NAME=lobechat 24 | POSTGRES_PASSWORD=uWNZugjBqixf8dxC 25 | 26 | NEXTAUTH_URL=http://localhost:${LOBE_PORT}/api/auth 27 | NEXT_AUTH_SECRET=3904039cd41ea1bdf6c93db0db96e250 28 | NEXT_AUTH_SSO_PROVIDERS=casdoor 29 | AUTH_CASDOOR_ISSUER=http://127.0.0.1:28000 30 | # Casdoor secret 31 | AUTH_CASDOOR_ID=a387a4892ee19b1a2249 32 | AUTH_CASDOOR_SECRET=4998afdb63806714b0511a05c660d0e2 33 | 34 | # MinIO S3 配置 35 | MINIO_ROOT_USER=admin 36 | MINIO_ROOT_PASSWORD=1b60ad28 37 | 38 | # 在下方配置 minio 中添加的桶 39 | S3_PUBLIC_DOMAIN=http://127.0.0.1:29000 40 | S3_ENDPOINT=http://127.0.0.1:29000 41 | MINIO_LOBE_BUCKET=lobe 42 | 43 | # 为 casdoor 配置 44 | origin=http://127.0.0.1:28000 -------------------------------------------------------------------------------- /localv2/docker-compose.yml: -------------------------------------------------------------------------------- 1 | name: lobe-chat-database 2 | services: 3 | network-service: 4 | image: alpine:3.20 5 | container_name: lobedb-network 6 | ports: 7 | - "${MINIO_PORT}:${MINIO_PORT}" # MinIO API 8 | - "9001:9001" # MinIO Console 9 | - "${LOBE_PORT}:3210" # LobeChat 10 | command: tail -f /dev/null 11 | networks: 12 | - lobedb-network 13 | 14 | postgresql: 15 | image: pgvector/pgvector:pg16 16 | container_name: lobedb-postgres 17 | ports: 18 | - "5432:5432" 19 | volumes: 20 | - "./data:/var/lib/postgresql/data" 21 | environment: 22 | - "POSTGRES_DB=${LOBE_DB_NAME}" 23 | - "POSTGRES_PASSWORD=${POSTGRES_PASSWORD}" 24 | healthcheck: 25 | test: ["CMD-SHELL", "pg_isready -U postgres"] 26 | interval: 5s 27 | timeout: 5s 28 | retries: 5 29 | restart: always 30 | networks: 31 | - lobedb-network 32 | 33 | minio: 34 | image: minio/minio:RELEASE.2025-02-03T21-03-04Z 35 | container_name: lobedb-minio 36 | network_mode: "service:network-service" 37 | volumes: 38 | - "./s3_data:/etc/minio/data" 39 | environment: 40 | - "MINIO_API_CORS_ALLOW_ORIGIN=*" 41 | env_file: 42 | - .env 43 | restart: always 44 | entrypoint: > 45 | /bin/sh -c " 46 | minio server /etc/minio/data --address ':${MINIO_PORT}' --console-address ':9001' & 47 | MINIO_PID=\$! 48 | while ! curl -s http://localhost:${MINIO_PORT}/minio/health/live; do 49 | echo 'Waiting for MinIO to start...' 50 | sleep 1 51 | done 52 | sleep 5 53 | mc alias set myminio http://localhost:${MINIO_PORT} ${MINIO_ROOT_USER} ${MINIO_ROOT_PASSWORD} 54 | echo 'Creating bucket ${MINIO_LOBE_BUCKET}' 55 | mc mb myminio/${MINIO_LOBE_BUCKET} 56 | wait \$MINIO_PID 57 | " 58 | 59 | casdoor: 60 | image: casbin/casdoor:v1.822.0 61 | container_name: lobedb-casdoor 62 | entrypoint: /bin/sh -c './server --createDatabase=true' 63 | ports: 64 | - "${CASDOOR_PORT}:8000" # Casdoor 65 | depends_on: 66 | postgresql: 67 | condition: service_healthy 68 | environment: 69 | RUNNING_IN_DOCKER: "true" 70 | driverName: "postgres" 71 | dataSourceName: "user=postgres password=${POSTGRES_PASSWORD} host=postgresql port=5432 sslmode=disable dbname=casdoor" 72 | runmode: "dev" 73 | volumes: 74 | - ./init_data.json:/init_data.json 75 | networks: 76 | - lobedb-network 77 | env_file: 78 | - .env 79 | 80 | lobe: 81 | image: lobehub/lobe-chat-database:1.62.3 82 | container_name: lobedb-chat 83 | network_mode: "service:network-service" 84 | depends_on: 85 | postgresql: 86 | condition: service_healthy 87 | network-service: 88 | condition: service_started 89 | minio: 90 | condition: service_started 91 | casdoor: 92 | condition: service_started 93 | 94 | environment: 95 | - "KEY_VAULTS_SECRET=Kix2wcUONd4CX51E/ZPAd36BqM4wzJgKjPtz2sGztqQ=" 96 | - "NEXT_AUTH_SECRET=NX2kaPE923dt6BL2U8e9oSre5RfoT7hg" 97 | - "DATABASE_URL=postgresql://postgres:${POSTGRES_PASSWORD}@postgresql:5432/${LOBE_DB_NAME}" 98 | - "S3_BUCKET=${MINIO_LOBE_BUCKET}" 99 | - "S3_ENABLE_PATH_STYLE=1" 100 | - "S3_ACCESS_KEY=${MINIO_ROOT_USER}" 101 | - "S3_ACCESS_KEY_ID=${MINIO_ROOT_USER}" 102 | - "S3_SECRET_ACCESS_KEY=${MINIO_ROOT_PASSWORD}" 103 | - "LLM_VISION_IMAGE_USE_BASE64=1" 104 | env_file: 105 | - .env 106 | restart: always 107 | 108 | volumes: 109 | data: 110 | driver: local 111 | s3_data: 112 | driver: local 113 | 114 | networks: 115 | lobedb-network: 116 | driver: bridge 117 | -------------------------------------------------------------------------------- /localv2/init_data.json: -------------------------------------------------------------------------------- 1 | { 2 | "adapters": [ 3 | { 4 | "owner": "built-in", 5 | "name": "user-adapter-built-in", 6 | "createdTime": "2024-09-09T09:26:13Z", 7 | "table": "casbin_user_rule", 8 | "useSameDb": true, 9 | "type": "", 10 | "databaseType": "", 11 | "host": "", 12 | "port": 0, 13 | "user": "", 14 | "password": "", 15 | "database": "" 16 | }, 17 | { 18 | "owner": "built-in", 19 | "name": "api-adapter-built-in", 20 | "createdTime": "2024-09-09T09:26:12Z", 21 | "table": "casbin_api_rule", 22 | "useSameDb": true, 23 | "type": "", 24 | "databaseType": "", 25 | "host": "", 26 | "port": 0, 27 | "user": "", 28 | "password": "", 29 | "database": "" 30 | } 31 | ], 32 | "applications": [ 33 | { 34 | "owner": "admin", 35 | "name": "lobechat", 36 | "createdTime": "2024-09-09T09:26:06Z", 37 | "displayName": "LobeChat", 38 | "logo": "https://lobehub.com/icon-192x192.png", 39 | "homepageUrl": "https://lobehub.com", 40 | "description": "LobeChat", 41 | "organization": "lobechat", 42 | "cert": "cert-built-in", 43 | "headerHtml": "", 44 | "enablePassword": true, 45 | "enableSignUp": true, 46 | "enableSigninSession": false, 47 | "enableAutoSignin": false, 48 | "enableCodeSignin": false, 49 | "enableSamlCompress": false, 50 | "enableSamlC14n10": false, 51 | "enableSamlPostBinding": false, 52 | "enableWebAuthn": false, 53 | "enableLinkWithEmail": true, 54 | "orgChoiceMode": "", 55 | "samlReplyUrl": "", 56 | "providers": [], 57 | "signinMethods": [ 58 | { 59 | "name": "Password", 60 | "displayName": "Password", 61 | "rule": "All" 62 | } 63 | ], 64 | "signupItems": [ 65 | { 66 | "name": "ID", 67 | "visible": false, 68 | "required": true, 69 | "prompted": false, 70 | "customCss": "", 71 | "label": "", 72 | "placeholder": "", 73 | "regex": "", 74 | "rule": "Random" 75 | }, 76 | { 77 | "name": "Username", 78 | "visible": true, 79 | "required": true, 80 | "prompted": false, 81 | "customCss": "", 82 | "label": "", 83 | "placeholder": "", 84 | "regex": "", 85 | "rule": "None" 86 | }, 87 | { 88 | "name": "Display name", 89 | "visible": true, 90 | "required": true, 91 | "prompted": false, 92 | "customCss": "", 93 | "label": "", 94 | "placeholder": "", 95 | "regex": "", 96 | "rule": "None" 97 | }, 98 | { 99 | "name": "Password", 100 | "visible": true, 101 | "required": true, 102 | "prompted": false, 103 | "customCss": "", 104 | "label": "", 105 | "placeholder": "", 106 | "regex": "", 107 | "rule": "None" 108 | }, 109 | { 110 | "name": "Confirm password", 111 | "visible": true, 112 | "required": true, 113 | "prompted": false, 114 | "customCss": "", 115 | "label": "", 116 | "placeholder": "", 117 | "regex": "", 118 | "rule": "None" 119 | }, 120 | { 121 | "name": "Signup button", 122 | "visible": true, 123 | "required": false, 124 | "prompted": false, 125 | "customCss": "", 126 | "label": "", 127 | "placeholder": "", 128 | "regex": "", 129 | "rule": "" 130 | } 131 | ], 132 | "signinItems": [ 133 | { 134 | "name": "Back button", 135 | "visible": true, 136 | "label": "", 137 | "customCss": ".back-button {\n top: 65px;\n left: 15px;\n position: absolute;\n}\n.back-inner-button{}", 138 | "placeholder": "", 139 | "rule": "None", 140 | "isCustom": false 141 | }, 142 | { 143 | "name": "Languages", 144 | "visible": true, 145 | "label": "", 146 | "customCss": ".login-languages {\n top: 55px;\n right: 5px;\n position: absolute;\n}", 147 | "placeholder": "", 148 | "rule": "None", 149 | "isCustom": false 150 | }, 151 | { 152 | "name": "Logo", 153 | "visible": true, 154 | "label": "", 155 | "customCss": ".login-logo-box {} \n.panel-logo {\n width: 80px;\n}", 156 | "placeholder": "", 157 | "rule": "None", 158 | "isCustom": false 159 | }, 160 | { 161 | "name": "Signin methods", 162 | "visible": true, 163 | "label": "", 164 | "customCss": ".signin-methods {}", 165 | "placeholder": "", 166 | "rule": "None", 167 | "isCustom": false 168 | }, 169 | { 170 | "name": "Username", 171 | "visible": true, 172 | "label": "", 173 | "customCss": ".login-username {}\n.login-username-input{}", 174 | "placeholder": "", 175 | "rule": "None", 176 | "isCustom": false 177 | }, 178 | { 179 | "name": "Password", 180 | "visible": true, 181 | "label": "", 182 | "customCss": ".login-password {}\n.login-password-input{}", 183 | "placeholder": "", 184 | "rule": "None", 185 | "isCustom": false 186 | }, 187 | { 188 | "name": "Agreement", 189 | "visible": true, 190 | "label": "", 191 | "customCss": ".login-agreement {}", 192 | "placeholder": "", 193 | "rule": "None", 194 | "isCustom": false 195 | }, 196 | { 197 | "name": "Forgot password?", 198 | "visible": true, 199 | "label": "", 200 | "customCss": ".login-forget-password {\n display: inline-flex;\n justify-content: space-between;\n width: 320px;\n margin-bottom: 25px;\n}", 201 | "placeholder": "", 202 | "rule": "None", 203 | "isCustom": false 204 | }, 205 | { 206 | "name": "Login button", 207 | "visible": true, 208 | "label": "", 209 | "customCss": ".login-button-box {\n margin-bottom: 5px;\n}\n.login-button {\n width: 100%;\n}", 210 | "placeholder": "", 211 | "rule": "None", 212 | "isCustom": false 213 | }, 214 | { 215 | "name": "Signup link", 216 | "visible": true, 217 | "label": "", 218 | "customCss": ".login-signup-link {\n margin-bottom: 24px;\n display: flex;\n justify-content: end;\n}", 219 | "placeholder": "", 220 | "rule": "None", 221 | "isCustom": false 222 | }, 223 | { 224 | "name": "Providers", 225 | "visible": true, 226 | "label": "", 227 | "customCss": ".provider-img {\n width: 30px;\n margin: 5px;\n}\n.provider-big-img {\n margin-bottom: 10px;\n}", 228 | "placeholder": "", 229 | "rule": "small", 230 | "isCustom": false 231 | } 232 | ], 233 | "grantTypes": [ 234 | "authorization_code" 235 | ], 236 | "organizationObj": null, 237 | "certPublicKey": "", 238 | "tags": [], 239 | "samlAttributes": null, 240 | "isShared": false, 241 | "clientId": "a387a4892ee19b1a2249", 242 | "clientSecret": "fd8ea58a193fa63aefc1263967557d36", 243 | "redirectUris": [ 244 | "http://192.168.6.116:23210/api/auth/callback/casdoor", 245 | "https://192.168.6.116:23210/api/auth/callback/casdoor", 246 | "http://example.com/api/auth/callback/casdoor", 247 | "https://example.com/api/auth/callback/casdoor" 248 | ], 249 | "tokenFormat": "JWT", 250 | "tokenSigningMethod": "", 251 | "tokenFields": [], 252 | "expireInHours": 168, 253 | "refreshExpireInHours": 0, 254 | "signupUrl": "", 255 | "signinUrl": "", 256 | "forgetUrl": "", 257 | "affiliationUrl": "", 258 | "termsOfUse": "", 259 | "signupHtml": "", 260 | "signinHtml": "", 261 | "themeData": null, 262 | "footerHtml": "", 263 | "formCss": "", 264 | "formCssMobile": "", 265 | "formOffset": 2, 266 | "formSideHtml": "", 267 | "formBackgroundUrl": "", 268 | "failedSigninLimit": 5, 269 | "failedSigninFrozenTime": 15 270 | } 271 | ], 272 | "certs": [ 273 | { 274 | "owner": "admin", 275 | "name": "cert-built-in", 276 | "createdTime": "2024-09-09T09:26:06Z", 277 | "displayName": "Built-in Cert", 278 | "scope": "JWT", 279 | "type": "x509", 280 | "cryptoAlgorithm": "RS256", 281 | "bitSize": 4096, 282 | "expireInYears": 20, 283 | "certificate": "-----BEGIN CERTIFICATE-----\nMIIE3TCCAsWgAwIBAgIDAeJAMA0GCSqGSIb3DQEBCwUAMCgxDjAMBgNVBAoTBWFk\nbWluMRYwFAYDVQQDEw1jZXJ0LWJ1aWx0LWluMB4XDTI0MDkwOTA5MjYxMVoXDTQ0\nMDkwOTA5MjYxMVowKDEOMAwGA1UEChMFYWRtaW4xFjAUBgNVBAMTDWNlcnQtYnVp\nbHQtaW4wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC3EnylZ2VurCm4\ngVtZHBUw67qvuKoYuU9whqaJr2UQEboIX4ca+FtZCjDgcBoD80lwSoYrcKpTG+DI\nVEMDznUHOjKwongRWclV1jeE3jZqObtmG9872yt/WX+nxQLyDrk+nUGhci6Qrhgo\nYToN1DYaMqMV1Pi8catx8S0W3gg+ilb9mG3xdFpQo89o84mJhajTE/5/0jBuQ50D\nx8CRolpRWjZ6i9RNVfFQglei+aW0RNf1PY6RqMkxc/Hy0XwXf/bjM5Ax7Aajwteh\nx0Q1zeUaRMMhFu6REtz345oJdLJpUkpFwJN4dPQ35a0tqnjkD1MLZjvBhSgOt5IP\nAJA1HmcR83RMBS8B3iV6y/clPjr02cjyasORy+kL/aFMfZfwvuRWX1NqRE99+rUT\nlPszH2SQi7PCUItQK72nnMYWBMXgyS8/Mra48q7LDAB/ZQnWuEG1+P1SdsQUWM2U\naxkgjmfMNATVAgufrLOcOZDxAwVS7+quCF5f/QPTWaFqz5ofcpoUlf0iriv/k1mi\nl7OghX0eqyLI2cCSma+dgB1eMni91eDCLVRT25mGDYreFjkpAwpMx2uaBk5e6ffT\n2jmZ2Zp9iCrUomLXDNiwY2wZDClcDKFiHNhNPAN3IbvBC3c6qpt0dLsWvGYW2IQT\nTnI71r/YY1XN/mTa4t/zwI+/kghjMQIDAQABoxAwDjAMBgNVHRMBAf8EAjAAMA0G\nCSqGSIb3DQEBCwUAA4ICAQBJUMBYJXnNihlGA2NMFIZMlsnW+5tjUqqK/Pv+oSpt\nrqZxwDKFZL0NMxd4pVnLxIdU5HEcN2e01Xyqlaf5Tm3BZN6MaRVZAIRVfvxcNESQ\nYA0jSFjsJzZUFGIQf8P9a5u+7qqSmj4tZx4XaRjOGSOf8t2RMJDmAbUeydLiD8ny\nCcxTzetmyYky8J3NBUoYGRbwU6KKbkxHbT35QheAb3jT4CELopLZ57Aa5Fb8xTjQ\n6tNqwZ+Z3993FkTOWPYLNLM1l46oN3g9yVY4ncGjUJkxsLTpAXB4I+wdqeew9XXe\nxWNcY3cWWjA5VXgCNzntkPFM1D5IWkgP8MYVCvdv0Unfo78PahwVMoQMnDG4xLuS\n50gVKpukHLZQJNFPF0X4u/JeXauKPv/w7ssTTAK+8RIBYxBXQ72zDJNHyTqldR4e\nfPHZfcW7OTmUr5FGNZThyW7ipvZRWcLM4u4IaWF2ncllOSqAXs1gDxkk201J7Lrb\noZOjC3zgxE9HTCXpiszOAt5I38++5ufE3/hJW3ckz0jaJDeFqUphnn8eQhXPSwtC\nR8TL4ZpXSAFEpwahG+fCfZDK2KyPME33eXV3jtsYf0QHerYiMnP+tf1vAk3qtOzo\nE6Iv16fpBUvshk1Gm6E6bdhsP0hCrMwV4dm8uC3S52qcFiWZ6AC/HURaMbY+/lOs\n0A==\n-----END CERTIFICATE-----\n", 284 | "privateKey": "-----BEGIN RSA PRIVATE KEY-----\n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\n-----END RSA PRIVATE KEY-----\n" 285 | } 286 | ], 287 | "enforcers": [ 288 | { 289 | "owner": "built-in", 290 | "name": "user-enforcer-built-in", 291 | "createdTime": "2024-09-09T09:26:13Z", 292 | "updatedTime": "2024-09-09 09:26:13", 293 | "displayName": "User Enforcer", 294 | "description": "", 295 | "model": "built-in/user-model-built-in", 296 | "adapter": "built-in/user-adapter-built-in", 297 | "modelCfg": null 298 | }, 299 | { 300 | "owner": "built-in", 301 | "name": "api-enforcer-built-in", 302 | "createdTime": "2024-09-09T09:26:12Z", 303 | "updatedTime": "2024-09-09 09:26:12", 304 | "displayName": "API Enforcer", 305 | "description": "", 306 | "model": "built-in/api-model-built-in", 307 | "adapter": "built-in/api-adapter-built-in", 308 | "modelCfg": null 309 | } 310 | ], 311 | "groups": [], 312 | "invitations": [], 313 | "ldaps": [ 314 | { 315 | "id": "ldap-built-in", 316 | "owner": "built-in", 317 | "createdTime": "2024-09-09T09:26:12Z", 318 | "serverName": "BuildIn LDAP Server", 319 | "host": "example.com", 320 | "port": 389, 321 | "enableSsl": false, 322 | "username": "cn=buildin,dc=example,dc=com", 323 | "password": "9837a10cce", 324 | "baseDn": "ou=BuildIn,dc=example,dc=com", 325 | "filter": "", 326 | "filterFields": null, 327 | "defaultGroup": "", 328 | "autoSync": 0, 329 | "lastSync": "" 330 | } 331 | ], 332 | "models": [ 333 | { 334 | "owner": "built-in", 335 | "name": "user-model-built-in", 336 | "createdTime": "2024-09-09T09:26:13Z", 337 | "displayName": "Built-in Model", 338 | "description": "", 339 | "modelText": "[request_definition]\nr = sub, obj, act\n\n[policy_definition]\np = sub, obj, act\n\n[role_definition]\ng = _, _\n\n[policy_effect]\ne = some(where (p.eft == allow))\n\n[matchers]\nm = g(r.sub, p.sub) \u0026\u0026 r.obj == p.obj \u0026\u0026 r.act == p.act" 340 | }, 341 | { 342 | "owner": "built-in", 343 | "name": "api-model-built-in", 344 | "createdTime": "2024-09-09T09:26:12Z", 345 | "displayName": "API Model", 346 | "description": "", 347 | "modelText": "[request_definition]\nr = subOwner, subName, method, urlPath, objOwner, objName\n\n[policy_definition]\np = subOwner, subName, method, urlPath, objOwner, objName\n\n[role_definition]\ng = _, _\n\n[policy_effect]\ne = some(where (p.eft == allow))\n\n[matchers]\nm = (r.subOwner == p.subOwner || p.subOwner == \"*\") \u0026\u0026 \\\n (r.subName == p.subName || p.subName == \"*\" || r.subName != \"anonymous\" \u0026\u0026 p.subName == \"!anonymous\") \u0026\u0026 \\\n (r.method == p.method || p.method == \"*\") \u0026\u0026 \\\n (r.urlPath == p.urlPath || p.urlPath == \"*\") \u0026\u0026 \\\n (r.objOwner == p.objOwner || p.objOwner == \"*\") \u0026\u0026 \\\n (r.objName == p.objName || p.objName == \"*\") || \\\n (r.subOwner == r.objOwner \u0026\u0026 r.subName == r.objName)" 348 | } 349 | ], 350 | "organizations": [ 351 | { 352 | "owner": "admin", 353 | "name": "built-in", 354 | "createdTime": "2024-09-09T09:26:04Z", 355 | "displayName": "Built-in Organization", 356 | "websiteUrl": "https://example.com", 357 | "logo": "", 358 | "logoDark": "", 359 | "favicon": "https://cdn.casbin.org/img/casbin/favicon.ico", 360 | "passwordType": "plain", 361 | "passwordSalt": "", 362 | "passwordOptions": [ 363 | "AtLeast6" 364 | ], 365 | "countryCodes": [ 366 | "US", 367 | "ES", 368 | "FR", 369 | "DE", 370 | "GB", 371 | "CN", 372 | "JP", 373 | "KR", 374 | "VN", 375 | "ID", 376 | "SG", 377 | "IN" 378 | ], 379 | "defaultAvatar": "https://cdn.casbin.org/img/casbin.svg", 380 | "defaultApplication": "", 381 | "tags": [], 382 | "languages": [ 383 | "en", 384 | "zh", 385 | "es", 386 | "fr", 387 | "de", 388 | "id", 389 | "ja", 390 | "ko", 391 | "ru", 392 | "vi", 393 | "pt" 394 | ], 395 | "themeData": null, 396 | "masterPassword": "", 397 | "defaultPassword": "", 398 | "masterVerificationCode": "", 399 | "initScore": 2000, 400 | "enableSoftDeletion": false, 401 | "isProfilePublic": false, 402 | "useEmailAsUsername": false, 403 | "enableTour": true, 404 | "mfaItems": null, 405 | "accountItems": [ 406 | { 407 | "name": "Organization", 408 | "visible": true, 409 | "viewRule": "Public", 410 | "modifyRule": "Admin", 411 | "regex": "" 412 | }, 413 | { 414 | "name": "ID", 415 | "visible": true, 416 | "viewRule": "Public", 417 | "modifyRule": "Immutable", 418 | "regex": "" 419 | }, 420 | { 421 | "name": "Name", 422 | "visible": true, 423 | "viewRule": "Public", 424 | "modifyRule": "Admin", 425 | "regex": "" 426 | }, 427 | { 428 | "name": "Display name", 429 | "visible": true, 430 | "viewRule": "Public", 431 | "modifyRule": "Self", 432 | "regex": "" 433 | }, 434 | { 435 | "name": "Avatar", 436 | "visible": true, 437 | "viewRule": "Public", 438 | "modifyRule": "Self", 439 | "regex": "" 440 | }, 441 | { 442 | "name": "User type", 443 | "visible": true, 444 | "viewRule": "Public", 445 | "modifyRule": "Admin", 446 | "regex": "" 447 | }, 448 | { 449 | "name": "Password", 450 | "visible": true, 451 | "viewRule": "Self", 452 | "modifyRule": "Self", 453 | "regex": "" 454 | }, 455 | { 456 | "name": "Email", 457 | "visible": true, 458 | "viewRule": "Public", 459 | "modifyRule": "Self", 460 | "regex": "" 461 | }, 462 | { 463 | "name": "Phone", 464 | "visible": true, 465 | "viewRule": "Public", 466 | "modifyRule": "Self", 467 | "regex": "" 468 | }, 469 | { 470 | "name": "Country code", 471 | "visible": true, 472 | "viewRule": "Public", 473 | "modifyRule": "Admin", 474 | "regex": "" 475 | }, 476 | { 477 | "name": "Country/Region", 478 | "visible": true, 479 | "viewRule": "Public", 480 | "modifyRule": "Self", 481 | "regex": "" 482 | }, 483 | { 484 | "name": "Location", 485 | "visible": true, 486 | "viewRule": "Public", 487 | "modifyRule": "Self", 488 | "regex": "" 489 | }, 490 | { 491 | "name": "Affiliation", 492 | "visible": true, 493 | "viewRule": "Public", 494 | "modifyRule": "Self", 495 | "regex": "" 496 | }, 497 | { 498 | "name": "Title", 499 | "visible": true, 500 | "viewRule": "Public", 501 | "modifyRule": "Self", 502 | "regex": "" 503 | }, 504 | { 505 | "name": "Homepage", 506 | "visible": true, 507 | "viewRule": "Public", 508 | "modifyRule": "Self", 509 | "regex": "" 510 | }, 511 | { 512 | "name": "Bio", 513 | "visible": true, 514 | "viewRule": "Public", 515 | "modifyRule": "Self", 516 | "regex": "" 517 | }, 518 | { 519 | "name": "Tag", 520 | "visible": true, 521 | "viewRule": "Public", 522 | "modifyRule": "Admin", 523 | "regex": "" 524 | }, 525 | { 526 | "name": "Signup application", 527 | "visible": true, 528 | "viewRule": "Public", 529 | "modifyRule": "Admin", 530 | "regex": "" 531 | }, 532 | { 533 | "name": "Roles", 534 | "visible": true, 535 | "viewRule": "Public", 536 | "modifyRule": "Immutable", 537 | "regex": "" 538 | }, 539 | { 540 | "name": "Permissions", 541 | "visible": true, 542 | "viewRule": "Public", 543 | "modifyRule": "Immutable", 544 | "regex": "" 545 | }, 546 | { 547 | "name": "Groups", 548 | "visible": true, 549 | "viewRule": "Public", 550 | "modifyRule": "Admin", 551 | "regex": "" 552 | }, 553 | { 554 | "name": "3rd-party logins", 555 | "visible": true, 556 | "viewRule": "Self", 557 | "modifyRule": "Self", 558 | "regex": "" 559 | }, 560 | { 561 | "name": "Properties", 562 | "visible": true, 563 | "viewRule": "Admin", 564 | "modifyRule": "Admin", 565 | "regex": "" 566 | }, 567 | { 568 | "name": "Is admin", 569 | "visible": true, 570 | "viewRule": "Admin", 571 | "modifyRule": "Admin", 572 | "regex": "" 573 | }, 574 | { 575 | "name": "Is forbidden", 576 | "visible": true, 577 | "viewRule": "Admin", 578 | "modifyRule": "Admin", 579 | "regex": "" 580 | }, 581 | { 582 | "name": "Is deleted", 583 | "visible": true, 584 | "viewRule": "Admin", 585 | "modifyRule": "Admin", 586 | "regex": "" 587 | }, 588 | { 589 | "name": "Multi-factor authentication", 590 | "visible": true, 591 | "viewRule": "Self", 592 | "modifyRule": "Self", 593 | "regex": "" 594 | }, 595 | { 596 | "name": "WebAuthn credentials", 597 | "visible": true, 598 | "viewRule": "Self", 599 | "modifyRule": "Self", 600 | "regex": "" 601 | }, 602 | { 603 | "name": "Managed accounts", 604 | "visible": true, 605 | "viewRule": "Self", 606 | "modifyRule": "Self", 607 | "regex": "" 608 | }, 609 | { 610 | "name": "MFA accounts", 611 | "visible": true, 612 | "viewRule": "Self", 613 | "modifyRule": "Self", 614 | "regex": "" 615 | } 616 | ] 617 | }, 618 | { 619 | "owner": "admin", 620 | "name": "lobechat", 621 | "createdTime": "2024-09-09T09:26:04Z", 622 | "displayName": "LobeChat Organization", 623 | "websiteUrl": "https://lobehub.com", 624 | "logo": "https://lobehub.com/icon-192x192.png", 625 | "logoDark": "", 626 | "favicon": "https://lobehub.com/favicon.ico", 627 | "passwordType": "plain", 628 | "passwordSalt": "", 629 | "passwordOptions": [ 630 | "AtLeast6" 631 | ], 632 | "countryCodes": [ 633 | "US", 634 | "ES", 635 | "FR", 636 | "DE", 637 | "GB", 638 | "CN", 639 | "JP", 640 | "KR", 641 | "VN", 642 | "ID", 643 | "SG", 644 | "IN" 645 | ], 646 | "defaultAvatar": "https://cdn.casbin.org/img/casbin.svg", 647 | "defaultApplication": "", 648 | "tags": [], 649 | "languages": [ 650 | "en", 651 | "zh", 652 | "es", 653 | "fr", 654 | "de", 655 | "id", 656 | "ja", 657 | "ko", 658 | "ru", 659 | "vi", 660 | "pt" 661 | ], 662 | "themeData": null, 663 | "masterPassword": "", 664 | "defaultPassword": "", 665 | "masterVerificationCode": "", 666 | "initScore": 2000, 667 | "enableSoftDeletion": false, 668 | "isProfilePublic": false, 669 | "useEmailAsUsername": false, 670 | "enableTour": true, 671 | "mfaItems": null, 672 | "accountItems": [ 673 | { 674 | "name": "Organization", 675 | "visible": true, 676 | "viewRule": "Public", 677 | "modifyRule": "Admin", 678 | "regex": "" 679 | }, 680 | { 681 | "name": "ID", 682 | "visible": true, 683 | "viewRule": "Public", 684 | "modifyRule": "Immutable", 685 | "regex": "" 686 | }, 687 | { 688 | "name": "Name", 689 | "visible": true, 690 | "viewRule": "Public", 691 | "modifyRule": "Admin", 692 | "regex": "" 693 | }, 694 | { 695 | "name": "Display name", 696 | "visible": true, 697 | "viewRule": "Public", 698 | "modifyRule": "Self", 699 | "regex": "" 700 | }, 701 | { 702 | "name": "Avatar", 703 | "visible": true, 704 | "viewRule": "Public", 705 | "modifyRule": "Self", 706 | "regex": "" 707 | }, 708 | { 709 | "name": "User type", 710 | "visible": true, 711 | "viewRule": "Public", 712 | "modifyRule": "Admin", 713 | "regex": "" 714 | }, 715 | { 716 | "name": "Password", 717 | "visible": true, 718 | "viewRule": "Self", 719 | "modifyRule": "Self", 720 | "regex": "" 721 | }, 722 | { 723 | "name": "Email", 724 | "visible": true, 725 | "viewRule": "Public", 726 | "modifyRule": "Self", 727 | "regex": "" 728 | }, 729 | { 730 | "name": "Phone", 731 | "visible": true, 732 | "viewRule": "Public", 733 | "modifyRule": "Self", 734 | "regex": "" 735 | }, 736 | { 737 | "name": "Country code", 738 | "visible": true, 739 | "viewRule": "Public", 740 | "modifyRule": "Admin", 741 | "regex": "" 742 | }, 743 | { 744 | "name": "Country/Region", 745 | "visible": true, 746 | "viewRule": "Public", 747 | "modifyRule": "Self", 748 | "regex": "" 749 | }, 750 | { 751 | "name": "Location", 752 | "visible": true, 753 | "viewRule": "Public", 754 | "modifyRule": "Self", 755 | "regex": "" 756 | }, 757 | { 758 | "name": "Affiliation", 759 | "visible": true, 760 | "viewRule": "Public", 761 | "modifyRule": "Self", 762 | "regex": "" 763 | }, 764 | { 765 | "name": "Title", 766 | "visible": true, 767 | "viewRule": "Public", 768 | "modifyRule": "Self", 769 | "regex": "" 770 | }, 771 | { 772 | "name": "Homepage", 773 | "visible": true, 774 | "viewRule": "Public", 775 | "modifyRule": "Self", 776 | "regex": "" 777 | }, 778 | { 779 | "name": "Bio", 780 | "visible": true, 781 | "viewRule": "Public", 782 | "modifyRule": "Self", 783 | "regex": "" 784 | }, 785 | { 786 | "name": "Tag", 787 | "visible": true, 788 | "viewRule": "Public", 789 | "modifyRule": "Admin", 790 | "regex": "" 791 | }, 792 | { 793 | "name": "Signup application", 794 | "visible": true, 795 | "viewRule": "Public", 796 | "modifyRule": "Admin", 797 | "regex": "" 798 | }, 799 | { 800 | "name": "Roles", 801 | "visible": true, 802 | "viewRule": "Public", 803 | "modifyRule": "Immutable", 804 | "regex": "" 805 | }, 806 | { 807 | "name": "Permissions", 808 | "visible": true, 809 | "viewRule": "Public", 810 | "modifyRule": "Immutable", 811 | "regex": "" 812 | }, 813 | { 814 | "name": "Groups", 815 | "visible": true, 816 | "viewRule": "Public", 817 | "modifyRule": "Admin", 818 | "regex": "" 819 | }, 820 | { 821 | "name": "3rd-party logins", 822 | "visible": true, 823 | "viewRule": "Self", 824 | "modifyRule": "Self", 825 | "regex": "" 826 | }, 827 | { 828 | "name": "Properties", 829 | "visible": true, 830 | "viewRule": "Admin", 831 | "modifyRule": "Admin", 832 | "regex": "" 833 | }, 834 | { 835 | "name": "Is admin", 836 | "visible": true, 837 | "viewRule": "Admin", 838 | "modifyRule": "Admin", 839 | "regex": "" 840 | }, 841 | { 842 | "name": "Is forbidden", 843 | "visible": true, 844 | "viewRule": "Admin", 845 | "modifyRule": "Admin", 846 | "regex": "" 847 | }, 848 | { 849 | "name": "Is deleted", 850 | "visible": true, 851 | "viewRule": "Admin", 852 | "modifyRule": "Admin", 853 | "regex": "" 854 | }, 855 | { 856 | "name": "Multi-factor authentication", 857 | "visible": true, 858 | "viewRule": "Self", 859 | "modifyRule": "Self", 860 | "regex": "" 861 | }, 862 | { 863 | "name": "WebAuthn credentials", 864 | "visible": true, 865 | "viewRule": "Self", 866 | "modifyRule": "Self", 867 | "regex": "" 868 | }, 869 | { 870 | "name": "Managed accounts", 871 | "visible": true, 872 | "viewRule": "Self", 873 | "modifyRule": "Self", 874 | "regex": "" 875 | }, 876 | { 877 | "name": "MFA accounts", 878 | "visible": true, 879 | "viewRule": "Self", 880 | "modifyRule": "Self", 881 | "regex": "" 882 | } 883 | ] 884 | } 885 | ], 886 | "payments": [], 887 | "permissions": [ 888 | { 889 | "owner": "built-in", 890 | "name": "permission-built-in", 891 | "createdTime": "2024-09-09T09:26:04Z", 892 | "displayName": "Built-in Permission", 893 | "description": "Built-in Permission", 894 | "users": [ 895 | "built-in/*" 896 | ], 897 | "groups": [], 898 | "roles": [], 899 | "domains": [], 900 | "model": "user-model-built-in", 901 | "adapter": "", 902 | "resourceType": "Application", 903 | "resources": [ 904 | "app-built-in" 905 | ], 906 | "actions": [ 907 | "Read", 908 | "Write", 909 | "Admin" 910 | ], 911 | "effect": "Allow", 912 | "isEnabled": true, 913 | "submitter": "admin", 914 | "approver": "admin", 915 | "approveTime": "2024-09-09T09:26:04Z", 916 | "state": "Approved" 917 | } 918 | ], 919 | "plans": [], 920 | "pricings": [], 921 | "products": [], 922 | "providers": [], 923 | "records": [], 924 | "resources": [], 925 | "roles": [], 926 | "sessions": [], 927 | "subscriptions": [], 928 | "syncers": [], 929 | "tokens": [], 930 | "transactions": [], 931 | "users": [ 932 | { 933 | "owner": "built-in", 934 | "name": "admin", 935 | "createdTime": "2024-09-09T09:26:05Z", 936 | "updatedTime": "", 937 | "deletedTime": "", 938 | "id": "bbf2a176-203c-414c-8cdd-ec92b019e07a", 939 | "externalId": "", 940 | "type": "normal-user", 941 | "password": "9837a10cce", 942 | "passwordSalt": "", 943 | "passwordType": "plain", 944 | "displayName": "Admin", 945 | "firstName": "", 946 | "lastName": "", 947 | "avatar": "https://cdn.casbin.org/img/casbin.svg", 948 | "avatarType": "", 949 | "permanentAvatar": "", 950 | "email": "admin@example.com", 951 | "emailVerified": false, 952 | "phone": "13245678910", 953 | "countryCode": "US", 954 | "region": "", 955 | "location": "", 956 | "address": [], 957 | "affiliation": "Example Inc.", 958 | "title": "", 959 | "idCardType": "", 960 | "idCard": "", 961 | "homepage": "", 962 | "bio": "", 963 | "tag": "staff", 964 | "language": "", 965 | "gender": "", 966 | "birthday": "", 967 | "education": "", 968 | "score": 2000, 969 | "karma": 0, 970 | "ranking": 1, 971 | "balance": 0, 972 | "currency": "", 973 | "isDefaultAvatar": false, 974 | "isOnline": false, 975 | "isAdmin": true, 976 | "isForbidden": false, 977 | "isDeleted": false, 978 | "signupApplication": "app-built-in", 979 | "hash": "", 980 | "preHash": "", 981 | "accessKey": "", 982 | "accessSecret": "", 983 | "accessToken": "", 984 | "createdIp": "127.0.0.1", 985 | "lastSigninTime": "", 986 | "lastSigninIp": "", 987 | "github": "", 988 | "google": "", 989 | "qq": "", 990 | "wechat": "", 991 | "facebook": "", 992 | "dingtalk": "", 993 | "weibo": "", 994 | "gitee": "", 995 | "linkedin": "", 996 | "wecom": "", 997 | "lark": "", 998 | "gitlab": "", 999 | "adfs": "", 1000 | "baidu": "", 1001 | "alipay": "", 1002 | "casdoor": "", 1003 | "infoflow": "", 1004 | "apple": "", 1005 | "azuread": "", 1006 | "azureadb2c": "", 1007 | "slack": "", 1008 | "steam": "", 1009 | "bilibili": "", 1010 | "okta": "", 1011 | "douyin": "", 1012 | "line": "", 1013 | "amazon": "", 1014 | "auth0": "", 1015 | "battlenet": "", 1016 | "bitbucket": "", 1017 | "box": "", 1018 | "cloudfoundry": "", 1019 | "dailymotion": "", 1020 | "deezer": "", 1021 | "digitalocean": "", 1022 | "discord": "", 1023 | "dropbox": "", 1024 | "eveonline": "", 1025 | "fitbit": "", 1026 | "gitea": "", 1027 | "heroku": "", 1028 | "influxcloud": "", 1029 | "instagram": "", 1030 | "intercom": "", 1031 | "kakao": "", 1032 | "lastfm": "", 1033 | "mailru": "", 1034 | "meetup": "", 1035 | "microsoftonline": "", 1036 | "naver": "", 1037 | "nextcloud": "", 1038 | "onedrive": "", 1039 | "oura": "", 1040 | "patreon": "", 1041 | "paypal": "", 1042 | "salesforce": "", 1043 | "shopify": "", 1044 | "soundcloud": "", 1045 | "spotify": "", 1046 | "strava": "", 1047 | "stripe": "", 1048 | "tiktok": "", 1049 | "tumblr": "", 1050 | "twitch": "", 1051 | "twitter": "", 1052 | "typetalk": "", 1053 | "uber": "", 1054 | "vk": "", 1055 | "wepay": "", 1056 | "xero": "", 1057 | "yahoo": "", 1058 | "yammer": "", 1059 | "yandex": "", 1060 | "zoom": "", 1061 | "metamask": "", 1062 | "web3onboard": "", 1063 | "custom": "", 1064 | "webauthnCredentials": null, 1065 | "preferredMfaType": "", 1066 | "recoveryCodes": null, 1067 | "totpSecret": "", 1068 | "mfaPhoneEnabled": false, 1069 | "mfaEmailEnabled": false, 1070 | "invitation": "", 1071 | "invitationCode": "", 1072 | "faceIds": null, 1073 | "ldap": "", 1074 | "properties": {}, 1075 | "roles": null, 1076 | "permissions": null, 1077 | "groups": null, 1078 | "lastSigninWrongTime": "", 1079 | "signinWrongTimes": 0, 1080 | "managedAccounts": null, 1081 | "mfaAccounts": null, 1082 | "needUpdatePassword": false 1083 | }, 1084 | { 1085 | "owner": "lobechat", 1086 | "name": "user", 1087 | "createdTime": "2024-09-09T09:26:05Z", 1088 | "updatedTime": "", 1089 | "deletedTime": "", 1090 | "id": "b5a7c5b5-3e79-47ff-85a8-537b07fee2f9", 1091 | "externalId": "", 1092 | "type": "normal-user", 1093 | "password": "9837a10cce", 1094 | "passwordSalt": "", 1095 | "passwordType": "plain", 1096 | "displayName": "User", 1097 | "firstName": "", 1098 | "lastName": "", 1099 | "avatar": "https://cdn.casbin.org/img/casbin.svg", 1100 | "avatarType": "", 1101 | "permanentAvatar": "", 1102 | "email": "user@example.com", 1103 | "emailVerified": false, 1104 | "phone": "13245678910", 1105 | "countryCode": "US", 1106 | "region": "", 1107 | "location": "", 1108 | "address": [], 1109 | "affiliation": "Example Inc.", 1110 | "title": "", 1111 | "idCardType": "", 1112 | "idCard": "", 1113 | "homepage": "", 1114 | "bio": "", 1115 | "tag": "staff", 1116 | "language": "", 1117 | "gender": "", 1118 | "birthday": "", 1119 | "education": "", 1120 | "score": 2000, 1121 | "karma": 0, 1122 | "ranking": 1, 1123 | "balance": 0, 1124 | "currency": "", 1125 | "isDefaultAvatar": false, 1126 | "isOnline": false, 1127 | "isAdmin": false, 1128 | "isForbidden": false, 1129 | "isDeleted": false, 1130 | "signupApplication": "lobechat", 1131 | "hash": "", 1132 | "preHash": "", 1133 | "accessKey": "", 1134 | "accessSecret": "", 1135 | "accessToken": "", 1136 | "createdIp": "127.0.0.1", 1137 | "lastSigninTime": "", 1138 | "lastSigninIp": "", 1139 | "github": "", 1140 | "google": "", 1141 | "qq": "", 1142 | "wechat": "", 1143 | "facebook": "", 1144 | "dingtalk": "", 1145 | "weibo": "", 1146 | "gitee": "", 1147 | "linkedin": "", 1148 | "wecom": "", 1149 | "lark": "", 1150 | "gitlab": "", 1151 | "adfs": "", 1152 | "baidu": "", 1153 | "alipay": "", 1154 | "casdoor": "", 1155 | "infoflow": "", 1156 | "apple": "", 1157 | "azuread": "", 1158 | "azureadb2c": "", 1159 | "slack": "", 1160 | "steam": "", 1161 | "bilibili": "", 1162 | "okta": "", 1163 | "douyin": "", 1164 | "line": "", 1165 | "amazon": "", 1166 | "auth0": "", 1167 | "battlenet": "", 1168 | "bitbucket": "", 1169 | "box": "", 1170 | "cloudfoundry": "", 1171 | "dailymotion": "", 1172 | "deezer": "", 1173 | "digitalocean": "", 1174 | "discord": "", 1175 | "dropbox": "", 1176 | "eveonline": "", 1177 | "fitbit": "", 1178 | "gitea": "", 1179 | "heroku": "", 1180 | "influxcloud": "", 1181 | "instagram": "", 1182 | "intercom": "", 1183 | "kakao": "", 1184 | "lastfm": "", 1185 | "mailru": "", 1186 | "meetup": "", 1187 | "microsoftonline": "", 1188 | "naver": "", 1189 | "nextcloud": "", 1190 | "onedrive": "", 1191 | "oura": "", 1192 | "patreon": "", 1193 | "paypal": "", 1194 | "salesforce": "", 1195 | "shopify": "", 1196 | "soundcloud": "", 1197 | "spotify": "", 1198 | "strava": "", 1199 | "stripe": "", 1200 | "tiktok": "", 1201 | "tumblr": "", 1202 | "twitch": "", 1203 | "twitter": "", 1204 | "typetalk": "", 1205 | "uber": "", 1206 | "vk": "", 1207 | "wepay": "", 1208 | "xero": "", 1209 | "yahoo": "", 1210 | "yammer": "", 1211 | "yandex": "", 1212 | "zoom": "", 1213 | "metamask": "", 1214 | "web3onboard": "", 1215 | "custom": "", 1216 | "webauthnCredentials": null, 1217 | "preferredMfaType": "", 1218 | "recoveryCodes": null, 1219 | "totpSecret": "", 1220 | "mfaPhoneEnabled": false, 1221 | "mfaEmailEnabled": false, 1222 | "invitation": "", 1223 | "invitationCode": "", 1224 | "faceIds": null, 1225 | "ldap": "", 1226 | "properties": {}, 1227 | "roles": null, 1228 | "permissions": null, 1229 | "groups": null, 1230 | "lastSigninWrongTime": "", 1231 | "signinWrongTimes": 0, 1232 | "managedAccounts": null, 1233 | "mfaAccounts": null, 1234 | "needUpdatePassword": false 1235 | } 1236 | ], 1237 | "webhooks": [] 1238 | } --------------------------------------------------------------------------------