无法在 Node.js Docker 容器中发送 Sentry 事件

Unable to send Sentry events in Node.js Docker container

当 运行 在 Docker 容器内时,Node.js 的 Sentry SDK 无法将事件发送到 Sentry 服务器。我对我的 DigitalOcean Ubuntu 20.04 VPS 上的 运行 容器化设置还很陌生,所以非常感谢您的帮助!

错误:

Sentry Logger [Log]: [Tracing] starting gql transaction - GET_REFRESH_TOKEN
Sentry Logger [Log]: [Tracing] Finishing gql transaction: GET_REFRESH_TOKEN.
Sentry Logger [Error]: Error while sending event: Error: connect ETIMEDOUT 34.120.195.249:443

IP 是预期来自 Sentry 的 IP,并在此处找到:https://docs.sentry.io/product/security/ip-ranges/#event-ingestion

相关设置:

哨兵初始化

{
  dsn: 'https://<secret>@<secret>.ingest.sentry.io/<secret>',
  environment: 'Testing',
  debug: true,
  integrations: [ Http { name: 'Http', _breadcrumbs: true, _tracing: true } ],
  tracesSampleRate: 1,
  _metadata: {
    sdk: {
      name: 'sentry.javascript.node',
      packages: [Array],
      version: '6.13.3'
    }
  }
}

Docker 撰写文件

version: '3'
services:
  frontend:
    #...

  api:
    container_name: api-${COMPOSE_PROJECT_NAME}
    restart: always
    build:
      context: ./api
      dockerfile: Dockerfile.prod
    env_file:
      - .env
    environment:
      API_PORT: 3001
      DB_HOST: db
      DB_PORT: 5432
      DATABASE_URL: postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@db:5432/${POSTGRES_DB}?schema=${DB_SCHEMA}
    depends_on:
      - db
    ports:
      - ${API_PORT_INTERNAL}:3001
    volumes:
      - ./api:/app
      - /app/node_modules

  db:
    #...

API Docker文件

FROM node:14 AS builder

# Create app directory
WORKDIR /app

COPY package*.json ./
COPY prisma ./prisma/

RUN npm install
RUN npx prisma generate

COPY . .

# Latest LTS version
FROM node:14

# Set default values for environment variables
ENV API_PORT=3001

COPY . .
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/package*.json ./

# Bind port
EXPOSE 3001

# Start server
CMD ["npm", "start"]

如果需要更多详细信息,我将附加此列表。

进一步调查后的自我回答:

事实证明,来自容器内部的所有外部网络访问都被阻止了。 Sentry 的使用是第一次有必要。

问题

在配置 VPS 防火墙 (UFW) 时,Docker 绕过了防火墙并暴露了不需要的端口。为了解决这个问题,我在 /etc/docker/daemon.json:

中完全禁用了 iptables
{
  "iptables": false
}

这可以完成工作,但会阻止来自容器内的所有外部网络访问。

解决方案

解决方案的所有学分都归于@Feng to the following question:

解决方案是删除 iptables = false 选项并在 UFW 配置中正确修复它。您可以按照他的 post 中的描述手动执行此操作,或者像我一样使用他的工具:https://github.com/chaifeng/ufw-docker.

TL;DR

  1. /etc/docker/daemon.json
  2. 中删除 "iptables": false
  3. 正确设置 UFW + Docker 使用 https://github.com/chaifeng/ufw-docker