fix: get correct volume path for directories

This commit is contained in:
Nicolas Meienberger
2025-11-08 11:18:52 +01:00
parent 11dd6f46c8
commit 1c4b1f34dd
8 changed files with 21 additions and 16 deletions

View File

@@ -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

View File

@@ -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...`);

View File

@@ -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": {

View File

@@ -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[];

View File

@@ -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: {},
}));

View File

@@ -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`;
};

View File

@@ -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<CreateVolumeDto>(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<UpdateVolumeDto>(response, 200);

View File

@@ -128,7 +128,7 @@ const getVolume = async (name: string) => {
let statfs: Partial<StatFs> = {};
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;