From d86c78dba5770b213ef090ea3985646b9c0d37ed Mon Sep 17 00:00:00 2001 From: Chris Sherwood Date: Sun, 18 Jan 2026 17:24:07 -0800 Subject: [PATCH] feat: Add Windows Docker Desktop support for local development - Detect Windows platform and use named pipe (//./pipe/docker_engine) instead of Unix socket for Docker Desktop compatibility - Add NOMAD_STORAGE_PATH environment variable for configurable storage paths across different platforms - Update seeder to use environment variable with Linux default - Document new environment variable in .env.example This enables local development on Windows machines with Docker Desktop while maintaining Linux production compatibility. Co-Authored-By: Claude Opus 4.5 --- admin/.env.example | 8 +++++++- admin/app/services/docker_service.ts | 10 +++++++++- admin/database/seeders/service_seeder.ts | 4 +++- 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/admin/.env.example b/admin/.env.example index 6ae2d58..05a03fd 100644 --- a/admin/.env.example +++ b/admin/.env.example @@ -9,4 +9,10 @@ DB_PORT=3306 DB_USER=root DB_DATABASE=nomad DB_PASSWORD=password -DB_SSL=false \ No newline at end of file +DB_SSL=false +REDIS_HOST=localhost +REDIS_PORT=6379 +# Storage path for NOMAD content (ZIM files, maps, etc.) +# On Windows dev, use an absolute path like: C:/nomad-storage +# On Linux production, use: /opt/project-nomad/storage +NOMAD_STORAGE_PATH=/opt/project-nomad/storage \ No newline at end of file diff --git a/admin/app/services/docker_service.ts b/admin/app/services/docker_service.ts index 80947d3..9b0d959 100644 --- a/admin/app/services/docker_service.ts +++ b/admin/app/services/docker_service.ts @@ -19,7 +19,15 @@ export class DockerService { public static KOLIBRI_SERVICE_NAME = 'nomad_kolibri' constructor() { - this.docker = new Docker({ socketPath: '/var/run/docker.sock' }) + // Support both Linux (production) and Windows (development with Docker Desktop) + const isWindows = process.platform === 'win32' + if (isWindows) { + // Windows Docker Desktop uses named pipe + this.docker = new Docker({ socketPath: '//./pipe/docker_engine' }) + } else { + // Linux uses Unix socket + this.docker = new Docker({ socketPath: '/var/run/docker.sock' }) + } } async affectContainer( diff --git a/admin/database/seeders/service_seeder.ts b/admin/database/seeders/service_seeder.ts index 1675a6d..4c18204 100644 --- a/admin/database/seeders/service_seeder.ts +++ b/admin/database/seeders/service_seeder.ts @@ -2,9 +2,11 @@ import Service from '#models/service' import { DockerService } from '#services/docker_service' import { BaseSeeder } from '@adonisjs/lucid/seeders' import { ModelAttributes } from '@adonisjs/lucid/types/model' +import env from '#start/env' export default class ServiceSeeder extends BaseSeeder { - private static NOMAD_STORAGE_ABS_PATH = '/opt/project-nomad/storage' + // Use environment variable with fallback to production default + private static NOMAD_STORAGE_ABS_PATH = env.get('NOMAD_STORAGE_PATH', '/opt/project-nomad/storage') private static DEFAULT_SERVICES: Omit, 'created_at' | 'updated_at' | 'metadata' | 'id'>[] = [ { service_name: DockerService.KIWIX_SERVICE_NAME,