import { i18n } from './i18n' import { sdk } from './sdk' import { uiPort } from './utils' import { sparkConfigYaml } from './fileModels/sparkConfig.yaml' export const main = sdk.setupMain(async ({ effects }) => { console.info(i18n('Starting Spark Control…')) // Reactively read SSH targets from the user-configured yaml file. // Changing this file via the "Configure Sparks" action restarts the daemon. const cfg = (await sparkConfigYaml.read().const(effects)) ?? { spark1_host: '', spark1_user: '', spark2_host: '', spark2_user: '', parakeet_host: '', parakeet_user: '', parakeet_container: '', magpie_host: '', magpie_user: '', magpie_container: '', } return sdk.Daemons.of(effects).addDaemon('primary', { subcontainer: await sdk.SubContainer.of( effects, { imageId: 'spark-control' }, sdk.Mounts.of().mountVolume({ volumeId: 'main', subpath: null, mountpoint: '/data', readonly: false, }), 'spark-control-sub', ), exec: { command: ['/app/entrypoint.sh'], env: { SPARK1_HOST: cfg.spark1_host, SPARK1_USER: cfg.spark1_user, SPARK2_HOST: cfg.spark2_host, SPARK2_USER: cfg.spark2_user, PARAKEET_HOST: cfg.parakeet_host, PARAKEET_USER: cfg.parakeet_user, PARAKEET_CONTAINER: cfg.parakeet_container, MAGPIE_HOST: cfg.magpie_host, MAGPIE_USER: cfg.magpie_user, MAGPIE_CONTAINER: cfg.magpie_container, MODELS_OVERRIDES: '/data/models-overrides.yaml', BIND_PORT: String(uiPort), }, }, ready: { display: i18n('Web Interface'), fn: () => sdk.healthCheck.checkPortListening(effects, uiPort, { successMessage: i18n('The web interface is ready'), errorMessage: i18n('The web interface is not ready'), }), }, requires: [], }) })