mirror of
https://github.com/unraid/api.git
synced 2026-01-06 08:39:54 -06:00
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:
@@ -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]
|
||||||
|
|||||||
@@ -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
67
api/package-lock.json
generated
@@ -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,
|
||||||
|
|||||||
@@ -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",
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -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',
|
||||||
|
|||||||
9
api/src/unraid-api/cron/cron.module.ts
Normal file
9
api/src/unraid-api/cron/cron.module.ts
Normal 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 {}
|
||||||
18
api/src/unraid-api/cron/log-cleanup.service.ts
Normal file
18
api/src/unraid-api/cron/log-cleanup.service.ts
Normal 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user