Browse Source
Feature/graceful shutdown (#8035)
* Graceful shutdown of the server
* Update changelog
pull/8044/head
Thomas Kaul
4 days ago
committed by
GitHub
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with
22 additions and
6 deletions
-
CHANGELOG.md
-
apps/api/src/main.ts
-
apps/api/src/services/prisma/prisma.service.ts
-
docker/docker-compose.yml
|
|
@ -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 |
|
|
|
|
|
@ -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 |
|
|
|
|
|
@ -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(); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
@ -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: |
|
|
|