From 7d566cd921f418f1db7dec9609952fdcfe85712e Mon Sep 17 00:00:00 2001 From: LD-Reborn Date: Sun, 15 Jun 2025 13:56:55 +0200 Subject: [PATCH] Added Docker support for the Indexer --- README.md | 1 + docs/Indexer.md | 6 ++++ src/Indexer/Dockerfile | 14 +++++++++ src/Indexer/Scripts/example.py | 2 +- src/Indexer/appsettings.Development.json | 4 +-- src/Indexer/appsettings.Docker.json | 37 ++++++++++++++++++++++++ src/Indexer/appsettings.Production.json | 29 +++++++++++++++++++ src/Server/appsettings.Development.json | 2 +- 8 files changed, 91 insertions(+), 4 deletions(-) create mode 100644 src/Indexer/Dockerfile create mode 100644 src/Indexer/appsettings.Docker.json create mode 100644 src/Indexer/appsettings.Production.json diff --git a/README.md b/README.md index e0bd8cc..3ee3869 100644 --- a/README.md +++ b/README.md @@ -26,6 +26,7 @@ This repository comes with 1. By injecting IConfiguration (e.g. `services.AddSingleton();`) 2. By specifying the baseUri, apiKey, and searchdomain (e.g. `new Client.Client(baseUri, apiKey, searchdomain)`) ## Indexer +(Docker now available! See [Docker installation](docs/Indexer.md#docker-installation)) 1. [Install the dependencies](docs/Indexer.md#installing-the-dependencies) 2. [Set up the server](#server) 3. [Configure the indexer](docs/Indexer.md#configuration) diff --git a/docs/Indexer.md b/docs/Indexer.md index 1e955fc..ae3ee05 100644 --- a/docs/Indexer.md +++ b/docs/Indexer.md @@ -6,6 +6,12 @@ The indexer by default - Uses Elmah error logging (endpoint: `/elmah`, local files: `~/logs`) - Uses serilog logging (local files: `~/logs`) - Uses HealthChecks (endpoint: `/healthz`) +## Docker installation +(On Linux you might need root privileges, thus use `sudo` where necessary) +1. Navigate to the `src` directory +2. Build the docker container: `docker build -t indexer -f Indexer/Dockerfile .` +3. Run the docker container: `docker run -t indexer` (the `-t` is optional, but you get more meaningful output) + ## Installing the dependencies ## Ubuntu 24.04 1. Install the .NET SDK: `sudo apt update && sudo apt install dotnet-sdk-8.0 -y` diff --git a/src/Indexer/Dockerfile b/src/Indexer/Dockerfile new file mode 100644 index 0000000..c44d5e9 --- /dev/null +++ b/src/Indexer/Dockerfile @@ -0,0 +1,14 @@ +FROM ubuntu:24.04 AS ubuntu +WORKDIR /app +RUN apt-get update +RUN apt-get install -y python3.12 python3.12-venv python3.12-dev dotnet-sdk-8.0 +RUN apt-get clean +COPY . /src/ +ENV ASPNETCORE_ENVIRONMENT Docker +RUN rm /src/Server/appsettings* +RUN dotnet build /src/Indexer/Indexer.csproj +RUN dotnet publish /src/Indexer/Indexer.csproj -c Release -o /app +RUN cp -r /src/Indexer/Scripts /app/Scripts +RUN rm -r /src +ENV PYTHONIOENCODING=utf8 +ENTRYPOINT ["./Indexer"] \ No newline at end of file diff --git a/src/Indexer/Scripts/example.py b/src/Indexer/Scripts/example.py index 6687250..79c83ac 100644 --- a/src/Indexer/Scripts/example.py +++ b/src/Indexer/Scripts/example.py @@ -40,7 +40,7 @@ def index_files(toolset: Toolset): jsonEntities:list = [] for filename in os.listdir(example_content): qualified_filepath = example_content + "/" + filename - with open(qualified_filepath, "r") as file: + with open(qualified_filepath, "r", encoding='utf-8') as file: title = file.readline() text = file.read() datapoints:list = [ diff --git a/src/Indexer/appsettings.Development.json b/src/Indexer/appsettings.Development.json index dfee006..9ac9d3d 100644 --- a/src/Indexer/appsettings.Development.json +++ b/src/Indexer/appsettings.Development.json @@ -12,7 +12,7 @@ "Worker": [ { - "Name": "example", + "Name": "pythonExample", "Searchdomains": [ "example" ], @@ -20,7 +20,7 @@ "Calls": [ { "Type": "interval", - "Interval": 60000 + "Interval": 30000 } ] } diff --git a/src/Indexer/appsettings.Docker.json b/src/Indexer/appsettings.Docker.json new file mode 100644 index 0000000..8bbd13a --- /dev/null +++ b/src/Indexer/appsettings.Docker.json @@ -0,0 +1,37 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "Kestrel":{ + "Endpoints": { + "http":{ + "Url": "http://0.0.0.0:5120" + } + } + }, + "Embeddingsearch": { + "BaseUri": "http://172.17.0.1:5146", + "ApiKeys": ["b54ea868-496e-11f0-9cc7-f79f06b160e5", "bbdeedf0-496e-11f0-9744-97e28c221f67"] + }, + "EmbeddingsearchIndexer": { + "Worker": + [ + { + "Name": "pythonExample", + "Searchdomains": [ + "example" + ], + "Script": "Scripts/example.py", + "Calls": [ + { + "Type": "interval", + "Interval": 30000 + } + ] + } + ] + } +} diff --git a/src/Indexer/appsettings.Production.json b/src/Indexer/appsettings.Production.json new file mode 100644 index 0000000..c704ad4 --- /dev/null +++ b/src/Indexer/appsettings.Production.json @@ -0,0 +1,29 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "Embeddingsearch": { + "BaseUri": "http://localhost:5146" + }, + "EmbeddingsearchIndexer": { + "Worker": + [ + { + "Name": "pythonExample", + "Searchdomains": [ + "example" + ], + "Script": "Scripts/example.py", + "Calls": [ + { + "Type": "interval", + "Interval": 30000 + } + ] + } + ] + } +} diff --git a/src/Server/appsettings.Development.json b/src/Server/appsettings.Development.json index 10b5fd8..4ca93cb 100644 --- a/src/Server/appsettings.Development.json +++ b/src/Server/appsettings.Development.json @@ -8,7 +8,7 @@ "Kestrel":{ "Endpoints": { "http":{ - "Url": "http://localhost:5146" + "Url": "http://0.0.0.0:5146" } } },