diff --git a/components/ee/db-sync/leeway.Dockerfile b/components/ee/db-sync/leeway.Dockerfile index 7298160ca4772e..7bc56623204b57 100644 --- a/components/ee/db-sync/leeway.Dockerfile +++ b/components/ee/db-sync/leeway.Dockerfile @@ -2,13 +2,13 @@ # Licensed under the Gitpod Enterprise Source Code License, # See License.enterprise.txt in the project root folder. -FROM node:12.18.3-slim as builder +FROM node:12.22.1-slim as builder COPY components-ee-db-sync--app /installer/ WORKDIR /app RUN /installer/install.sh -FROM node:12.18.3-slim +FROM node:12.22.1-slim # '--no-log-init': see https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#user RUN useradd --no-log-init --create-home --uid 31002 --home-dir /app/ unode COPY --from=builder /app /app/ diff --git a/components/gitpod-protocol/src/util/grpc.ts b/components/gitpod-protocol/src/util/grpc.ts new file mode 100644 index 00000000000000..5c7bfd2c2dd044 --- /dev/null +++ b/components/gitpod-protocol/src/util/grpc.ts @@ -0,0 +1,15 @@ +/** + * Copyright (c) 2021 Gitpod GmbH. All rights reserved. + * Licensed under the GNU Affero General Public License (AGPL). + * See License-AGPL.txt in the project root for license information. + */ + + export const defaultGRPCOptions = { + "grpc.keepalive_timeout_ms": 1000, + "grpc.keepalive_time_ms": 5000, + "grpc.http2.min_time_between_pings_ms": 1000, + "grpc.keepalive_permit_without_calls": 1, + "grpc-node.max_session_memory": 50, + "grpc.max_reconnect_backoff_ms": 5000, + "grpc.max_receive_message_length": 1024 * 1024 * 16, +}; diff --git a/components/server/leeway.Dockerfile b/components/server/leeway.Dockerfile index effeacded04dd3..4f8931b6318aab 100644 --- a/components/server/leeway.Dockerfile +++ b/components/server/leeway.Dockerfile @@ -2,7 +2,7 @@ # Licensed under the GNU Affero General Public License (AGPL). # See License-AGPL.txt in the project root for license information. -FROM node:12.18.3-slim as builder +FROM node:12.22.1-slim as builder RUN apt-get update && apt-get install -y build-essential python @@ -12,7 +12,7 @@ WORKDIR /app RUN /installer/install.sh -FROM node:12.18.3-slim +FROM node:12.22.1-slim # Using ssh-keygen for RSA keypair generation RUN apt-get update && apt-get install -yq \ diff --git a/components/server/src/container-module.ts b/components/server/src/container-module.ts index 9e350d0f064ecf..e0b7f821cd1561 100644 --- a/components/server/src/container-module.ts +++ b/components/server/src/container-module.ts @@ -80,6 +80,7 @@ import { ProjectsService } from './projects/projects-service'; import { NewsletterSubscriptionController } from './user/newsletter-subscription-controller'; import { Config, ConfigFile } from './config'; import { Env } from './env'; +import { defaultGRPCOptions } from '@gitpod/gitpod-protocol/lib/util/grpc'; export const productionContainerModule = new ContainerModule((bind, unbind, isBound, rebind) => { bind(Env).toSelf().inSingletonScope(); @@ -183,25 +184,29 @@ export const productionContainerModule = new ContainerModule((bind, unbind, isBo bind(TermsProvider).toSelf().inSingletonScope(); + const grpcOptions: grpc.ClientOptions = { + ...defaultGRPCOptions, + }; + bind(ContentServiceClient).toDynamicValue(ctx => { const config = ctx.container.get(Config); - return new ContentServiceClient(config.contentServiceAddr, grpc.credentials.createInsecure()); + return new ContentServiceClient(config.contentServiceAddr, grpc.credentials.createInsecure(), grpcOptions); }); bind(BlobServiceClient).toDynamicValue(ctx => { const config = ctx.container.get(Config); - return new BlobServiceClient(config.contentServiceAddr, grpc.credentials.createInsecure()); + return new BlobServiceClient(config.contentServiceAddr, grpc.credentials.createInsecure(), grpcOptions); }); bind(WorkspaceServiceClient).toDynamicValue(ctx => { const config = ctx.container.get(Config); - return new WorkspaceServiceClient(config.contentServiceAddr, grpc.credentials.createInsecure()); + return new WorkspaceServiceClient(config.contentServiceAddr, grpc.credentials.createInsecure(), grpcOptions); }); bind(IDEPluginServiceClient).toDynamicValue(ctx => { const config = ctx.container.get(Config); - return new IDEPluginServiceClient(config.contentServiceAddr, grpc.credentials.createInsecure()); + return new IDEPluginServiceClient(config.contentServiceAddr, grpc.credentials.createInsecure(), grpcOptions); }); bind(HeadlessLogServiceClient).toDynamicValue(ctx => { const config = ctx.container.get(Config); - return new HeadlessLogServiceClient(config.contentServiceAddr, grpc.credentials.createInsecure()); + return new HeadlessLogServiceClient(config.contentServiceAddr, grpc.credentials.createInsecure(), grpcOptions); }); bind(StorageClient).to(ContentServiceStorageClient).inSingletonScope(); diff --git a/components/ws-manager-api/typescript/src/client-provider.ts b/components/ws-manager-api/typescript/src/client-provider.ts index 26c14206fee354..14c5c430382dd7 100644 --- a/components/ws-manager-api/typescript/src/client-provider.ts +++ b/components/ws-manager-api/typescript/src/client-provider.ts @@ -12,6 +12,7 @@ import { Disposable, User, Workspace, WorkspaceInstance } from "@gitpod/gitpod-p import { WorkspaceClusterWoTLS, WorkspaceManagerConnectionInfo } from '@gitpod/gitpod-protocol/lib/workspace-cluster'; import { WorkspaceManagerClientProviderCompositeSource, WorkspaceManagerClientProviderSource } from "./client-provider-source"; import { log } from '@gitpod/gitpod-protocol/lib/util/logging'; +import { defaultGRPCOptions } from '@gitpod/gitpod-protocol/lib/util/grpc'; @injectable() export class WorkspaceManagerClientProvider implements Disposable { @@ -31,7 +32,10 @@ export class WorkspaceManagerClientProvider implements Disposable { public async getStartManager(user: User, workspace: Workspace, instance: WorkspaceInstance): Promise<{ manager: PromisifiedWorkspaceManagerClient, installation: string}> { const availableCluster = await this.getAvailableStartCluster(user, workspace, instance); const chosenCluster = chooseCluster(availableCluster); - const client = await this.get(chosenCluster.name); + const grpcOptions: grpc.ClientOptions = { + ...defaultGRPCOptions, + }; + const client = await this.get(chosenCluster.name, grpcOptions); return { manager: client, installation: chosenCluster.name, diff --git a/components/ws-manager-bridge/src/bridge-controller.ts b/components/ws-manager-bridge/src/bridge-controller.ts index 9db34f30ae170a..c31db43ec64616 100644 --- a/components/ws-manager-bridge/src/bridge-controller.ts +++ b/components/ws-manager-bridge/src/bridge-controller.ts @@ -13,6 +13,8 @@ import { log } from '@gitpod/gitpod-protocol/lib/util/logging'; import { TLSConfig, WorkspaceClusterDB, WorkspaceClusterWoTLS } from "@gitpod/gitpod-protocol/lib/workspace-cluster"; import { WorkspaceCluster } from "@gitpod/gitpod-protocol/lib/workspace-cluster"; import { Queue } from "@gitpod/gitpod-protocol"; +import { defaultGRPCOptions } from '@gitpod/gitpod-protocol/lib/util/grpc'; +import * as grpc from '@grpc/grpc-js'; @injectable() export class BridgeController { @@ -84,16 +86,10 @@ export class BridgeController { protected async createAndStartBridge(cluster: WorkspaceClusterInfo): Promise { const bridge = this.bridgeFactory() as WorkspaceManagerBridge; + const grpcOptions: grpc.ClientOptions = { + ...defaultGRPCOptions, + }; const clientProvider = async () => { - const grpcOptions = { - "grpc.keepalive_timeout_ms": 1000, - "grpc.keepalive_time_ms": 5000, - "grpc.http2.min_time_between_pings_ms": 1000, - "grpc.keepalive_permit_without_calls": 1, - "grpc-node.max_session_memory": 50, - "grpc.max_reconnect_backoff_ms": 5000, - }; - return this.clientProvider.get(cluster.name, grpcOptions); } bridge.start(cluster, clientProvider);