From 7d8ef9ac799917ed14d7627ce281590f8db1207a Mon Sep 17 00:00:00 2001 From: Fredrik Wrede Date: Thu, 21 Aug 2025 16:10:11 +0200 Subject: [PATCH] start combiner server if run as __main__ --- config/settings-combiner.yaml.local.template | 2 ++ config/settings-combiner.yaml.template | 2 ++ docker-compose.yaml | 7 +++--- fedn/common/config.py | 1 + fedn/network/combiner/combiner.py | 24 ++++++++++++++++++++ 5 files changed, 32 insertions(+), 4 deletions(-) diff --git a/config/settings-combiner.yaml.local.template b/config/settings-combiner.yaml.local.template index 019b4319f..a41826622 100644 --- a/config/settings-combiner.yaml.local.template +++ b/config/settings-combiner.yaml.local.template @@ -5,6 +5,8 @@ host: localhost address: localhost port: 12080 max_clients: 30 +fqdn: +secure: false cert_path: tmp/server.crt key_path: tmp/server.key diff --git a/config/settings-combiner.yaml.template b/config/settings-combiner.yaml.template index f0d6d07ab..17d682605 100644 --- a/config/settings-combiner.yaml.template +++ b/config/settings-combiner.yaml.template @@ -6,6 +6,8 @@ name: combiner host: combiner port: 12080 max_clients: 30 +fqdn: +secure: false statestore: # Available DB types are MongoDB, PostgreSQL, SQLite diff --git a/docker-compose.yaml b/docker-compose.yaml index 598aad0cb..e3b6ba187 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -87,6 +87,7 @@ services: - MODELSTORAGE_CONFIG=/app/config/settings-combiner.yaml.template - HOOK_SERVICE_HOST=hook:12081 - TMPDIR=/app/tmp + - FEDN_COMBINER_CONFIG=/app/config/settings-combiner.yaml.template build: context: . args: @@ -95,11 +96,9 @@ services: working_dir: /app volumes: - ${HOST_REPO_DIR:-.}/fedn:/app/fedn + entrypoint: ["sh", "-c"] command: - - combiner - - start - - --init - - config/settings-combiner.yaml.template + - "/venv/bin/python /app/fedn/network/combiner/combiner.py" ports: - 12080:12080 healthcheck: diff --git a/fedn/common/config.py b/fedn/common/config.py index 8bb347910..74d9b8532 100644 --- a/fedn/common/config.py +++ b/fedn/common/config.py @@ -34,6 +34,7 @@ "context": os.environ.get("FEDN_OBJECT_CONTEXT_BUCKET", "fedn-context"), "prediction": os.environ.get("FEDN_OBJECT_PREDICTION_BUCKET", "fedn-prediction"), } +FEDN_COMBINER_CONFIG = os.environ.get("FEDN_COMBINER_CONFIG", os.path.join(os.path.expanduser("~"), ".fedn", "combiner.yaml")) def get_environment_config(): diff --git a/fedn/network/combiner/combiner.py b/fedn/network/combiner/combiner.py index 4ba56bf0d..3931e7d3a 100644 --- a/fedn/network/combiner/combiner.py +++ b/fedn/network/combiner/combiner.py @@ -1,4 +1,5 @@ import json +import os import queue import re import signal @@ -9,11 +10,13 @@ from enum import Enum from typing import TypedDict +import yaml from google.protobuf.json_format import MessageToDict import fedn.network.grpc.fedn_pb2 as fedn import fedn.network.grpc.fedn_pb2_grpc as rpc from fedn.common.certificate.certificate import Certificate +from fedn.common.config import FEDN_COMBINER_CONFIG, get_modelstorage_config, get_network_config, get_statestore_config from fedn.common.log_config import logger, set_log_level_from_string, set_log_stream from fedn.network.combiner.modelservice import ModelService from fedn.network.combiner.roundhandler import RoundConfig, RoundHandler @@ -959,3 +962,24 @@ def run(self): pass self.server.stop() self.server.stop() + + +if __name__ == "__main__": + if not os.path.exists(FEDN_COMBINER_CONFIG): + logger.error(f"Combiner config file {FEDN_COMBINER_CONFIG} does not exist.") + exit(1) + + modelstorage_config = get_modelstorage_config() + statestore_config = get_statestore_config() + network_id = get_network_config() + + with open(FEDN_COMBINER_CONFIG, "r") as file: + config = yaml.safe_load(file) + + config = CombinerConfig(**config) + + repository = Repository(modelstorage_config["storage_config"], storage_type=modelstorage_config["storage_type"], init_buckets=False) + db = DatabaseConnection(statestore_config, network_id) + + server = Combiner(config, repository, db) + server.run()