From b75866bbdfcc70e8a1dd5c17a1e617c7e054a2c2 Mon Sep 17 00:00:00 2001 From: Morten Olsen Date: Thu, 16 Oct 2025 14:54:52 +0200 Subject: [PATCH] feat: docker support --- .dockerignore | 6 ++++++ Dockerfile | 8 ++++++++ bin/start.js | 2 ++ docker-compose.yaml | 12 ++++++++++++ package.json | 1 + src/backbone.ts | 24 ++++++++++++++++++++++++ src/config/config.ts | 32 ++++++++++++++++++++++++++++++++ src/start.ts | 6 ++++++ src/test.ts | 11 ----------- 9 files changed, 91 insertions(+), 11 deletions(-) create mode 100644 .dockerignore create mode 100644 bin/start.js create mode 100644 docker-compose.yaml create mode 100644 src/config/config.ts create mode 100644 src/start.ts delete mode 100644 src/test.ts diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..f858f41 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,6 @@ +* +!/bin/ +!/src +!/package.json +!/pnpm-lock.yaml +!/tsconfig.json diff --git a/Dockerfile b/Dockerfile index e69de29..4369604 100644 --- a/Dockerfile +++ b/Dockerfile @@ -0,0 +1,8 @@ +FROM node:23-slim +RUN corepack enable +WORKDIR /app +COPY package.json pnpm-lock.yaml ./ +RUN pnpm install --frozen-lockfile --prod +COPY . . +RUN chmod +x /app/bin/start.js +CMD ["/app/bin/start.js"] diff --git a/bin/start.js b/bin/start.js new file mode 100644 index 0000000..709dde7 --- /dev/null +++ b/bin/start.js @@ -0,0 +1,2 @@ +#!/usr/local/bin/node --no-warnings +import '../src/start.ts'; diff --git a/docker-compose.yaml b/docker-compose.yaml new file mode 100644 index 0000000..09cb54b --- /dev/null +++ b/docker-compose.yaml @@ -0,0 +1,12 @@ +name: backbone +services: + app: + build: + context: . + environment: + HTTP_ENABLED: 'true' + TCP_ENABLED: 'true' + TOKEN_SECRET: 'test' + ports: + - 1883:1883 + - 8883:8883 diff --git a/package.json b/package.json index e399279..01ee0f1 100644 --- a/package.json +++ b/package.json @@ -2,6 +2,7 @@ "type": "module", "main": "dist/exports.js", "scripts": { + "dev": "node --no-warnings --watch src/start.ts", "test:lint": "eslint", "build": "tsc --build", "test:unit": "vitest --run --passWithNoTests", diff --git a/src/backbone.ts b/src/backbone.ts index 5468163..473e02e 100644 --- a/src/backbone.ts +++ b/src/backbone.ts @@ -1,4 +1,5 @@ import { AccessHandler } from './access/access.handler.ts'; +import { Config } from './config/config.ts'; import { K8sService } from './k8s/k8s.ts'; import { MqttServer } from './server/server.ts'; import { TopicsHandler } from './topics/topics.handler.ts'; @@ -15,6 +16,10 @@ class Backbone { return this.#services; } + public get config() { + return this.services.get(Config); + } + public get server() { return this.#services.get(MqttServer); } @@ -31,10 +36,29 @@ class Backbone { return this.#services.get(K8sService); } + public start = async () => { + if (this.config.k8s.enabled) { + await this.setupK8sOperator(); + } + if (this.config.http.enabled) { + console.log('starting http'); + const http = await this.server.getHttpServer(); + http.listen({ port: this.config.http.port, host: '0.0.0.0' }); + } + if (this.config.tcp) { + const tcp = this.server.getTcpServer(); + tcp.listen(this.config.tcp.port); + } + }; + public setupK8sOperator = async () => { await this.k8s.setup(); this.accessHandler.register('k8s', this.k8s.clients); }; + + public destroy = async () => { + await this.services.destroy(); + }; } export { Backbone }; diff --git a/src/config/config.ts b/src/config/config.ts new file mode 100644 index 0000000..be2c2a6 --- /dev/null +++ b/src/config/config.ts @@ -0,0 +1,32 @@ +class Config { + public get tokenSecret() { + return process.env.TOKEN_SECRET; + } + + public get k8s() { + const enabled = process.env.K8S_ENABLED === 'true'; + return { + enabled, + }; + } + + public get http() { + const enabled = (process.env.HTTP_ENABLED = 'true'); + const port = process.env.HTTP_PORT ? parseInt(process.env.HTTP_PORT) : 8883; + return { + enabled, + port, + }; + } + + public get tcp() { + const enabled = (process.env.TCP_ENABLED = 'true'); + const port = process.env.TCP_PORT ? parseInt(process.env.TCP_PORT) : 1883; + return { + enabled, + port, + }; + } +} + +export { Config }; diff --git a/src/start.ts b/src/start.ts new file mode 100644 index 0000000..b719b85 --- /dev/null +++ b/src/start.ts @@ -0,0 +1,6 @@ +import { Backbone } from './backbone.ts'; + +const backbone = new Backbone(); +await backbone.start(); + +console.log('started'); diff --git a/src/test.ts b/src/test.ts deleted file mode 100644 index f40f0b1..0000000 --- a/src/test.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Backbone } from './backbone.ts'; - -const backbone = new Backbone(); -await backbone.setupK8sOperator(); - -const tcp = backbone.server.getTcpServer(); -tcp.listen(1883); -const http = await backbone.server.getHttpServer(); -http.listen({ port: 8883 }); - -console.log('started');