From a44b88e72c77af0b6950899093d0d64361a16f6a Mon Sep 17 00:00:00 2001 From: Jake Turner Date: Tue, 18 Nov 2025 16:34:01 -0800 Subject: [PATCH] feat: kolibri app --- admin/app/services/docker_service.ts | 1 + admin/database/seeders/service_seeder.ts | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/admin/app/services/docker_service.ts b/admin/app/services/docker_service.ts index e5b12bb..9cf1564 100644 --- a/admin/app/services/docker_service.ts +++ b/admin/app/services/docker_service.ts @@ -20,6 +20,7 @@ export class DockerService { public static OPEN_WEBUI_SERVICE_NAME = 'nomad_open_webui'; public static CYBERCHEF_SERVICE_NAME = 'nomad_cyberchef'; public static FLATNOTES_SERVICE_NAME = 'nomad_flatnotes'; + public static KOLIBRI_SERVICE_NAME = 'nomad_kolibri'; public static NOMAD_STORAGE_ABS_PATH = '/opt/project-nomad/storage'; constructor() { diff --git a/admin/database/seeders/service_seeder.ts b/admin/database/seeders/service_seeder.ts index 623932a..b6fc3c4 100644 --- a/admin/database/seeders/service_seeder.ts +++ b/admin/database/seeders/service_seeder.ts @@ -121,6 +121,25 @@ export default class ServiceSeeder extends BaseSeeder { is_dependency_service: false, depends_on: null, }, + { + service_name: DockerService.KOLIBRI_SERVICE_NAME, + friendly_name: 'Kolibri', + description: 'An offline-first education platform for schools and learners', + container_image: 'treehouses/kolibri:latest', + container_command: null, + container_config: JSON.stringify({ + HostConfig: { + RestartPolicy: { Name: 'unless-stopped' }, + PortBindings: { '8080/tcp': [{ HostPort: '8300' }] }, + Binds: [`${DockerService.NOMAD_STORAGE_ABS_PATH}/kolibri:/root/.kolibri`] + }, + ExposedPorts: { '8080/tcp': {} }, + }), + ui_location: '8300', + installed: false, + is_dependency_service: false, + depends_on: null, + }, ] async run() {