diff --git a/packages/twenty-server/.env.example b/packages/twenty-server/.env.example index 305de015a2..90c0fb7ea2 100644 --- a/packages/twenty-server/.env.example +++ b/packages/twenty-server/.env.example @@ -50,6 +50,8 @@ FRONTEND_URL=http://localhost:3001 # APPLICATION_LOG_DRIVER=CONSOLE # LOG_LEVELS=error,warn # SERVER_URL=http://localhost:3000 +# Keep above your reverse proxy / load balancer idle timeout (nginx, ALB, ... 60s). +# SERVER_KEEP_ALIVE_TIMEOUT_MS=65000 # WORKSPACE_INACTIVE_DAYS_BEFORE_NOTIFICATION=7 # WORKSPACE_INACTIVE_DAYS_BEFORE_SOFT_DELETION=14 # WORKSPACE_INACTIVE_DAYS_BEFORE_DELETION=21 diff --git a/packages/twenty-server/src/engine/core-modules/twenty-config/config-variables.ts b/packages/twenty-server/src/engine/core-modules/twenty-config/config-variables.ts index e6d002142d..d0274845c7 100644 --- a/packages/twenty-server/src/engine/core-modules/twenty-config/config-variables.ts +++ b/packages/twenty-server/src/engine/core-modules/twenty-config/config-variables.ts @@ -1255,6 +1255,20 @@ export class ConfigVariables { @IsOptional() NODE_PORT = 3000; + @ConfigVariablesMetadata({ + group: ConfigVariablesGroup.SERVER_CONFIG, + description: + 'Idle keep-alive timeout (ms) for the HTTP server. Should be higher ' + + 'than the idle timeout of any reverse proxy / load balancer in front ' + + 'of it (nginx, ALB, ... default 60s), so the proxy is the side that ' + + 'closes idle connections.', + type: ConfigVariableType.NUMBER, + isEnvOnly: true, + }) + @CastToPositiveNumber() + @IsOptional() + SERVER_KEEP_ALIVE_TIMEOUT_MS = 65000; + @ConfigVariablesMetadata({ group: ConfigVariablesGroup.SERVER_CONFIG, description: 'Base URL for the server', diff --git a/packages/twenty-server/src/main.ts b/packages/twenty-server/src/main.ts index 121505c376..75eba83ae9 100644 --- a/packages/twenty-server/src/main.ts +++ b/packages/twenty-server/src/main.ts @@ -105,6 +105,14 @@ const bootstrap = async () => { // Inject the server url in the frontend page generateFrontConfig(); + const keepAliveTimeout = twentyConfigService.get( + 'SERVER_KEEP_ALIVE_TIMEOUT_MS', + ); + const httpServer = app.getHttpServer(); + + httpServer.keepAliveTimeout = keepAliveTimeout; + httpServer.headersTimeout = keepAliveTimeout + 1000; + await app.listen(twentyConfigService.get('NODE_PORT')); };