diff --git a/README.md b/README.md index e0ba1b2..2799ef6 100644 --- a/README.md +++ b/README.md @@ -38,7 +38,7 @@ In order to run Ironmount, you need to have Docker and Docker Compose installed ```yaml services: ironmount: - image: ghcr.io/nicotsx/ironmount:v0.4.0 + image: ghcr.io/nicotsx/ironmount:v0.5.0 container_name: ironmount restart: unless-stopped privileged: true diff --git a/apps/server/src/jobs/cleanup-dangling.ts b/apps/server/src/jobs/cleanup-dangling.ts index 53e924d..35c328c 100644 --- a/apps/server/src/jobs/cleanup-dangling.ts +++ b/apps/server/src/jobs/cleanup-dangling.ts @@ -16,7 +16,7 @@ export class CleanupDanglingMountsJob extends Job { for (const mount of allSystemMounts) { if (mount.mountPoint.includes("ironmount") && mount.mountPoint.endsWith("_data")) { - const matchingVolume = allVolumes.find((v) => getVolumePath(v.name) === mount.mountPoint); + const matchingVolume = allVolumes.find((v) => getVolumePath(v) === mount.mountPoint); if (!matchingVolume) { logger.info(`Found dangling mount at ${mount.mountPoint}, attempting to unmount...`); await executeUnmount(mount.mountPoint); @@ -33,8 +33,8 @@ export class CleanupDanglingMountsJob extends Job { const allIronmountDirs = await fs.readdir(VOLUME_MOUNT_BASE).catch(() => []); for (const dir of allIronmountDirs) { - const volumePath = getVolumePath(dir); - const matchingVolume = allVolumes.find((v) => getVolumePath(v.name) === volumePath); + const volumePath = `${VOLUME_MOUNT_BASE}/${dir}/_data`; + const matchingVolume = allVolumes.find((v) => getVolumePath(v) === volumePath); if (!matchingVolume) { const fullPath = path.join(VOLUME_MOUNT_BASE, dir); logger.info(`Found dangling mount directory at ${fullPath}, attempting to remove...`); diff --git a/apps/server/src/modules/backends/backend.ts b/apps/server/src/modules/backends/backend.ts index 4a4e015..869cb25 100644 --- a/apps/server/src/modules/backends/backend.ts +++ b/apps/server/src/modules/backends/backend.ts @@ -18,7 +18,7 @@ export type VolumeBackend = { }; export const createVolumeBackend = (volume: Volume): VolumeBackend => { - const path = getVolumePath(volume.name); + const path = getVolumePath(volume); switch (volume.config.backend) { case "nfs": { diff --git a/apps/server/src/modules/backups/backups.service.ts b/apps/server/src/modules/backups/backups.service.ts index 2c783fc..510d4ab 100644 --- a/apps/server/src/modules/backups/backups.service.ts +++ b/apps/server/src/modules/backups/backups.service.ts @@ -194,7 +194,7 @@ const executeBackup = async (scheduleId: number, manual = false) => { .where(eq(backupSchedulesTable.id, scheduleId)); try { - const volumePath = getVolumePath(volume.name); + const volumePath = getVolumePath(volume); const backupOptions: { exclude?: string[]; diff --git a/apps/server/src/modules/driver/driver.controller.ts b/apps/server/src/modules/driver/driver.controller.ts index 9bf566f..c3822aa 100644 --- a/apps/server/src/modules/driver/driver.controller.ts +++ b/apps/server/src/modules/driver/driver.controller.ts @@ -51,7 +51,7 @@ export const driverController = new Hono() const { volume } = await volumeService.getVolume(body.Name.replace(/^im-/, "")); return c.json({ - Mountpoint: getVolumePath(volume.name), + Mountpoint: getVolumePath(volume), }); }) .post("/VolumeDriver.Get", async (c) => { @@ -66,7 +66,7 @@ export const driverController = new Hono() return c.json({ Volume: { Name: `im-${volume.name}`, - Mountpoint: getVolumePath(volume.name), + Mountpoint: getVolumePath(volume), Status: {}, }, Err: "", @@ -77,7 +77,7 @@ export const driverController = new Hono() const res = volumes.map((volume) => ({ Name: `im-${volume.name}`, - Mountpoint: getVolumePath(volume.name), + Mountpoint: getVolumePath(volume), Status: {}, })); diff --git a/apps/server/src/modules/volumes/helpers.ts b/apps/server/src/modules/volumes/helpers.ts index ee24aee..bb27265 100644 --- a/apps/server/src/modules/volumes/helpers.ts +++ b/apps/server/src/modules/volumes/helpers.ts @@ -1,5 +1,10 @@ import { VOLUME_MOUNT_BASE } from "../../core/constants"; +import type { Volume } from "../../db/schema"; -export const getVolumePath = (name: string) => { - return `${VOLUME_MOUNT_BASE}/${name}/_data`; +export const getVolumePath = (volume: Volume) => { + if (volume.config.backend === "directory") { + return volume.config.path; + } + + return `${VOLUME_MOUNT_BASE}/${volume.name}/_data`; }; diff --git a/apps/server/src/modules/volumes/volume.controller.ts b/apps/server/src/modules/volumes/volume.controller.ts index 448d3b8..2087797 100644 --- a/apps/server/src/modules/volumes/volume.controller.ts +++ b/apps/server/src/modules/volumes/volume.controller.ts @@ -39,7 +39,7 @@ export const volumeController = new Hono() const response = { ...res.volume, - path: getVolumePath(res.volume.name), + path: getVolumePath(res.volume), }; return c.json(response, 201); @@ -63,7 +63,7 @@ export const volumeController = new Hono() const response = { volume: { ...res.volume, - path: getVolumePath(res.volume.name), + path: getVolumePath(res.volume), }, statfs: { total: res.statfs.total ?? 0, @@ -87,7 +87,7 @@ export const volumeController = new Hono() const response = { ...res.volume, - path: getVolumePath(res.volume.name), + path: getVolumePath(res.volume), }; return c.json(response, 200); diff --git a/apps/server/src/modules/volumes/volume.service.ts b/apps/server/src/modules/volumes/volume.service.ts index bf64a7b..d672ddf 100644 --- a/apps/server/src/modules/volumes/volume.service.ts +++ b/apps/server/src/modules/volumes/volume.service.ts @@ -128,7 +128,7 @@ const getVolume = async (name: string) => { let statfs: Partial = {}; if (volume.status === "mounted") { - statfs = await getStatFs(getVolumePath(name)).catch(() => ({})); + statfs = await getStatFs(getVolumePath(volume)).catch(() => ({})); } return { volume, statfs }; @@ -292,7 +292,7 @@ const listFiles = async (name: string, subPath?: string) => { } // For directory volumes, use the configured path directly - const volumePath = volume.config.backend === "directory" ? volume.config.path : getVolumePath(volume.name); + const volumePath = getVolumePath(volume); const requestedPath = subPath ? path.join(volumePath, subPath) : volumePath;