feat: add health check endpoint and Docker health monitoring

Add a /health endpoint to the application controller and configure Docker health checks.
This enables container orchestration systems to monitor the application's liveness and readiness.
This commit is contained in:
Jp
2026-02-02 00:54:10 +08:00
parent 3dc74b6aa2
commit 39c16f5090
9 changed files with 28 additions and 2 deletions

View File

@@ -18,4 +18,7 @@ RUN npm run build
EXPOSE 3000 EXPOSE 3000
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
CMD wget --no-verbose --tries=1 --spider http://localhost:3000/health || exit 1
CMD ["npm", "start"] CMD ["npm", "start"]

Binary file not shown.

Binary file not shown.

View File

@@ -9,4 +9,7 @@ export declare class AppController {
register(): {}; register(): {};
registerPost(body: any, res: Response, req: any): Promise<void>; registerPost(body: any, res: Response, req: any): Promise<void>;
logout(req: any, res: Response): void; logout(req: any, res: Response): void;
health(): {
status: string;
};
} }

View File

@@ -64,6 +64,9 @@ let AppController = class AppController {
res.redirect('/login'); res.redirect('/login');
}); });
} }
health() {
return { status: 'ok' };
}
}; };
exports.AppController = AppController; exports.AppController = AppController;
__decorate([ __decorate([
@@ -113,6 +116,12 @@ __decorate([
__metadata("design:paramtypes", [Object, Object]), __metadata("design:paramtypes", [Object, Object]),
__metadata("design:returntype", void 0) __metadata("design:returntype", void 0)
], AppController.prototype, "logout", null); ], AppController.prototype, "logout", null);
__decorate([
(0, common_1.Get)('health'),
__metadata("design:type", Function),
__metadata("design:paramtypes", []),
__metadata("design:returntype", void 0)
], AppController.prototype, "health", null);
exports.AppController = AppController = __decorate([ exports.AppController = AppController = __decorate([
(0, common_1.Controller)(), (0, common_1.Controller)(),
__metadata("design:paramtypes", [users_service_1.UsersService]) __metadata("design:paramtypes", [users_service_1.UsersService])

View File

@@ -1 +1 @@
{"version":3,"file":"app.controller.js","sourceRoot":"","sources":["../src/app.controller.ts"],"names":[],"mappings":"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"} {"version":3,"file":"app.controller.js","sourceRoot":"","sources":["../src/app.controller.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAAoG;AAEpG,qEAAgE;AAChE,yDAAqD;AAI9C,IAAM,aAAa,GAAnB,MAAM,aAAa;IACxB,YAAoB,YAA0B;QAA1B,iBAAY,GAAZ,YAAY,CAAc;IAAG,CAAC;IAGlD,IAAI,CAAQ,GAAG,EAAS,GAAa;QACnC,IAAI,GAAG,CAAC,eAAe,EAAE,EAAE,CAAC;YAC1B,OAAO,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;QACpC,CAAC;aAAM,CAAC;YACN,OAAO,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IAID,KAAK;QACH,OAAO,EAAE,CAAC;IACZ,CAAC;IAID,SAAS,CAAQ,GAAa;QAC5B,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;IAC7B,CAAC;IAID,QAAQ;QACN,OAAO,EAAE,CAAC;IACZ,CAAC;IAGK,AAAN,KAAK,CAAC,YAAY,CAAS,IAAI,EAAS,GAAa,EAAS,GAAG;QAC/D,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;QAC1C,IAAI,CAAC;YACH,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YAC/D,IAAI,YAAY,EAAE,CAAC;gBACjB,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,yBAAyB,CAAC,CAAC;gBAC9C,OAAO,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;YACnC,CAAC;YACD,MAAM,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;YAC7D,GAAG,CAAC,KAAK,CAAC,aAAa,EAAE,uCAAuC,CAAC,CAAC;YAClE,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACzB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACnB,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,wBAAwB,CAAC,CAAC;YAC7C,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IAGD,MAAM,CAAQ,GAAG,EAAS,GAAa;QACrC,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE;YACjB,IAAI,GAAG,EAAE,CAAC;gBACR,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACrB,CAAC;YACD,GAAG,CAAC,KAAK,CAAC,aAAa,EAAE,oBAAoB,CAAC,CAAC;YAC/C,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;IACL,CAAC;IAGD,MAAM;QACJ,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IAC1B,CAAC;CACF,CAAA;AAhEY,sCAAa;AAIxB;IADC,IAAA,YAAG,GAAE;IACA,WAAA,IAAA,YAAG,GAAE,CAAA;IAAO,WAAA,IAAA,YAAG,GAAE,CAAA;;;;yCAMtB;AAID;IAFC,IAAA,YAAG,EAAC,OAAO,CAAC;IACZ,IAAA,eAAM,EAAC,OAAO,CAAC;;;;0CAGf;AAID;IAFC,IAAA,kBAAS,EAAC,iCAAc,CAAC;IACzB,IAAA,aAAI,EAAC,OAAO,CAAC;IACH,WAAA,IAAA,YAAG,GAAE,CAAA;;;;8CAEf;AAID;IAFC,IAAA,YAAG,EAAC,UAAU,CAAC;IACf,IAAA,eAAM,EAAC,UAAU,CAAC;;;;6CAGlB;AAGK;IADL,IAAA,aAAI,EAAC,UAAU,CAAC;IACG,WAAA,IAAA,aAAI,GAAE,CAAA;IAAQ,WAAA,IAAA,YAAG,GAAE,CAAA;IAAiB,WAAA,IAAA,YAAG,GAAE,CAAA;;;;iDAgB5D;AAGD;IADC,IAAA,YAAG,EAAC,QAAQ,CAAC;IACN,WAAA,IAAA,YAAG,GAAE,CAAA;IAAO,WAAA,IAAA,YAAG,GAAE,CAAA;;;;2CAQxB;AAGD;IADC,IAAA,YAAG,EAAC,QAAQ,CAAC;;;;2CAGb;wBA/DU,aAAa;IADzB,IAAA,mBAAU,GAAE;qCAEuB,4BAAY;GADnC,aAAa,CAgEzB"}

File diff suppressed because one or more lines are too long

View File

@@ -9,3 +9,9 @@ services:
environment: environment:
- PORT=3000 - PORT=3000
- NODE_ENV=production - NODE_ENV=production
healthcheck:
test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:3000/health"]
interval: 30s
timeout: 3s
retries: 3
start_period: 5s

View File

@@ -64,4 +64,9 @@ export class AppController {
res.redirect('/login'); res.redirect('/login');
}); });
} }
@Get('health')
health() {
return { status: 'ok' };
}
} }