Containerize application (#77)
* [UPDATE] Using netcoreapp3.1 The project orinaly was using netcoreapp3.0 * [UPDATE] Update Nuget dependencies Blazorise 0.9.0.3 Blazorise.Bootstrap 0.9.0.3 Blazorise.Charts 0.9.0.3 Blazorise.Components 0.9.0.3 Blazorise.Icons.FontAwesome 0.9.0.3 Blazorise.Sidebar 0.9.0.3 BlazorTable 1.11.1 Microsoft.AspNetCore.Components.WebAssembly and it dependencies to 3.2.0 * [UPDATE] Adjusting launching settings * [UPDATE] Using Microsoft.Extensions.Http as recommended reference: https://docs.microsoft.com/en-us/aspnet/core/blazor/call-web-api?view=aspnetcore-3.1 * [ADD] Dockerfile for Admin Api * [ADD] Dockerfile for AdminUi [ADD] Nginx configuration for admin ui docker image * [ADD] Dockerfile for agent * [ADD] Docker-compose * [ADD] Makefile * [UPDATE] Simplifying targets Removing redundant targets for build and publish * [UPDATE] Applying changes after merging with master * BUILD: Migrate all source code into src director - Moves all of the source code into the src directory this is primariy to make docker composition easier as well as some of the other build platform work * BUILD: Move all docker files into folder * Removing unnecessary /aj/ prefix requirement * BUILD: Add core docker build and test for source * BUILD: Combine build and docker-compose * REFACTOR: Simplify nginx configuration Co-authored-by: Eric Maino <eric.maino@microsoft.com> Co-authored-by: Eric Maino <ericmai@microsoft.com>
|
@ -0,0 +1,21 @@
|
|||
FROM auth-janitor as build
|
||||
|
||||
ARG APP_ROOT
|
||||
ARG ENVIRONMENT
|
||||
|
||||
WORKDIR /src/${APP_ROOT}
|
||||
RUN dotnet publish --no-restore -c ${ENVIRONMENT} -o /app
|
||||
|
||||
# # # --- Functions Runtime Image --- # # #
|
||||
FROM mcr.microsoft.com/azure-functions/dotnet:3.0
|
||||
ARG ENVIRONMENT
|
||||
|
||||
ENV Host--CORS=*
|
||||
ENV FUNCTIONS_WORKER_RUNTIME=dotnet
|
||||
ENV AzureWebJobsScriptRoot=/home/site/wwwroot
|
||||
ENV AZURE_FUNCTION_PROXY_DISABLE_LOCAL_CALL=True
|
||||
|
||||
# # # --- Well Known Key and AccountName --- # # #
|
||||
ENV AzureWebJobsStorage=DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=http://storage:10000/devstoreaccount1;QueueEndpoint=http://storage:10001/devstoreaccount1
|
||||
|
||||
COPY --from=build /app /home/site/wwwroot
|
|
@ -0,0 +1,12 @@
|
|||
FROM auth-janitor as build
|
||||
|
||||
ARG APP_ROOT
|
||||
ARG ENVIRONMENT
|
||||
|
||||
WORKDIR /src/${APP_ROOT}
|
||||
RUN dotnet publish --no-restore -c ${ENVIRONMENT} -o /app
|
||||
|
||||
FROM nginx:1.19.0
|
||||
|
||||
COPY --from=build /app/wwwroot /var/www/
|
||||
COPY nginx.conf /etc/nginx/nginx.conf
|
|
@ -0,0 +1,17 @@
|
|||
events { }
|
||||
http {
|
||||
server {
|
||||
listen 80;
|
||||
index index.html;
|
||||
|
||||
location /api {
|
||||
proxy_set_header Host $host;
|
||||
proxy_pass http://api-host/api;
|
||||
}
|
||||
|
||||
location / {
|
||||
root /var/www;
|
||||
try_files $uri $uri/ /index.html =404;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,4 @@
|
|||
.git
|
||||
.docker
|
||||
.docs
|
||||
.github
|
|
@ -8,8 +8,9 @@ on:
|
|||
|
||||
jobs:
|
||||
build:
|
||||
|
||||
runs-on: ubuntu-latest
|
||||
env:
|
||||
src: ./src
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
|
@ -19,7 +20,11 @@ jobs:
|
|||
dotnet-version: 3.1.200
|
||||
- name: Install dependencies
|
||||
run: dotnet restore
|
||||
working-directory: ${{env.src}}
|
||||
- name: Build
|
||||
run: dotnet build --configuration Release --no-restore
|
||||
working-directory: ${{env.src}}
|
||||
- name: Test
|
||||
run: dotnet test --no-restore --verbosity normal
|
||||
working-directory: ${{env.src}}
|
||||
|
||||
|
|
|
@ -0,0 +1,51 @@
|
|||
version: '3'
|
||||
services:
|
||||
base:
|
||||
image: auth-janitor
|
||||
build:
|
||||
context: ./src
|
||||
dockerfile: Dockerfile
|
||||
args:
|
||||
ENVIRONMENT: DEBUG
|
||||
storage:
|
||||
image: mcr.microsoft.com/azure-storage/azurite
|
||||
api-host:
|
||||
build:
|
||||
context: .docker/FunctionsHost
|
||||
dockerfile: Dockerfile
|
||||
args:
|
||||
ENVIRONMENT: DEBUG
|
||||
APP_ROOT: AuthJanitor.Functions.AdminApi
|
||||
depends_on:
|
||||
- base
|
||||
- storage
|
||||
environment:
|
||||
STORAGE_WEB_URL: UNKNOWN_STORAGE_URL
|
||||
SENDGRID_API_KEY: UNKNOWN_SENDGRID_KEY
|
||||
CLIENT_ID: UNKNOWN_CLIENT_ID
|
||||
CLIENT_SECRET: UNKNOWN_CLIENT_SECRET
|
||||
TENANT_ID: UNKNOWN_TENANT_ID
|
||||
agent-host:
|
||||
build:
|
||||
context: .docker/FunctionsHost
|
||||
dockerfile: Dockerfile
|
||||
args:
|
||||
ENVIRONMENT: DEBUG
|
||||
APP_ROOT: AuthJanitor.Functions.Agent
|
||||
depends_on:
|
||||
- base
|
||||
- storage
|
||||
environment:
|
||||
SENDGRID_API_KEY: UNKNOWN
|
||||
ui:
|
||||
build:
|
||||
context: .docker/UI
|
||||
dockerfile: Dockerfile
|
||||
args:
|
||||
ENVIRONMENT: DEBUG
|
||||
APP_ROOT: AuthJanitor.AspNet.AdminUi
|
||||
ports:
|
||||
- 8000:80
|
||||
depends_on:
|
||||
- base
|
||||
- api-host
|
|
@ -11,17 +11,18 @@
|
|||
<BlazorWebAssemblyEnableLinking>false</BlazorWebAssemblyEnableLinking>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Blazorise" Version="0.9.0.2" />
|
||||
<PackageReference Include="Blazorise.Bootstrap" Version="0.9.0.2" />
|
||||
<PackageReference Include="Blazorise.Charts" Version="0.9.0.2" />
|
||||
<PackageReference Include="Blazorise.Components" Version="0.9.0.2" />
|
||||
<PackageReference Include="Blazorise.Icons.FontAwesome" Version="0.9.0.2" />
|
||||
<PackageReference Include="Blazorise.Sidebar" Version="0.9.0.2" />
|
||||
<PackageReference Include="BlazorTable" Version="1.9.0" />
|
||||
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly" Version="3.2.0-preview2.20160.5" />
|
||||
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.Build" Version="3.2.0-preview2.20160.5" PrivateAssets="all" />
|
||||
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.DevServer" Version="3.2.0-preview2.20160.5" PrivateAssets="all" />
|
||||
<PackageReference Include="Microsoft.AspNetCore.Blazor.HttpClient" Version="3.2.0-preview2.20160.5" />
|
||||
<PackageReference Include="Blazorise" Version="0.9.0.3" />
|
||||
<PackageReference Include="Blazorise.Bootstrap" Version="0.9.0.3" />
|
||||
<PackageReference Include="Blazorise.Charts" Version="0.9.0.3" />
|
||||
<PackageReference Include="Blazorise.Components" Version="0.9.0.3" />
|
||||
<PackageReference Include="Blazorise.Icons.FontAwesome" Version="0.9.0.3" />
|
||||
<PackageReference Include="Blazorise.Sidebar" Version="0.9.0.3" />
|
||||
<PackageReference Include="BlazorTable" Version="1.11.1" />
|
||||
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly" Version="3.2.0" />
|
||||
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.Build" Version="3.2.0" PrivateAssets="all" />
|
||||
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.DevServer" Version="3.2.0" PrivateAssets="all" />
|
||||
<PackageReference Include="Microsoft.AspNetCore.Blazor.HttpClient" Version="3.2.0-preview3.20168.3" />
|
||||
<PackageReference Include="Microsoft.Extensions.Http" Version="3.1.5" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
|
@ -20,7 +20,7 @@
|
|||
<Template>
|
||||
<Blazorise.Buttons Role="ButtonsRole.Toolbar">
|
||||
<Blazorise.Button Color="Color.Info"
|
||||
Clicked="@(() => NavigationManager.NavigateTo($"/aj/managedSecrets/{context.ObjectId}"))">
|
||||
Clicked="@(() => NavigationManager.NavigateTo($"/managedSecrets/{context.ObjectId}"))">
|
||||
<Icon Name="FontAwesomeIcons.Eye" Class="text-light" />
|
||||
</Blazorise.Button>
|
||||
<Blazorise.Button Color="Color.Danger" Clicked="@(() => { SelectedValue = context; DeleteModalShowing = true; })">
|
|
@ -20,7 +20,7 @@
|
|||
<Template>
|
||||
<Blazorise.Buttons Role="ButtonsRole.Toolbar">
|
||||
<Blazorise.Button Color="Color.Info"
|
||||
Clicked="@(() => NavigationManager.NavigateTo($"/aj/rekeyingTasks/{context.ObjectId}"))">
|
||||
Clicked="@(() => NavigationManager.NavigateTo($"/rekeyingTasks/{context.ObjectId}"))">
|
||||
<Icon Name="FontAwesomeIcons.Eye" Class="text-light" />
|
||||
</Blazorise.Button>
|
||||
<Blazorise.Button Color="Color.Success" Clicked="@(() => { SelectedValue = context; ApproveModalShowing = true; })">
|
|
@ -20,7 +20,7 @@
|
|||
<Template>
|
||||
<Blazorise.Buttons Role="ButtonsRole.Toolbar">
|
||||
<Blazorise.Button Color="Color.Info"
|
||||
Clicked="@(() => NavigationManager.NavigateTo($"/aj/resources/{context.ObjectId}"))">
|
||||
Clicked="@(() => NavigationManager.NavigateTo($"/resources/{context.ObjectId}"))">
|
||||
<Icon Name="FontAwesomeIcons.Eye" Class="text-light" />
|
||||
</Blazorise.Button>
|
||||
<Blazorise.Button Color="Color.Danger" Clicked="@(() => { SelectedValue = context; DeleteModalShowing = true; })">
|
|
@ -6,7 +6,7 @@ using Blazorise.Bootstrap;
|
|||
using Blazorise.Icons.FontAwesome;
|
||||
using Microsoft.AspNetCore.Components.WebAssembly.Hosting;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using System.Net.Http;
|
||||
using System;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace AuthJanitor.UI
|
||||
|
@ -21,10 +21,8 @@ namespace AuthJanitor.UI
|
|||
.AddBootstrapProviders()
|
||||
.AddFontAwesomeIcons();
|
||||
|
||||
// Create both HttpClient and AuthJanitorHttpClient -- the AJ client from the HttpClient
|
||||
// ... this gets us the BaseAddress in the AJ-customized HttpClient
|
||||
builder.Services.AddBaseAddressHttpClient();
|
||||
builder.Services.AddSingleton((s) => new AuthJanitorHttpClient(s.GetRequiredService<HttpClient>()));
|
||||
builder.Services.AddHttpClient<AuthJanitorHttpClient>(
|
||||
client => client.BaseAddress = new Uri(builder.HostEnvironment.BaseAddress));
|
||||
|
||||
builder.RootComponents.Add<App>("app");
|
||||
|
|
@ -3,7 +3,7 @@
|
|||
"windowsAuthentication": false,
|
||||
"anonymousAuthentication": true,
|
||||
"iisExpress": {
|
||||
"applicationUrl": "http://localhost:16010/",
|
||||
"applicationUrl": "http://localhost:16000/",
|
||||
"sslPort": 0
|
||||
}
|
||||
},
|
||||
|
@ -11,10 +11,11 @@
|
|||
"IIS Express": {
|
||||
"commandName": "IISExpress",
|
||||
"launchBrowser": true,
|
||||
"launchUrl": "http://localhost:16000/aj/",
|
||||
"launchUrl": "http://localhost:16000/",
|
||||
"environmentVariables": {
|
||||
"ASPNETCORE_ENVIRONMENT": "Development"
|
||||
}
|
||||
},
|
||||
"inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}"
|
||||
},
|
||||
"AuthJanitor.AspNet.AdminUi": {
|
||||
"commandName": "Project",
|
||||
|
@ -22,7 +23,8 @@
|
|||
"environmentVariables": {
|
||||
"ASPNETCORE_ENVIRONMENT": "Development"
|
||||
},
|
||||
"applicationUrl": "http://localhost:5000"
|
||||
"applicationUrl": "http://localhost:16000/",
|
||||
"inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}"
|
||||
}
|
||||
}
|
||||
}
|
|
@ -9,31 +9,31 @@
|
|||
<BarMenu>
|
||||
<BarStart>
|
||||
<BarItem>
|
||||
<BarLink To="/aj/dashboard">
|
||||
<BarLink To="/dashboard">
|
||||
<Icon Name="FontAwesomeIcons.TachometerAlt" Margin="Margin.Is1.FromRight" />
|
||||
Dashboard
|
||||
</BarLink>
|
||||
</BarItem>
|
||||
<BarItem>
|
||||
<BarLink To="/aj/providers">
|
||||
<BarLink To="/providers">
|
||||
<Icon Name="FontAwesomeIcons.Plug" Margin="Margin.Is1.FromRight" />
|
||||
Providers
|
||||
</BarLink>
|
||||
</BarItem>
|
||||
<BarItem>
|
||||
<BarLink To="/aj/resources">
|
||||
<BarLink To="/resources">
|
||||
<Icon Name="FontAwesomeIcons.Database" Margin="Margin.Is1.FromRight" />
|
||||
Resources
|
||||
</BarLink>
|
||||
</BarItem>
|
||||
<BarItem>
|
||||
<BarLink To="/aj/managedSecrets">
|
||||
<BarLink To="/managedSecrets">
|
||||
<Icon Name="FontAwesomeIcons.Key" Margin="Margin.Is1.FromRight" />
|
||||
Managed Secrets
|
||||
</BarLink>
|
||||
</BarItem>
|
||||
<BarItem>
|
||||
<BarLink To="/aj/rekeyingTasks">
|
||||
<BarLink To="/rekeyingTasks">
|
||||
<Icon Name="FontAwesomeIcons.Tasks" Margin="Margin.Is1.FromRight" />
|
||||
Rekeying Tasks
|
||||
</BarLink>
|
До Ширина: | Высота: | Размер: 20 KiB После Ширина: | Высота: | Размер: 20 KiB |
До Ширина: | Высота: | Размер: 27 KiB После Ширина: | Высота: | Размер: 27 KiB |
До Ширина: | Высота: | Размер: 3.4 KiB После Ширина: | Высота: | Размер: 3.4 KiB |
До Ширина: | Высота: | Размер: 4.9 KiB После Ширина: | Высота: | Размер: 4.9 KiB |
До Ширина: | Высота: | Размер: 8.0 KiB После Ширина: | Высота: | Размер: 8.0 KiB |
До Ширина: | Высота: | Размер: 12 KiB После Ширина: | Высота: | Размер: 12 KiB |
До Ширина: | Высота: | Размер: 14 KiB После Ширина: | Высота: | Размер: 14 KiB |
До Ширина: | Высота: | Размер: 15 KiB После Ширина: | Высота: | Размер: 15 KiB |
До Ширина: | Высота: | Размер: 20 KiB После Ширина: | Высота: | Размер: 20 KiB |
До Ширина: | Высота: | Размер: 21 KiB После Ширина: | Высота: | Размер: 21 KiB |
До Ширина: | Высота: | Размер: 27 KiB После Ширина: | Высота: | Размер: 27 KiB |
До Ширина: | Высота: | Размер: 6.0 KiB После Ширина: | Высота: | Размер: 6.0 KiB |
До Ширина: | Высота: | Размер: 6.3 KiB После Ширина: | Высота: | Размер: 6.3 KiB |
До Ширина: | Высота: | Размер: 8.0 KiB После Ширина: | Высота: | Размер: 8.0 KiB |
До Ширина: | Высота: | Размер: 8.7 KiB После Ширина: | Высота: | Размер: 8.7 KiB |
До Ширина: | Высота: | Размер: 28 KiB После Ширина: | Высота: | Размер: 28 KiB |
До Ширина: | Высота: | Размер: 28 KiB После Ширина: | Высота: | Размер: 28 KiB |
До Ширина: | Высота: | Размер: 67 KiB После Ширина: | Высота: | Размер: 67 KiB |
До Ширина: | Высота: | Размер: 1.7 KiB После Ширина: | Высота: | Размер: 1.7 KiB |
До Ширина: | Высота: | Размер: 3.0 KiB После Ширина: | Высота: | Размер: 3.0 KiB |
До Ширина: | Высота: | Размер: 12 KiB После Ширина: | Высота: | Размер: 12 KiB |
До Ширина: | Высота: | Размер: 1.1 KiB После Ширина: | Высота: | Размер: 1.1 KiB |
|
@ -7,7 +7,7 @@
|
|||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width" />
|
||||
<title>AuthJanitor Administration Tool</title>
|
||||
<base href="/aj/" />
|
||||
<base href="/" />
|
||||
|
||||
<link rel="apple-touch-icon" sizes="57x57" href="/apple-icon-57x57.png">
|
||||
<link rel="apple-touch-icon" sizes="60x60" href="/apple-icon-60x60.png">
|
До Ширина: | Высота: | Размер: 20 KiB После Ширина: | Высота: | Размер: 20 KiB |
До Ширина: | Высота: | Размер: 21 KiB После Ширина: | Высота: | Размер: 21 KiB |
До Ширина: | Высота: | Размер: 62 KiB После Ширина: | Высота: | Размер: 62 KiB |
До Ширина: | Высота: | Размер: 7.8 KiB После Ширина: | Высота: | Размер: 7.8 KiB |