From 51c19620424a66488ddf3493c0d717d20390c2d0 Mon Sep 17 00:00:00 2001 From: Juergen Kunz Date: Mon, 16 Mar 2026 03:04:57 +0000 Subject: [PATCH] fix(onebox): move Docker auto-install and swarm initialization into Onebox startup flow --- changelog.md | 7 +++++ ts/00_commitinfo_data.ts | 2 +- ts/classes/daemon.ts | 56 ------------------------------------ ts/classes/onebox.ts | 56 ++++++++++++++++++++++++++++++++++++ ts_web/00_commitinfo_data.ts | 2 +- 5 files changed, 65 insertions(+), 58 deletions(-) diff --git a/changelog.md b/changelog.md index afca5ee..c3bb7ca 100644 --- a/changelog.md +++ b/changelog.md @@ -1,5 +1,12 @@ # Changelog +## 2026-03-16 - 1.14.5 - fix(onebox) +move Docker auto-install and swarm initialization into Onebox startup flow + +- removes Docker setup from daemon service installation +- ensures Docker is installed before Docker initialization during Onebox startup +- preserves automatic Docker Swarm initialization on fresh servers + ## 2026-03-16 - 1.14.4 - fix(repo) no changes to commit diff --git a/ts/00_commitinfo_data.ts b/ts/00_commitinfo_data.ts index 3e4d5b4..8969012 100644 --- a/ts/00_commitinfo_data.ts +++ b/ts/00_commitinfo_data.ts @@ -3,6 +3,6 @@ */ export const commitinfo = { name: '@serve.zone/onebox', - version: '1.14.4', + version: '1.14.5', description: 'Self-hosted container platform with automatic SSL and DNS - a mini Heroku for single servers' } diff --git a/ts/classes/daemon.ts b/ts/classes/daemon.ts index d043ed3..a8d3c67 100644 --- a/ts/classes/daemon.ts +++ b/ts/classes/daemon.ts @@ -46,59 +46,6 @@ export class OneboxDaemon { } } - /** - * Ensure Docker is installed, installing it if necessary - */ - private async ensureDocker(): Promise { - try { - const cmd = new Deno.Command('docker', { - args: ['--version'], - stdout: 'piped', - stderr: 'piped', - }); - const result = await cmd.output(); - if (result.success) { - const version = new TextDecoder().decode(result.stdout).trim(); - logger.info(`Docker found: ${version}`); - return; - } - } catch { - // docker command not found - } - - logger.info('Docker not found. Installing Docker...'); - const installCmd = new Deno.Command('bash', { - args: ['-c', 'curl -fsSL https://get.docker.com | sh'], - stdin: 'inherit', - stdout: 'inherit', - stderr: 'inherit', - }); - const installResult = await installCmd.output(); - if (!installResult.success) { - throw new Error('Failed to install Docker. Please install it manually: curl -fsSL https://get.docker.com | sh'); - } - logger.success('Docker installed successfully'); - - // Initialize Docker Swarm - logger.info('Initializing Docker Swarm...'); - const swarmCmd = new Deno.Command('docker', { - args: ['swarm', 'init'], - stdout: 'piped', - stderr: 'piped', - }); - const swarmResult = await swarmCmd.output(); - if (swarmResult.success) { - logger.success('Docker Swarm initialized'); - } else { - const stderr = new TextDecoder().decode(swarmResult.stderr); - if (stderr.includes('already part of a swarm')) { - logger.info('Docker Swarm already initialized'); - } else { - logger.warn(`Docker Swarm init warning: ${stderr.trim()}`); - } - } - } - /** * Install systemd service */ @@ -106,9 +53,6 @@ export class OneboxDaemon { try { logger.info('Installing Onebox daemon service...'); - // Ensure Docker is installed - await this.ensureDocker(); - // Initialize smartdaemon if needed if (!this.smartdaemon) { this.smartdaemon = new plugins.smartdaemon.SmartDaemon(); diff --git a/ts/classes/onebox.ts b/ts/classes/onebox.ts index 9c2b480..2c9c360 100644 --- a/ts/classes/onebox.ts +++ b/ts/classes/onebox.ts @@ -97,6 +97,9 @@ export class Onebox { // Ensure default admin user exists await this.ensureDefaultUser(); + // Ensure Docker is installed (auto-install on fresh servers) + await this.ensureDocker(); + // Initialize Docker await this.docker.init(); @@ -221,6 +224,59 @@ export class Onebox { } } + /** + * Ensure Docker is installed, installing it if necessary + */ + private async ensureDocker(): Promise { + try { + const cmd = new Deno.Command('docker', { + args: ['--version'], + stdout: 'piped', + stderr: 'piped', + }); + const result = await cmd.output(); + if (result.success) { + const version = new TextDecoder().decode(result.stdout).trim(); + logger.info(`Docker found: ${version}`); + return; + } + } catch { + // docker command not found + } + + logger.info('Docker not found. Installing Docker...'); + const installCmd = new Deno.Command('bash', { + args: ['-c', 'curl -fsSL https://get.docker.com | sh'], + stdin: 'inherit', + stdout: 'inherit', + stderr: 'inherit', + }); + const installResult = await installCmd.output(); + if (!installResult.success) { + throw new Error('Failed to install Docker. Please install it manually: curl -fsSL https://get.docker.com | sh'); + } + logger.success('Docker installed successfully'); + + // Initialize Docker Swarm + logger.info('Initializing Docker Swarm...'); + const swarmCmd = new Deno.Command('docker', { + args: ['swarm', 'init'], + stdout: 'piped', + stderr: 'piped', + }); + const swarmResult = await swarmCmd.output(); + if (swarmResult.success) { + logger.success('Docker Swarm initialized'); + } else { + const stderr = new TextDecoder().decode(swarmResult.stderr); + if (stderr.includes('already part of a swarm')) { + logger.info('Docker Swarm already initialized'); + } else { + logger.warn(`Docker Swarm init warning: ${stderr.trim()}`); + } + } + } + /** * Check if Onebox is initialized */ diff --git a/ts_web/00_commitinfo_data.ts b/ts_web/00_commitinfo_data.ts index 3e4d5b4..8969012 100644 --- a/ts_web/00_commitinfo_data.ts +++ b/ts_web/00_commitinfo_data.ts @@ -3,6 +3,6 @@ */ export const commitinfo = { name: '@serve.zone/onebox', - version: '1.14.4', + version: '1.14.5', description: 'Self-hosted container platform with automatic SSL and DNS - a mini Heroku for single servers' }