From afbe37d7efae9a51afa388a93aa083862e53b1e3 Mon Sep 17 00:00:00 2001 From: Andrey Sobolev <haiodo@users.noreply.github.com> Date: Mon, 16 Sep 2024 15:04:05 +0700 Subject: [PATCH] UBERF-8122: Fix backup service (#6577) Signed-off-by: Andrey Sobolev <haiodo@gmail.com> --- pods/backup/package.json | 1 + server/backup/src/service.ts | 4 ++-- server/client/src/blob.ts | 7 ++++++- server/front/src/index.ts | 14 ++++++++++++-- server/server-storage/src/starter.ts | 6 +++--- server/ws/src/blobs.ts | 7 ++++++- 6 files changed, 30 insertions(+), 9 deletions(-) diff --git a/pods/backup/package.json b/pods/backup/package.json index 13f45b9e88..f3c10469ef 100644 --- a/pods/backup/package.json +++ b/pods/backup/package.json @@ -16,6 +16,7 @@ "_phase:docker-staging": "rushx docker:staging", "bundle": "mkdir -p bundle && esbuild src/index.ts --bundle --sourcemap=inline --platform=node --external:*.node --external:bufferutil --external:snappy > bundle/bundle.js", "docker:build": "../../common/scripts/docker_build.sh hardcoreeng/backup", + "docker:tbuild": "docker build -t hardcoreeng/backup . --platform=linux/amd64 && ../../common/scripts/docker_tag_push.sh hardcoreeng/backup", "docker:staging": "../../common/scripts/docker_tag.sh hardcoreeng/backup staging", "docker:push": "../../common/scripts/docker_tag.sh hardcoreeng/backup", "run-local": "cross-env ACCOUNTS_URL=http://localhost:3000/ SECRET=secret MINIO_ACCESS_KEY=minioadmin MINIO_SECRET_KEY=minioadmin MINIO_ENDPOINT=localhost BUCKET_NAME=backups INTERVAL=30 ts-node src/index.ts", diff --git a/server/backup/src/service.ts b/server/backup/src/service.ts index 6443e40f15..ecaf26d10d 100644 --- a/server/backup/src/service.ts +++ b/server/backup/src/service.ts @@ -106,7 +106,7 @@ class BackupWorker { }) const childLogger = rootCtx.logger.childLogger?.(ws.workspace, { workspace: ws.workspace, - enableConsole: 'false' + enableConsole: 'true' }) const ctx = rootCtx.newChild(ws.workspace, { workspace: ws.workspace }, {}, childLogger) try { @@ -124,7 +124,7 @@ class BackupWorker { const pipeline = await this.pipelineFactory(ctx, wsUrl, true, () => {}, null) await ctx.with('backup', { workspace: ws.workspace }, async (ctx) => { - await backup(ctx, ws.endpoint, getWorkspaceId(ws.workspace), storage, { + await backup(ctx, '', getWorkspaceId(ws.workspace), storage, { skipDomains: [], force: false, recheck: false, diff --git a/server/client/src/blob.ts b/server/client/src/blob.ts index fcf05d0e10..febeda76bb 100644 --- a/server/client/src/blob.ts +++ b/server/client/src/blob.ts @@ -173,7 +173,12 @@ export class BlobClient { } break } catch (err: any) { - if (err?.code === 'NoSuchKey') { + if ( + err?.code === 'NoSuchKey' || + err?.code === 'NotFound' || + err?.message === 'No such key' || + err?.Code === 'NoSuchKey' + ) { ctx.info('No such key', { name }) return } diff --git a/server/front/src/index.ts b/server/front/src/index.ts index 028e8fa87e..03e3d63040 100644 --- a/server/front/src/index.ts +++ b/server/front/src/index.ts @@ -135,7 +135,12 @@ async function getFileRange ( }) }) } catch (err: any) { - if (err?.code === 'NoSuchKey' || err?.code === 'NotFound') { + if ( + err?.code === 'NoSuchKey' || + err?.code === 'NotFound' || + err?.message === 'No such key' || + err?.Code === 'NoSuchKey' + ) { ctx.info('No such key', { workspace: workspace.name, uuid }) res.status(404).send() return @@ -459,7 +464,12 @@ export function start ( ) } } catch (error: any) { - if (error?.code === 'NoSuchKey' || error?.code === 'NotFound' || error?.message === 'No such key') { + if ( + error?.code === 'NoSuchKey' || + error?.code === 'NotFound' || + error?.message === 'No such key' || + error?.Code === 'NoSuchKey' + ) { ctx.error('No such storage key', { file: req.query.file, workspace: payload?.workspace, diff --git a/server/server-storage/src/starter.ts b/server/server-storage/src/starter.ts index 61c0c40b4f..97c769cac3 100644 --- a/server/server-storage/src/starter.ts +++ b/server/server-storage/src/starter.ts @@ -1,4 +1,4 @@ -import { type DatalakeConfig, DatalakeService } from '@hcengineering/datalake' +import { DatalakeService, type DatalakeConfig } from '@hcengineering/datalake' import { MinioConfig, MinioService, addMinioFallback } from '@hcengineering/minio' import { createRawMongoDBAdapter } from '@hcengineering/mongo' import { S3Service, type S3Config } from '@hcengineering/s3' @@ -30,10 +30,10 @@ import { */ -export function storageConfigFromEnv (configEnv: string = 'STORAGE_CONFIG'): StorageConfiguration { +export function storageConfigFromEnv (configEnv?: string): StorageConfiguration { const storageConfig: StorageConfiguration = { default: '', storages: [] } - const storageEnv = process.env[configEnv] + const storageEnv = configEnv ?? process.env.STORAGE_CONFIG if (storageEnv !== undefined) { parseStorageEnv(storageEnv, storageConfig) } diff --git a/server/ws/src/blobs.ts b/server/ws/src/blobs.ts index a7d6d08b7d..c55660b3a4 100644 --- a/server/ws/src/blobs.ts +++ b/server/ws/src/blobs.ts @@ -167,7 +167,12 @@ export async function getFileRange ( }) }) } catch (err: any) { - if (err?.code === 'NoSuchKey' || err?.code === 'NotFound') { + if ( + err?.code === 'NoSuchKey' || + err?.code === 'NotFound' || + err?.message === 'No such key' || + err?.Code === 'NoSuchKey' + ) { ctx.info('No such key', { workspace: workspace.name, uuid }) res.cork(() => { res.status(404)