日常开发维护错误记录

日常开发维护错误记录

2024.4

使用 LobeChat 时出现 403 错误

发生时间: 2024年4月25日

表现

LobeChat 返回错误信息:

很抱歉,服务器拒绝了您的请求,您没有访问此内容的权限

{
  "message": "Sorry, the server has rejected your request. You do not have permission to access this content.",
  "type": 403
}

原因排查

  1. 在请求 https://mydomain.com/api/chat/${api_name} 的时候触发了 403 错误

  2. 该 403 错误由 Nginx 的恶意请求拦截返回

  3. 请求中出现了 ./data:/path/to/container/data 字样,触发了拦截规则 data:/ 导致

这是所使用的 Nginx 版本自带的默认恶意请求拦截内容,平时开发的时候都未曾留意这一环节

解决方案

  1. 修改 Nginx 恶意请求拦截配置

使用 Postgres 时有很多报错日志

发生时间: 2024年4月23日

表现

postgres 在 docker 中运行,执行下面的命令

docker logs ${container_name} --tail=100

发现存在大量的此类日志:

2024-04-25 09:06:15.014 UTC [986843] FATAL: role "root" does not exist

原因排查

导出日志

尝试将错误日志导出到本地,分析什么时候开始产生的:

docker logs ${container_name} >> pg.log

然后发现用处不大,导出的日志不完整,没有任何一行包含上面的报错。探索后发现,是只将 stdout 重定向到了文件,而报错内容在 stderr 中,更改命令导出:

docker logs ${container_name} >> pg.log >> 2&1

此次操作拿到的就是正常的完整日志了

原因分析

结合上下文分析,错误发生时间是容器创建时间附近,所以怀疑是配置文件有问题,而不是应用程序的问题,配置如下:

version: '3.8'

services:
  postgres:
    image: postgres:16-alpine
    container_name: database
    restart: always
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: PASSWORD
    healthcheck:
      test: [ "CMD-SHELL", "pg_isready -U root -d pg_db" ]
      interval: 10s
      timeout: 60s
      retries: 5
      start_period: 10s
    volumes:
      - /home/postgres/mnt/data:/var/lib/postgresql/data
    ports:
      - "5432:5432"
    networks:
      - postgres_network

networks:
  postgres_network:
    driver: bridge

上面的配置是从 zitadel 中复制粘贴的,问题出现在 healthcheck 中,在

test: [ "CMD-SHELL", "pg_isready -U root -d pg_db" ]
  • -U root 的意思是使用 root 用户

  • -d pg_db 的意思是使用 pg_db 这一数据库

这两个默认值在启动的时候并没有更改,也没有创建对应的数据库用户和数据库,所以每十秒钟进行健康检查的时候都会产生错误

解决方案

  1. 修复错误的健康检查参数

Comment