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"]