无法在 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
- 从
/etc/docker/daemon.json
中删除 "iptables": false
- 正确设置 UFW + Docker 使用 https://github.com/chaifeng/ufw-docker
当 运行 在 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
解决方案是删除 iptables = false
选项并在 UFW 配置中正确修复它。您可以按照他的 post 中的描述手动执行此操作,或者像我一样使用他的工具:https://github.com/chaifeng/ufw-docker.
TL;DR
- 从
/etc/docker/daemon.json
中删除 - 正确设置 UFW + Docker 使用 https://github.com/chaifeng/ufw-docker
"iptables": false