Browse Source

Feature/graceful shutdown (#8035)

* Graceful shutdown of the server

* Update changelog
pull/8044/head
Thomas Kaul 4 days ago
committed by GitHub
parent
commit
b86034108a
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 6
      CHANGELOG.md
  2. 9
      apps/api/src/main.ts
  3. 12
      apps/api/src/services/prisma/prisma.service.ts
  4. 1
      docker/docker-compose.yml

6
CHANGELOG.md

@ -10,6 +10,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Added ### Added
- Extended the _Public API_ with the liveness probe endpoint (`GET api/v1/health/liveness`) (experimental) - Extended the _Public API_ with the liveness probe endpoint (`GET api/v1/health/liveness`) (experimental)
- Added the graceful shutdown of the server on `SIGINT` and `SIGTERM`
- Added `stop_grace_period` to the _Ghostfolio_ service in the `docker-compose` file (`docker-compose.yml`)
### Changed ### Changed
@ -21,6 +23,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Fixed the asset profile of the activities after a fee, an interest or a liability with the same symbol in the activities import - Fixed the asset profile of the activities after a fee, an interest or a liability with the same symbol in the activities import
### Todo
- Add `stop_grace_period: 1m` to the _Ghostfolio_ service in your `docker-compose` file (see `docker-compose.yml`)
## 3.78.0 - 2026-10-03 ## 3.78.0 - 2026-10-03
### Added ### Added

9
apps/api/src/main.ts

@ -14,6 +14,7 @@ import {
import { import {
Logger, Logger,
LogLevel, LogLevel,
ShutdownSignal,
ValidationPipe, ValidationPipe,
VersioningType VersioningType
} from '@nestjs/common'; } from '@nestjs/common';
@ -65,6 +66,14 @@ async function bootstrap() {
}); });
app.enableCors(); app.enableCors();
// Let the open requests and the active queue jobs finish on SIGINT and
// SIGTERM before the process stops. Exit explicitly because Linux ignores
// the re-raised signal if the process runs as PID 1
app.enableShutdownHooks([ShutdownSignal.SIGINT, ShutdownSignal.SIGTERM], {
useProcessExit: true
});
app.enableVersioning({ app.enableVersioning({
defaultVersion: '1', defaultVersion: '1',
type: VersioningType.URI type: VersioningType.URI

12
apps/api/src/services/prisma/prisma.service.ts

@ -2,7 +2,7 @@ import {
Injectable, Injectable,
Logger, Logger,
LogLevel, LogLevel,
OnModuleDestroy, OnApplicationShutdown,
OnModuleInit OnModuleInit
} from '@nestjs/common'; } from '@nestjs/common';
import { ConfigService } from '@nestjs/config'; import { ConfigService } from '@nestjs/config';
@ -12,7 +12,7 @@ import { Prisma, PrismaClient } from '@prisma/client';
@Injectable() @Injectable()
export class PrismaService export class PrismaService
extends PrismaClient extends PrismaClient
implements OnModuleInit, OnModuleDestroy implements OnApplicationShutdown, OnModuleInit
{ {
private readonly logger = new Logger(PrismaService.name); private readonly logger = new Logger(PrismaService.name);
@ -41,6 +41,10 @@ export class PrismaService
}); });
} }
public async onApplicationShutdown() {
await this.$disconnect();
}
public async onModuleInit() { public async onModuleInit() {
try { try {
await this.$connect(); await this.$connect();
@ -48,8 +52,4 @@ export class PrismaService
this.logger.error(error); this.logger.error(error);
} }
} }
public async onModuleDestroy() {
await this.$disconnect();
}
} }

1
docker/docker-compose.yml

@ -5,6 +5,7 @@ services:
container_name: ghostfolio container_name: ghostfolio
restart: unless-stopped restart: unless-stopped
init: true init: true
stop_grace_period: 1m
cap_drop: cap_drop:
- ALL - ALL
security_opt: security_opt:

Loading…
Cancel
Save