From ae077676388cb562da41df656a51d6a88b084c1b Mon Sep 17 00:00:00 2001 From: giurgiur99 Date: Tue, 28 Apr 2026 11:17:35 +0300 Subject: [PATCH 1/2] check free build --- src/components/c2d/compute_engine_docker.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/c2d/compute_engine_docker.ts b/src/components/c2d/compute_engine_docker.ts index d420068f9..cb8bd86e5 100755 --- a/src/components/c2d/compute_engine_docker.ts +++ b/src/components/c2d/compute_engine_docker.ts @@ -1252,6 +1252,7 @@ export class C2DEngineDocker extends C2DEngine { } } if ( + isFree && algorithm.meta.container && algorithm.meta.container.dockerfile && !env.free?.allowImageBuild From a509ab0e12c760114eec359154b5b22c91e4d777 Mon Sep 17 00:00:00 2001 From: giurgiur99 Date: Tue, 28 Apr 2026 13:55:11 +0300 Subject: [PATCH 2/2] resolve paths --- .../PersistentStorageLocalFS.ts | 39 ++++++++++++++++++- 1 file changed, 37 insertions(+), 2 deletions(-) diff --git a/src/components/persistentStorage/PersistentStorageLocalFS.ts b/src/components/persistentStorage/PersistentStorageLocalFS.ts index 4c1dec0bc..0fbee02eb 100644 --- a/src/components/persistentStorage/PersistentStorageLocalFS.ts +++ b/src/components/persistentStorage/PersistentStorageLocalFS.ts @@ -3,6 +3,7 @@ import fsp from 'fs/promises' import path from 'path' import { pipeline } from 'stream/promises' import { randomUUID } from 'crypto' +import Dockerode from 'dockerode' import type { AccessList } from '../../@types/AccessList.js' import type { @@ -23,13 +24,18 @@ import { CORE_LOGGER } from '../../utils/logging/common.js' export class PersistentStorageLocalFS extends PersistentStorageFactory { /* eslint-disable security/detect-non-literal-fs-filename -- localfs backend operates on filesystem paths */ private baseFolder: string + // Host path equivalent of baseFolder, used as the Source for algorithm bind mounts. + private hostBaseFolder: string + private hostBaseFolderReady: Promise constructor(node: OceanNode) { super(node) const options = node.getConfig().persistentStorage .options as PersistentStorageLocalFSOptions - this.baseFolder = options.folder + this.baseFolder = path.resolve(options.folder) + this.hostBaseFolder = this.baseFolder + this.hostBaseFolderReady = this.detectHostBaseFolder() // Ensure base folder exists and is a directory (sync to avoid startup races). try { @@ -56,6 +62,34 @@ export class PersistentStorageLocalFS extends PersistentStorageFactory { return path.join(this.baseFolder, 'buckets', bucketId) } + // Resolve baseFolder to its host path so bind mounts use a Source the daemon + // can find. No-op outside Docker. + private async detectHostBaseFolder(): Promise { + try { + const containerId = fs.readFileSync('/etc/hostname', 'utf8').trim() + if (!containerId) return + const docker = new Dockerode({ socketPath: '/var/run/docker.sock' }) + const { Mounts = [] } = await docker.getContainer(containerId).inspect() + const covering = Mounts.filter( + (m) => + this.baseFolder === m.Destination || + this.baseFolder.startsWith(m.Destination + '/') + ).sort((a, b) => b.Destination.length - a.Destination.length)[0] + if (!covering) return + this.hostBaseFolder = path.join( + covering.Source, + path.relative(covering.Destination, this.baseFolder) + ) + CORE_LOGGER.info( + `Persistent storage host path resolved: ${this.baseFolder} -> ${this.hostBaseFolder}` + ) + } catch (e: any) { + CORE_LOGGER.debug( + `Persistent storage host path detection skipped: ${e?.message ?? e}` + ) + } + } + private async ensureBucketExists(bucketId: string): Promise { this.validateBucket(bucketId) const bucketsRoot = path.resolve(this.baseFolder, 'buckets') @@ -206,8 +240,9 @@ export class PersistentStorageLocalFS extends PersistentStorageFactory { await this.assertConsumerAllowedForBucket(consumerAddress, bucketId) } await this.ensureFileExists(bucketId, fileName) + await this.hostBaseFolderReady - const source = path.join(this.bucketPath(bucketId), fileName) + const source = path.join(this.hostBaseFolder, 'buckets', bucketId, fileName) const target = path.posix.join('/data', 'persistentStorage', bucketId, fileName) return {