From 957ec8731329643cecd3aae8e1f72f4bbd340f27 Mon Sep 17 00:00:00 2001 From: Leendert de Borst Date: Sat, 8 Jun 2024 01:03:08 +0200 Subject: [PATCH] Update docker compose for multiple projects --- .dockerignore | 25 +++++++++++ docker-compose.yml | 26 +++++++++++- src/AliasVault.Api/AliasVault.Api.csproj | 11 +++++ src/AliasVault.Api/Dockerfile | 41 +++++++++++++++++++ .../AliasVault.Api/entrypoint.sh | 4 +- .../AliasVault.WebApp.csproj | 10 +++++ src/AliasVault.WebApp/Dockerfile | 39 ++++++++++++++++++ src/AliasVault.WebApp/Program.cs | 5 ++- src/AliasVault.WebApp/entrypoint.sh | 8 ++++ src/AliasVault.WebApp/nginx.conf | 13 ++++++ .../wwwroot/appsettings.json | 11 +---- src/AliasVault/.dockerignore | 25 +++++++++++ Dockerfile => src/AliasVault/Dockerfile | 13 ++---- 13 files changed, 206 insertions(+), 25 deletions(-) create mode 100644 .dockerignore create mode 100644 src/AliasVault.Api/Dockerfile rename entrypoint.sh => src/AliasVault.Api/entrypoint.sh (68%) create mode 100644 src/AliasVault.WebApp/Dockerfile create mode 100644 src/AliasVault.WebApp/entrypoint.sh create mode 100644 src/AliasVault.WebApp/nginx.conf create mode 100644 src/AliasVault/.dockerignore rename Dockerfile => src/AliasVault/Dockerfile (71%) diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 000000000..cd967fc3a --- /dev/null +++ b/.dockerignore @@ -0,0 +1,25 @@ +**/.dockerignore +**/.env +**/.git +**/.gitignore +**/.project +**/.settings +**/.toolstarget +**/.vs +**/.vscode +**/.idea +**/*.*proj.user +**/*.dbmdl +**/*.jfm +**/azds.yaml +**/bin +**/charts +**/docker-compose* +**/Dockerfile* +**/node_modules +**/npm-debug.log +**/obj +**/secrets.dev.yaml +**/values.dev.yaml +LICENSE +README.md \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index 0bffcd91a..a22f77391 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,11 +1,33 @@ services: - blazorapp: + wasm: image: aliasvault build: context: . - dockerfile: Dockerfile + dockerfile: src/AliasVault.WebApp/Dockerfile ports: - "80:8080" + restart: always + environment: + - API_URL=http://localhost:81 + + server: + image: aliasvault-server + build: + context: . + dockerfile: src/AliasVault/Dockerfile + ports: + - "82:8082" + volumes: + - ./database:/database + restart: always + + api: + image: aliasvault-api + build: + context: . + dockerfile: src/AliasVault.Api/Dockerfile + ports: + - "81:8081" volumes: - ./database:/database restart: always diff --git a/src/AliasVault.Api/AliasVault.Api.csproj b/src/AliasVault.Api/AliasVault.Api.csproj index 0d671f9e6..fa7343c68 100644 --- a/src/AliasVault.Api/AliasVault.Api.csproj +++ b/src/AliasVault.Api/AliasVault.Api.csproj @@ -5,10 +5,15 @@ enable enable AliasVault.Api + Linux + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + @@ -20,4 +25,10 @@ + + + .dockerignore + + + diff --git a/src/AliasVault.Api/Dockerfile b/src/AliasVault.Api/Dockerfile new file mode 100644 index 000000000..eb9f6d456 --- /dev/null +++ b/src/AliasVault.Api/Dockerfile @@ -0,0 +1,41 @@ +FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base +WORKDIR /app +EXPOSE 8081 + +FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build +ARG BUILD_CONFIGURATION=Release + +WORKDIR /src + +# Copy the project files and restore dependencies +COPY ["src/AliasVault.Api/AliasVault.Api.csproj", "src/AliasVault.Api/"] +COPY ["src/AliasDb/AliasDb.csproj", "src/AliasDb/"] +COPY ["src/AliasVault.Shared/AliasVault.Shared.csproj", "src/AliasVault.Shared/"] +COPY ["src/AliasGenerators/AliasGenerators.csproj", "src/AliasGenerators/"] +RUN dotnet restore "src/AliasVault.Api/AliasVault.Api.csproj" + +# Copy the rest of the application code +COPY . . + +# Build the WebApi project +WORKDIR "/src/src/AliasVault.Api" +RUN dotnet build "AliasVault.Api.csproj" -c $BUILD_CONFIGURATION -o /app/build + +# Publish the application to the /app/publish directory in the container +FROM build AS publish +ARG BUILD_CONFIGURATION=Release +RUN dotnet publish "AliasVault.Api.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false + +# Create the migration bundle +# Install the Entity Framework Core CLI tool and run migrations to create the database +RUN dotnet tool install --global dotnet-ef --version 8.0.5 +RUN /root/.dotnet/tools/dotnet-ef migrations bundle -o /app/migrationbundle + +FROM base AS final +WORKDIR /app +COPY --from=publish /app/publish . +COPY /src/AliasVault.Api/entrypoint.sh /app +RUN chmod +x /app/entrypoint.sh +EXPOSE 8081 +ENV ASPNETCORE_URLS=http://+:8081 +ENTRYPOINT ["/app/entrypoint.sh"] diff --git a/entrypoint.sh b/src/AliasVault.Api/entrypoint.sh similarity index 68% rename from entrypoint.sh rename to src/AliasVault.Api/entrypoint.sh index feb4d2c6a..2b9bdd46f 100644 --- a/entrypoint.sh +++ b/src/AliasVault.Api/entrypoint.sh @@ -2,8 +2,8 @@ # Apply database migrations using the bundle echo "Running database migrations..." -/app/AliasVault/migrationbundle +/app/migrationbundle # Start the application echo "Starting application..." -dotnet /app/AliasVault/AliasVault.dll +dotnet /app/AliasVault.Api.dll diff --git a/src/AliasVault.WebApp/AliasVault.WebApp.csproj b/src/AliasVault.WebApp/AliasVault.WebApp.csproj index fd74140b7..981e9f759 100644 --- a/src/AliasVault.WebApp/AliasVault.WebApp.csproj +++ b/src/AliasVault.WebApp/AliasVault.WebApp.csproj @@ -4,6 +4,7 @@ net8.0 enable enable + Linux @@ -19,6 +20,9 @@ PreserveNewest + + .dockerignore + @@ -27,4 +31,10 @@ + + + + Never + + diff --git a/src/AliasVault.WebApp/Dockerfile b/src/AliasVault.WebApp/Dockerfile new file mode 100644 index 000000000..0a2bc5530 --- /dev/null +++ b/src/AliasVault.WebApp/Dockerfile @@ -0,0 +1,39 @@ +# Use the official ASP.NET Core runtime image as the base image +FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base +WORKDIR /app + +# Use the official .NET SDK image to build the app +FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build +ARG BUILD_CONFIGURATION=Release +WORKDIR /src + +# Copy the project files and restore dependencies +COPY ["src/AliasVault.WebApp/AliasVault.WebApp.csproj", "src/AliasVault.WebApp/"] +COPY ["src/AliasVault.Shared/AliasVault.Shared.csproj", "src/AliasVault.Shared/"] +COPY ["src/AliasDb/AliasDb.csproj", "src/AliasDb/"] +COPY ["src/AliasGenerators/AliasGenerators.csproj", "src/AliasGenerators/"] +COPY ["src/Utilities/FaviconExtractor/FaviconExtractor.csproj", "src/Utilities/FaviconExtractor/"] +RUN dotnet restore "src/AliasVault.WebApp/AliasVault.WebApp.csproj" + +# Copy the rest of the application code +COPY . . + +# Build the WebApp project +WORKDIR "/src/src/AliasVault.WebApp" +RUN dotnet build "AliasVault.WebApp.csproj" -c $BUILD_CONFIGURATION -o /app/build + +# Publish the WebApp project +FROM build AS publish +ARG BUILD_CONFIGURATION=Release +RUN dotnet publish "AliasVault.WebApp.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false + +# Final stage: start nginx and serve static html files that were published in the previous stage +FROM nginx:alpine AS final +WORKDIR /usr/share/nginx/html +COPY --from=publish /app/publish/wwwroot . +COPY /src/AliasVault.WebApp/nginx.conf /etc/nginx/nginx.conf +COPY /src/AliasVault.WebApp/entrypoint.sh /app/ +RUN chmod +x /app/entrypoint.sh +EXPOSE 8080 +ENV ASPNETCORE_URLS=http://+:8080 +ENTRYPOINT ["/app/entrypoint.sh"] diff --git a/src/AliasVault.WebApp/Program.cs b/src/AliasVault.WebApp/Program.cs index d2b366d2b..35c7a3b2c 100644 --- a/src/AliasVault.WebApp/Program.cs +++ b/src/AliasVault.WebApp/Program.cs @@ -7,6 +7,9 @@ using AliasVault.WebApp.Services; using AliasVault.WebApp.Auth.Services; var builder = WebAssemblyHostBuilder.CreateDefault(args); + +builder.Configuration.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true); + builder.RootComponents.Add("#app"); builder.RootComponents.Add("head::after"); @@ -19,7 +22,7 @@ builder.Services.AddScoped(sp => { var httpClientFactory = sp.GetRequiredService(); var httpClient = httpClientFactory.CreateClient("AliasVault.Api"); - httpClient.BaseAddress = new Uri("http://localhost:5092"); + httpClient.BaseAddress = new Uri(builder.Configuration["ApiUrl"]); return httpClient; }); diff --git a/src/AliasVault.WebApp/entrypoint.sh b/src/AliasVault.WebApp/entrypoint.sh new file mode 100644 index 000000000..19d54d25f --- /dev/null +++ b/src/AliasVault.WebApp/entrypoint.sh @@ -0,0 +1,8 @@ +#!/bin/sh + +# Replace placeholder with the actual API URL +sed -i "s|http://localhost:5092|${API_URL}|g" /app/wwwroot/appsettings.json + +# Start the application +nginx -g "daemon off;" + diff --git a/src/AliasVault.WebApp/nginx.conf b/src/AliasVault.WebApp/nginx.conf new file mode 100644 index 000000000..f8804b639 --- /dev/null +++ b/src/AliasVault.WebApp/nginx.conf @@ -0,0 +1,13 @@ +events { } +http { + include mime.types; + + server { + listen 8080; + + location / { + root /usr/share/nginx/html; + try_files $uri $uri/ /index.html =404; + } + } +} diff --git a/src/AliasVault.WebApp/wwwroot/appsettings.json b/src/AliasVault.WebApp/wwwroot/appsettings.json index d57de9f3b..779c58b6b 100644 --- a/src/AliasVault.WebApp/wwwroot/appsettings.json +++ b/src/AliasVault.WebApp/wwwroot/appsettings.json @@ -1,12 +1,3 @@ { - "Local": { - "Authority": "http://localhost:5092", - "ClientId": "BlazorWasmApp", - "DefaultScopes": [ - "openid", - "profile", - "email" - ], - "PostLogoutRedirectUri": "http://localhost:5092/" - } + "ApiUrl": "http://localhost:5092" } diff --git a/src/AliasVault/.dockerignore b/src/AliasVault/.dockerignore new file mode 100644 index 000000000..cd967fc3a --- /dev/null +++ b/src/AliasVault/.dockerignore @@ -0,0 +1,25 @@ +**/.dockerignore +**/.env +**/.git +**/.gitignore +**/.project +**/.settings +**/.toolstarget +**/.vs +**/.vscode +**/.idea +**/*.*proj.user +**/*.dbmdl +**/*.jfm +**/azds.yaml +**/bin +**/charts +**/docker-compose* +**/Dockerfile* +**/node_modules +**/npm-debug.log +**/obj +**/secrets.dev.yaml +**/values.dev.yaml +LICENSE +README.md \ No newline at end of file diff --git a/Dockerfile b/src/AliasVault/Dockerfile similarity index 71% rename from Dockerfile rename to src/AliasVault/Dockerfile index 5bd1602d5..035e53554 100644 --- a/Dockerfile +++ b/src/AliasVault/Dockerfile @@ -18,11 +18,6 @@ COPY src/. ./ WORKDIR /src/AliasVault RUN dotnet publish -c Release -o /app --verbosity detailed -# Create the migration bundle -# Install the Entity Framework Core CLI tool and run migrations to create the database -RUN dotnet tool install --global dotnet-ef --version 8.0.5 -RUN /root/.dotnet/tools/dotnet-ef migrations bundle -o /app/migrationbundle - # Use the official ASP.NET Core runtime image to run the app FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS runtime WORKDIR /app/AliasVault @@ -31,10 +26,8 @@ WORKDIR /app/AliasVault COPY --from=build /app ./ # Expose the port the app runs on -EXPOSE 8080 +EXPOSE 8082 +ENV ASPNETCORE_URLS=http://+:8082 -# Copy entrypoint script -COPY entrypoint.sh /entrypoint.sh -RUN chmod +x /entrypoint.sh +ENTRYPOINT ["dotnet", "AliasVault.dll"] -ENTRYPOINT ["/entrypoint.sh"]