Удалил docker-compose.dev.yml. поменял наименование контейнера. Убрал дебаг логи.
This commit is contained in:
@@ -5,8 +5,5 @@ DATABASE_URL=postgres://greact:pG3526l4@194.36.208.86:5433/cloud
|
|||||||
# Optional. When set, POST /api/ingest requires x-api-key: <value>.
|
# Optional. When set, POST /api/ingest requires x-api-key: <value>.
|
||||||
INGEST_API_KEY=
|
INGEST_API_KEY=
|
||||||
|
|
||||||
# Optional. Logs POST /api/ingest request metadata without x-api-key.
|
|
||||||
INGEST_DEBUG_LOG=
|
|
||||||
|
|
||||||
# Poll interval for GET /api/current/events SSE snapshots.
|
# Poll interval for GET /api/current/events SSE snapshots.
|
||||||
CURRENT_EVENTS_POLL_MS=1000
|
CURRENT_EVENTS_POLL_MS=1000
|
||||||
|
|||||||
@@ -1,21 +0,0 @@
|
|||||||
services:
|
|
||||||
drill-cloud-v3-dev:
|
|
||||||
container_name: drill-cloud-v3${branch:+-${branch}}
|
|
||||||
build: .
|
|
||||||
restart: unless-stopped
|
|
||||||
environment:
|
|
||||||
NODE_ENV: production
|
|
||||||
BRANCH: ${branch:-}
|
|
||||||
PORT: ${PORT}
|
|
||||||
DATABASE_URL: ${DATABASE_URL}
|
|
||||||
INGEST_API_KEY: ${INGEST_API_KEY}
|
|
||||||
INGEST_DEBUG_LOG: ${INGEST_DEBUG_LOG:-}
|
|
||||||
CURRENT_EVENTS_POLL_MS: ${CURRENT_EVENTS_POLL_MS}
|
|
||||||
expose:
|
|
||||||
- "3101"
|
|
||||||
networks:
|
|
||||||
- proxy
|
|
||||||
|
|
||||||
networks:
|
|
||||||
proxy:
|
|
||||||
external: true
|
|
||||||
@@ -1,15 +1,13 @@
|
|||||||
services:
|
services:
|
||||||
drill-cloud-v3:
|
drill-cloud-v3:
|
||||||
container_name: drill-cloud-v3${branch:+-${branch}}
|
container_name: container-drill-cloud-v3${branch:+-${branch}}
|
||||||
build: .
|
build: .
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
environment:
|
environment:
|
||||||
NODE_ENV: production
|
NODE_ENV: production
|
||||||
BRANCH: ${branch:-}
|
|
||||||
PORT: ${PORT}
|
PORT: ${PORT}
|
||||||
DATABASE_URL: ${DATABASE_URL}
|
DATABASE_URL: ${DATABASE_URL}
|
||||||
INGEST_API_KEY: ${INGEST_API_KEY}
|
INGEST_API_KEY: ${INGEST_API_KEY}
|
||||||
INGEST_DEBUG_LOG: ${INGEST_DEBUG_LOG:-}
|
|
||||||
CURRENT_EVENTS_POLL_MS: ${CURRENT_EVENTS_POLL_MS}
|
CURRENT_EVENTS_POLL_MS: ${CURRENT_EVENTS_POLL_MS}
|
||||||
expose:
|
expose:
|
||||||
- "3101"
|
- "3101"
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
import { Body, Controller, Logger, Param, Post, Req, UseGuards } from '@nestjs/common';
|
import { Body, Controller, Param, Post, UseGuards } from '@nestjs/common';
|
||||||
import type { Request } from 'express';
|
|
||||||
import { IngestApiKeyGuard } from '../common/ingest-api-key.guard';
|
import { IngestApiKeyGuard } from '../common/ingest-api-key.guard';
|
||||||
import { IngestEdgeValuesDto } from './dto/ingest-edge-values.dto';
|
import { IngestEdgeValuesDto } from './dto/ingest-edge-values.dto';
|
||||||
import { IngestPointDto } from './dto/ingest-point.dto';
|
import { IngestPointDto } from './dto/ingest-point.dto';
|
||||||
@@ -8,19 +7,10 @@ import { IngestService } from './ingest.service';
|
|||||||
@Controller('ingest')
|
@Controller('ingest')
|
||||||
@UseGuards(IngestApiKeyGuard)
|
@UseGuards(IngestApiKeyGuard)
|
||||||
export class IngestController {
|
export class IngestController {
|
||||||
private readonly logger = new Logger(IngestController.name);
|
|
||||||
|
|
||||||
constructor(private readonly ingest: IngestService) {}
|
constructor(private readonly ingest: IngestService) {}
|
||||||
|
|
||||||
@Post()
|
@Post()
|
||||||
ingestPoint(@Body() point: IngestPointDto, @Req() request: Request) {
|
ingestPoint(@Body() point: IngestPointDto) {
|
||||||
this.logIngestRequest(request, {
|
|
||||||
kind: 'point',
|
|
||||||
edge: point.edge,
|
|
||||||
tag: point.tag,
|
|
||||||
timestamp: point.timestamp,
|
|
||||||
});
|
|
||||||
|
|
||||||
return this.ingest.ingestPoint(point);
|
return this.ingest.ingestPoint(point);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -28,17 +18,7 @@ export class IngestController {
|
|||||||
ingestEdgeValues(
|
ingestEdgeValues(
|
||||||
@Param('edge') edge: string,
|
@Param('edge') edge: string,
|
||||||
@Body() body: IngestEdgeValuesDto,
|
@Body() body: IngestEdgeValuesDto,
|
||||||
@Req() request: Request,
|
|
||||||
) {
|
) {
|
||||||
const tags = Object.keys(body.values);
|
|
||||||
this.logIngestRequest(request, {
|
|
||||||
kind: 'edge-values',
|
|
||||||
edge,
|
|
||||||
tagCount: tags.length,
|
|
||||||
firstTags: tags.slice(0, 5),
|
|
||||||
timestamp: body.timestamp,
|
|
||||||
});
|
|
||||||
|
|
||||||
const points = Object.entries(body.values).map(([tag, value]) => ({
|
const points = Object.entries(body.values).map(([tag, value]) => ({
|
||||||
edge,
|
edge,
|
||||||
tag,
|
tag,
|
||||||
@@ -48,33 +28,4 @@ export class IngestController {
|
|||||||
|
|
||||||
return this.ingest.ingestPoints(points);
|
return this.ingest.ingestPoints(points);
|
||||||
}
|
}
|
||||||
|
|
||||||
private logIngestRequest(
|
|
||||||
request: Request,
|
|
||||||
payload: Record<string, unknown>,
|
|
||||||
): void {
|
|
||||||
if (!this.isDebugLogEnabled()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
this.logger.log({
|
|
||||||
event: 'ingest.received',
|
|
||||||
method: request.method,
|
|
||||||
url: request.originalUrl,
|
|
||||||
host: request.get('host'),
|
|
||||||
ip: request.ip,
|
|
||||||
remoteAddress: request.socket.remoteAddress,
|
|
||||||
forwardedFor: request.get('x-forwarded-for'),
|
|
||||||
realIp: request.get('x-real-ip'),
|
|
||||||
userAgent: request.get('user-agent'),
|
|
||||||
contentLength: request.get('content-length'),
|
|
||||||
...payload,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
private isDebugLogEnabled(): boolean {
|
|
||||||
return ['1', 'true', 'yes', 'on'].includes(
|
|
||||||
(process.env.INGEST_DEBUG_LOG ?? '').toLowerCase(),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
37
src/main.ts
37
src/main.ts
@@ -1,30 +1,9 @@
|
|||||||
import { Logger, ValidationPipe } from '@nestjs/common';
|
import { ValidationPipe } from '@nestjs/common';
|
||||||
import { NestFactory } from '@nestjs/core';
|
import { NestFactory } from '@nestjs/core';
|
||||||
import compression from 'compression';
|
import compression from 'compression';
|
||||||
import { AppModule } from './app.module';
|
import { AppModule } from './app.module';
|
||||||
import { DbService } from './db/db.service';
|
|
||||||
|
|
||||||
type CurrentDatabaseRow = {
|
|
||||||
database: string;
|
|
||||||
};
|
|
||||||
|
|
||||||
function getMaskedDatabaseUrl(): string | undefined {
|
|
||||||
const databaseUrl = process.env.DATABASE_URL;
|
|
||||||
if (!databaseUrl) {
|
|
||||||
return undefined;
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
const url = new URL(databaseUrl);
|
|
||||||
const username = url.username ? `${url.username}:***@` : '';
|
|
||||||
return `${url.protocol}//${username}${url.host}${url.pathname}`;
|
|
||||||
} catch {
|
|
||||||
return databaseUrl.replace(/:\/\/([^:]+):([^@]+)@/, '://$1:***@');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
async function bootstrap() {
|
async function bootstrap() {
|
||||||
const logger = new Logger('Bootstrap');
|
|
||||||
const app = await NestFactory.create(AppModule);
|
const app = await NestFactory.create(AppModule);
|
||||||
app.use(compression());
|
app.use(compression());
|
||||||
app.setGlobalPrefix('api');
|
app.setGlobalPrefix('api');
|
||||||
@@ -38,20 +17,6 @@ async function bootstrap() {
|
|||||||
);
|
);
|
||||||
|
|
||||||
await app.listen(process.env.PORT as string);
|
await app.listen(process.env.PORT as string);
|
||||||
|
|
||||||
const db = app.get(DbService);
|
|
||||||
const currentDatabase = await db.query<CurrentDatabaseRow>(
|
|
||||||
'SELECT current_database() AS database',
|
|
||||||
);
|
|
||||||
|
|
||||||
logger.log({
|
|
||||||
event: 'cloud.started',
|
|
||||||
port: process.env.PORT,
|
|
||||||
branch: process.env.BRANCH ?? process.env.branch ?? '',
|
|
||||||
database: currentDatabase.rows[0]?.database,
|
|
||||||
databaseUrl: getMaskedDatabaseUrl(),
|
|
||||||
ingestDebugLog: process.env.INGEST_DEBUG_LOG ?? '',
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void bootstrap();
|
void bootstrap();
|
||||||
|
|||||||
Reference in New Issue
Block a user