feat: add logrotate to cron in nestjs (#839)

* feat: add logrotate to cron in nestjs

* fix: set max size to 5m and remove old logs

* fix: logrotate command invalid
This commit is contained in:
Eli Bosley
2024-01-11 17:17:23 -05:00
committed by GitHub
parent 764f65ff61
commit a0dfbb4e15
8 changed files with 104 additions and 11 deletions

View File

@@ -1,5 +1,5 @@
[api] [api]
version="3.3.0+89cb2544" version="3.3.0+eff31423"
extraOrigins="https://google.com,https://test.com" extraOrigins="https://google.com,https://test.com"
[local] [local]
[notifier] [notifier]

View File

@@ -1,5 +1,5 @@
[api] [api]
version="3.3.0+89cb2544" version="3.3.0+eff31423"
extraOrigins="https://google.com,https://test.com" extraOrigins="https://google.com,https://test.com"
[local] [local]
[notifier] [notifier]
@@ -21,4 +21,4 @@ dynamicRemoteAccessType="DISABLED"
[upc] [upc]
apikey="unupc_fab6ff6ffe51040595c6d9ffb63a353ba16cc2ad7d93f813a2e80a5810" apikey="unupc_fab6ff6ffe51040595c6d9ffb63a353ba16cc2ad7d93f813a2e80a5810"
[connectionStatus] [connectionStatus]
minigraph="PRE_INIT" minigraph="ERROR_RETRYING"

67
api/package-lock.json generated
View File

@@ -22,6 +22,7 @@
"@nestjs/graphql": "^12.0.11", "@nestjs/graphql": "^12.0.11",
"@nestjs/passport": "^10.0.2", "@nestjs/passport": "^10.0.2",
"@nestjs/platform-fastify": "^10.2.9", "@nestjs/platform-fastify": "^10.2.9",
"@nestjs/schedule": "^4.0.0",
"@reduxjs/toolkit": "^1.9.5", "@reduxjs/toolkit": "^1.9.5",
"@reflet/cron": "^1.3.1", "@reflet/cron": "^1.3.1",
"@runonflux/nat-upnp": "^1.0.2", "@runonflux/nat-upnp": "^1.0.2",
@@ -3555,6 +3556,29 @@
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz",
"integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="
}, },
"node_modules/@nestjs/schedule": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/@nestjs/schedule/-/schedule-4.0.0.tgz",
"integrity": "sha512-zz4h54m/F/1qyQKvMJCRphmuwGqJltDAkFxUXCVqJBXEs5kbPt93Pza3heCQOcMH22MZNhGlc9DmDMLXVHmgVQ==",
"dependencies": {
"cron": "3.1.3",
"uuid": "9.0.1"
},
"peerDependencies": {
"@nestjs/common": "^8.0.0 || ^9.0.0 || ^10.0.0",
"@nestjs/core": "^8.0.0 || ^9.0.0 || ^10.0.0",
"reflect-metadata": "^0.1.12"
}
},
"node_modules/@nestjs/schedule/node_modules/cron": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/cron/-/cron-3.1.3.tgz",
"integrity": "sha512-KVxeKTKYj2eNzN4ElnT6nRSbjbfhyxR92O/Jdp6SH3pc05CDJws59jBrZWEMQlxevCiE6QUTrXy+Im3vC3oD3A==",
"dependencies": {
"@types/luxon": "~3.3.0",
"luxon": "~3.4.0"
}
},
"node_modules/@nestjs/testing": { "node_modules/@nestjs/testing": {
"version": "10.3.0", "version": "10.3.0",
"resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-10.3.0.tgz", "resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-10.3.0.tgz",
@@ -4295,6 +4319,11 @@
"version": "4.0.2", "version": "4.0.2",
"license": "MIT" "license": "MIT"
}, },
"node_modules/@types/luxon": {
"version": "3.3.8",
"resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.3.8.tgz",
"integrity": "sha512-jYvz8UMLDgy3a5SkGJne8H7VA7zPV2Lwohjx0V8V31+SqAjNmurWMkk9cQhfvlcnXWudBpK9xPM1n4rljOcHYQ=="
},
"node_modules/@types/mime": { "node_modules/@types/mime": {
"version": "3.0.1", "version": "3.0.1",
"license": "MIT" "license": "MIT"
@@ -11295,6 +11324,14 @@
"node": ">=12" "node": ">=12"
} }
}, },
"node_modules/luxon": {
"version": "3.4.4",
"resolved": "https://registry.npmjs.org/luxon/-/luxon-3.4.4.tgz",
"integrity": "sha512-zobTr7akeGHnv7eBOXcRgMeCP6+uyYsczwmeRCauvpvaAltgNyTbLH/+VaEAPUeWBT+1GuNmz4wC/6jtQzbbVA==",
"engines": {
"node": ">=12"
}
},
"node_modules/magic-string": { "node_modules/magic-string": {
"version": "0.30.2", "version": "0.30.2",
"dev": true, "dev": true,
@@ -19524,6 +19561,26 @@
} }
} }
}, },
"@nestjs/schedule": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/@nestjs/schedule/-/schedule-4.0.0.tgz",
"integrity": "sha512-zz4h54m/F/1qyQKvMJCRphmuwGqJltDAkFxUXCVqJBXEs5kbPt93Pza3heCQOcMH22MZNhGlc9DmDMLXVHmgVQ==",
"requires": {
"cron": "3.1.3",
"uuid": "9.0.1"
},
"dependencies": {
"cron": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/cron/-/cron-3.1.3.tgz",
"integrity": "sha512-KVxeKTKYj2eNzN4ElnT6nRSbjbfhyxR92O/Jdp6SH3pc05CDJws59jBrZWEMQlxevCiE6QUTrXy+Im3vC3oD3A==",
"requires": {
"@types/luxon": "~3.3.0",
"luxon": "~3.4.0"
}
}
}
},
"@nestjs/testing": { "@nestjs/testing": {
"version": "10.3.0", "version": "10.3.0",
"resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-10.3.0.tgz", "resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-10.3.0.tgz",
@@ -20009,6 +20066,11 @@
"@types/long": { "@types/long": {
"version": "4.0.2" "version": "4.0.2"
}, },
"@types/luxon": {
"version": "3.3.8",
"resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.3.8.tgz",
"integrity": "sha512-jYvz8UMLDgy3a5SkGJne8H7VA7zPV2Lwohjx0V8V31+SqAjNmurWMkk9cQhfvlcnXWudBpK9xPM1n4rljOcHYQ=="
},
"@types/mime": { "@types/mime": {
"version": "3.0.1" "version": "3.0.1"
}, },
@@ -24583,6 +24645,11 @@
"lru-cache": { "lru-cache": {
"version": "7.18.3" "version": "7.18.3"
}, },
"luxon": {
"version": "3.4.4",
"resolved": "https://registry.npmjs.org/luxon/-/luxon-3.4.4.tgz",
"integrity": "sha512-zobTr7akeGHnv7eBOXcRgMeCP6+uyYsczwmeRCauvpvaAltgNyTbLH/+VaEAPUeWBT+1GuNmz4wC/6jtQzbbVA=="
},
"magic-string": { "magic-string": {
"version": "0.30.2", "version": "0.30.2",
"dev": true, "dev": true,

View File

@@ -72,6 +72,7 @@
"@nestjs/graphql": "^12.0.11", "@nestjs/graphql": "^12.0.11",
"@nestjs/passport": "^10.0.2", "@nestjs/passport": "^10.0.2",
"@nestjs/platform-fastify": "^10.2.9", "@nestjs/platform-fastify": "^10.2.9",
"@nestjs/schedule": "^4.0.0",
"@reduxjs/toolkit": "^1.9.5", "@reduxjs/toolkit": "^1.9.5",
"@reflet/cron": "^1.3.1", "@reflet/cron": "^1.3.1",
"@runonflux/nat-upnp": "^1.0.2", "@runonflux/nat-upnp": "^1.0.2",

View File

@@ -13,17 +13,16 @@ const makeLoggingDirectoryIfNotExists = () => {
} }
chmodSync(getters.paths()['log-base'], 0o644); chmodSync(getters.paths()['log-base'], 0o644);
console.log('here');
if ( if (
existsSync(`${getters.paths()['log-base']}/stdout.log`) && existsSync(`${getters.paths()['log-base']}/stdout.log`) &&
statSync(`${getters.paths()['log-base']}/stdout.log`).size > 50_000 statSync(`${getters.paths()['log-base']}/stdout.log`).size > 5_000_000
) { ) {
rmSync(`${getters.paths()['log-base']}/stdout.log`); rmSync(`${getters.paths()['log-base']}/stdout.log`);
} }
try { try {
rmSync(`${getters.paths()['log-base']}/stdout.log.*`); rmSync(`${getters.paths()['log-base']}/stdout.log.*`);
} catch (e) { } catch (e) {
console.log('No old logs to remove'); // Ignore Error
} }
}; };

View File

@@ -8,17 +8,19 @@ import { Module } from '@nestjs/common';
import { Reflector } from '@nestjs/core'; import { Reflector } from '@nestjs/core';
import { ACGuard, AccessControlModule } from 'nest-access-control'; import { ACGuard, AccessControlModule } from 'nest-access-control';
import { LoggerModule } from 'nestjs-pino'; import { LoggerModule } from 'nestjs-pino';
import { CronModule } from '@app/unraid-api/cron/cron.module';
@Module({ @Module({
imports: [ imports: [
LoggerModule.forRoot({ LoggerModule.forRoot({
pinoHttp: { pinoHttp: {
logger: apiLogger, logger: apiLogger,
autoLogging: false autoLogging: false,
}, },
}), }),
AccessControlModule.forRoles(setupPermissions()), AccessControlModule.forRoles(setupPermissions()),
AuthModule, AuthModule,
CronModule,
GraphModule, GraphModule,
RestModule, RestModule,
], ],
@@ -26,10 +28,7 @@ import { LoggerModule } from 'nestjs-pino';
providers: [ providers: [
{ {
provide: 'APP_GUARD', provide: 'APP_GUARD',
useFactory: () => useFactory: () => new GraphqlAuthGuard(new Reflector()),
new GraphqlAuthGuard(
new Reflector(),
),
}, },
{ {
provide: 'APP_GUARD', provide: 'APP_GUARD',

View File

@@ -0,0 +1,9 @@
import { LogCleanupService } from '@app/unraid-api/cron/log-cleanup.service';
import { Module } from '@nestjs/common';
import { ScheduleModule } from '@nestjs/schedule';
@Module({
imports: [ScheduleModule.forRoot()],
providers: [LogCleanupService],
})
export class CronModule {}

View File

@@ -0,0 +1,18 @@
import { Injectable, Logger } from '@nestjs/common';
import { Cron } from '@nestjs/schedule';
import { execa } from 'execa';
@Injectable()
export class LogCleanupService {
private readonly logger = new Logger(LogCleanupService.name);
@Cron('* * * * *')
async handleCron() {
try {
this.logger.debug('Running logrotate');
await execa(`/usr/sbin/logrotate`, ['/etc/logrotate.conf']);
} catch (error) {
this.logger.error(error);
}
}
}