Tech-Paul

work hard, play hard

底层核心

用户提出问题,在向量数据库中做向量检索,检索:Retrieve
检索匹配到的知识内容发送给 AI,作为背景知识,叫做增强:Augment
AI 回答之前并不知道的问题,叫做生成:Generation
RAG:检索(Retrieve) 增强(Augment) 生成(Generation)

本地运行

模式一:docker 运行 fastgpt

notes: 如果 docker 有相关 imanges、volumes、contains,需要彻底删除。

- mkdir <myFolder>
- cd <myFolder>
1
2
3
4
5
6
   curl -O https://raw.githubusercontent.com/labring/FastGPT/main/projects/app/data/config.json

# pgvector 版本(测试推荐,简单快捷)

curl -o docker-compose.yml https://raw.githubusercontent.com/labring/FastGPT/main/deploy/docker/docker-compose-pgvector.yml

- run: docker-compose up -d
- open: http://localhost:300

模式二:本地运行 fastGPT,docker 运行数据库以及代理镜像

notes: 如果 docker 有相关 imanges、volumes、contains,需要彻底删除。

  • pull docker-compose file
  • 注释 fastGPT、sandbox
  • 解注释 mongo、pg 端口号内容
  • run: docker-compose up -d

问题背景

在使用 Mac 电脑进行 Docker 开发时,执行docker-compose up -d命令时遇到了如下错误:

1
2
3
4
pg Error                     context canceled                                                                                                                                                                                                                           10.1s
✘ mongo Error context canceled 10.1s
✘ aiproxy_pg Error Get "https://registry-1.docker.io/v2/": net/http: TLS handshake timeout 10.1s
Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: TLS handshake timeout

虽然 Mac 已经配置了科学上网工具,但 Docker 仍然无法正常拉取镜像。本文将详细介绍如何通过终端代理解决这个问题。

问题分析

  1. VPN 代理的局限性
    • 大多数 VPN(如 OpenVPN、WireGuard、Shadowsocks)默认只代理 TCP/UDP 流量
    ping使用的是 ICMP 协议,不受 VPN 影响(这也是为什么ping google.com不可靠的原因)

  2. Docker 的特殊性
    • Docker 守护进程默认不会继承系统的代理设置
    • Docker 镜像拉取使用的是 HTTPS 协议(TCP),需要正确配置代理

解决方案

第一步:查找 VPN 代理端口

  1. 打开 Mac 系统设置
  2. 找到当前已连接的网络
  3. 点击”详细信息”→”代理”
  4. 记下 HTTP 代理端口(本例中为 15236)

第二步:配置终端代理

1
2
3
4
5
6
# 设置HTTP/HTTPS代理
export http_proxy=http://127.0.0.1:15236
export https_proxy=http://127.0.0.1:15236

# 验证代理是否生效(不要使用ping)
curl -vI https://registry-1.docker.io

第三步:配置 Docker 守护进程代理(可选)

如果仅设置终端代理无效,可能需要为 Docker 守护进程配置代理:

1
2
3
4
5
6
7
8
9
10
11
12
13
# 创建代理配置目录
sudo mkdir -p /etc/systemd/system/docker.service.d

# 创建代理配置文件
sudo tee /etc/systemd/system/docker.service.d/http-proxy.conf <<EOF
[Service]
Environment="HTTP_PROXY=http://127.0.0.1:15236"
Environment="HTTPS_PROXY=http://127.0.0.1:15236"
EOF

# 重新加载并重启Docker
sudo systemctl daemon-reload
sudo systemctl restart docker

第四步:重新执行命令

1
docker-compose up -d

验证与测试

  1. 检查镜像拉取状态

    1
    2
    docker images
    docker ps -a
  2. 查看容器日志

    1
    docker logs <container_name>

替代方案

如果上述方法仍然无效,可以考虑:

  1. 使用国内镜像源

    1
    2
    # 编辑Docker配置
    sudo nano /etc/docker/daemon.json

    添加内容:

    1
    2
    3
    4
    5
    6
    {
    "registry-mirrors": [
    "https://docker.mirrors.ustc.edu.cn",
    "https://hub-mirror.c.163.com"
    ]
    }
  2. 手动下载镜像

    1
    2
    3
    4
    5
    6
    # 在可访问的机器上
    docker pull <image_name>
    docker save <image_name> > image.tar

    # 在目标机器上
    docker load < image.tar

总结

通过正确配置终端代理和 Docker 守护进程代理,我们成功解决了 Mac 环境下 Docker 镜像拉取失败的问题。关键点包括:

  1. 理解 VPN 代理的局限性
  2. 正确识别代理端口
  3. 为 Docker 配置适当的代理设置
  4. 使用可靠的验证方法(而非 ping)

希望本文能帮助遇到类似问题的开发者顺利解决问题。如果仍有疑问,可以参考 Docker 官方文档或相关社区讨论。

单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一

SSO 的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统 SSO 一般都需要一个独立的认证中心(passport),子系统的登录均得通过 passport,子系统本身将不参与登录操作当一个系统成功登录以后,passport 将会颁发一个令牌给各个子系统,子系统可以拿着令牌会获取各自的受保护资源,为了减少频繁认证,各个子系统在被 passport 授权以后,会建立一个局部会话,在一定时间内可以无需再次向 passport 发起认证

图上有四个系统,分别是 Application1、Application2、Application3、和 SSO,当 Application1、Application2、Application3 需要登录时,将跳到 SSO 系统,SSO 系统完成登录,其他的应用系统也就随之登录了

举个例子
淘宝、天猫都属于阿里旗下,当用户登录淘宝后,再打开天猫,系统便自动帮用户登录了天猫,这种现象就属于单点登录

实现方案

同域名下的单点登录

cookie 的 domain 属性设置为当前域的父域,并且父域的 cookie 会被子域所共享。path 属性默认为 web 应用的上下文路径利用 Cookie 的这个特点,没错,我们只需要将 Cookie 的 domain 属性设置为父域的域名(主域名),同时将 Cookie 的 path 属性设置为根路径,将 Session ID(或 Token)保存到父域中。这样所有的子域应用就都可以访问到这个 Cookie 不过这要求应用系统的域名需建立在一个共同的主域名之下,如 http://tieba.baidu.comhttp://map.baidu.com,它们都建立在 http://baidu.com这个主域名之下,那么它们就可以通过这种方式来实现单点登录

不同域名下的单点登录(一)

如果是不同域的情况下,Cookie 是不共享的,这里我们可以部署一个认证中心,用于专门处理登录请求的独立的 Web 服务用户统一在认证中心进行登录,登录成功后,认证中心记录用户的登录状态,并将 token 写入 Cookie(注意这个 Cookie 是认证中心的,应用系统是访问不到的)应用系统检查当前请求有没有 Token,如果没有,说明用户在当前系统中尚未登录,那么就将页面跳转至认证中心由于这个操作会将认证中心的 Cookie 自动带过去,因此,认证中心能够根据 Cookie 知道用户是否已经登录过了如果认证中心发现用户尚未登录,则返回登录页面,等待用户登录如果发现用户已经登录过了,就不会让用户再次登录了,而是会跳转回目标 URL,并在跳转前生成一个 Token,拼接在目标 URL 的后面,回传给目标应用系统应用系统拿到 Token 之后,还需要向认证中心确认下 Token 的合法性,防止用户伪造。确认无误后,应用系统记录用户的登录状态,并将 Token 写入 Cookie,然后给本次访问放行。(注意这个 Cookie 是当前应用系统的)当用户再次访问当前应用系统时,就会自动带上这个 Token,应用系统验证 Token 发现用户已登录,于是就不会有认证中心什么事了此种实现方式相对复杂,支持跨域,扩展性好,是单点登录的标准做法

不同域名下的单点登录(二)

可以选择将 Session ID (或 Token )保存到浏览器的 LocalStorage 中,让前端在每次向后端发送请求时,主动将 LocalStorage 的数据传递给服务端这些都是由前端来控制的,后端需要做的仅仅是在用户登录成功后,将 Session ID(或 Token)放在响应体中传递给前端单点登录完全可以在前端实现。前端拿到 Session ID(或 Token )后,除了将它写入自己的 LocalStorage 中之外,还可以通过特殊手段将它写入多个其他域下的 LocalStorage 中关键代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// 获取 token
var token = result.data.token

// 动态创建一个不可见的iframe,在iframe中加载一个跨域HTML
var iframe = document.createElement("iframe")
iframe.src = "http://app1.com/localstorage.html"
document.body.append(iframe)
// 使用postMessage()方法将token传递给iframe
setTimeout(function () {
iframe.contentWindow.postMessage(token, "http://app1.com")
}, 4000)
setTimeout(function () {
iframe.remove()
}, 6000)

// 在这个iframe所加载的HTML中绑定一个事件监听器,当事件被触发时,把接收到的token数据写入localStorage
window.addEventListener(
"message",
function (event) {
localStorage.setItem("token", event.data)
},
false
)

前端通过 iframe+postMessage() 方式,将同一份 Token 写入到了多个域下的 LocalStorage 中,前端每次在向后端发送请求之前,都会主动从 LocalStorage 中读取 Token 并在请求中携带,这样就实现了同一份 Token 被多个域所共享此种实现方式完全由前端控制,几乎不需要后端参与,同样支持跨域

流程

sso 流程如下:
用户访问系统 1 的受保护资源,系统 1 发现用户未登录,跳转至 sso 认证中心,并将自己的地址作为参数 sso 认证中心发现用户未登录,将用户引导至登录页面用户输入用户名密码提交登录申请 sso 认证中心校验用户信息,创建用户与 sso 认证中心之间的会话,称为全局会话,同时创建授权令牌 sso 认证中心带着令牌跳转会最初的请求地址(系统 1)系统 1 拿到令牌,去 sso 认证中心校验令牌是否有效 sso 认证中心校验令牌,返回有效,注册系统 1 系统 1 使用该令牌创建与用户的会话,称为局部会话,返回受保护资源用户访问系统 2 的受保护资源系统 2 发现用户未登录,跳转至 sso 认证中心,并将自己的地址作为参数 sso 认证中心发现用户已登录,跳转回系统 2 的地址,并附上令牌系统 2 拿到令牌,去 sso 认证中心校验令牌是否有效 sso 认证中心校验令牌,返回有效,注册系统 2 系统 2 使用该令牌创建与用户的局部会话,返回受保护资源用户登录成功之后,会与 sso 认证中心及各个子系统建立会话,用户与 sso 认证中心建立的会话称为全局会话用户与各个子系统建立的会话称为局部会话,局部会话建立之后,用户访问子系统受保护资源将不再通过 sso 认证中心全局会话与局部会话有如下约束关系:局部会话存在,全局会话一定存在全局会话存在,局部会话不一定存在全局会话销毁,局部会话必须销毁

参考:什么是单点登录?有哪些实现方式?

0%