Compare commits

..

3 Commits

12 changed files with 137 additions and 55 deletions

4
.gitignore vendored
View File

@ -1,11 +1,7 @@
src/MapClient/node_modules
src/MapClient/dist
src/CommunicationControl/.idea
src/CommunicationControl/.vs
bin
obj
Logs
.vscode
build
src/CommunicationControl/DevOpsProject.sln.DotSettings.user
src/CommunicationControl/DevOpsProject.sln.DotSettings.user

View File

@ -66,5 +66,4 @@ CMD sh -c "openrc default ; \
rc-service hive-cc start ; \
rc-service hive-hm start ; \
rc-service hive-map start ; \
sleep 96h; \
exec sh"

24
Dockerfile-cc Normal file
View File

@ -0,0 +1,24 @@
# dotnet build environment
FROM alpine:latest as dotnet
WORKDIR /
RUN apk add git
RUN git clone https://gitlab.com/kzotkin/hiveemulator
RUN apk add dotnet8-sdk
WORKDIR /hiveemulator/src/CommunicationControl/
RUN dotnet publish DevOpsProject/DevOpsProject.CommunicationControl.API.csproj
# production environment
#FROM mcr.microsoft.com/dotnet/aspnet:8.0 as prod
FROM alpine:latest as prod
#COPY --from=dotnet /hiveemulator/src/CommunicationControl/DevOpsProject/bin/Release/net8.0/ /app/
RUN apk add aspnetcore8-runtime
RUN mkdir -p /hiveemulator/src/CommunicationControl/DevOpsProject/bin/Release/net8.0/
COPY --from=dotnet /hiveemulator/src/CommunicationControl/DevOpsProject/bin/Release/net8.0/ /hiveemulator/src/CommunicationControl/DevOpsProject/bin/Release/net8.0/
EXPOSE 8080
WORKDIR /hiveemulator/src/CommunicationControl/DevOpsProject/bin/Release/net8.0/
ENTRYPOINT ["./DevOpsProject.CommunicationControl.API"]

23
Dockerfile-hm Normal file
View File

@ -0,0 +1,23 @@
# dotnet build environment
FROM alpine:latest as dotnet
WORKDIR /
RUN apk add git
RUN git clone https://gitlab.com/kzotkin/hiveemulator
RUN apk add dotnet8-sdk
WORKDIR /hiveemulator/src/CommunicationControl/
RUN dotnet publish DevOpsProject.HiveMind.API/DevOpsProject.HiveMind.API.csproj
# production environment
#FROM mcr.microsoft.com/dotnet/aspnet:8.0 as prod
FROM alpine:latest as prod
RUN apk add aspnetcore8-runtime
RUN mkdir -p /hiveemulator/src/CommunicationControl/DevOpsProject.HiveMind.API/bin/Release/net8.0/
#COPY --from=dotnet /hiveemulator/src/CommunicationControl/DevOpsProject.HiveMind.API/bin/Release/net8.0/ /app/
COPY --from=dotnet /hiveemulator/src/CommunicationControl/DevOpsProject.HiveMind.API/bin/Release/net8.0/ /hiveemulator/src/CommunicationControl/DevOpsProject.HiveMind.API/bin/Release/net8.0/
WORKDIR /hiveemulator/src/CommunicationControl/DevOpsProject.HiveMind.API/bin/Release/net8.0/
ENTRYPOINT ["./DevOpsProject.HiveMind.API"]

22
Dockerfile-map Normal file
View File

@ -0,0 +1,22 @@
# nodejs build environment
FROM alpine:latest as nodejs
WORKDIR /
RUN apk add git
RUN git clone https://gitlab.com/kzotkin/hiveemulator
RUN apk add npm
WORKDIR /hiveemulator/src/MapClient/
RUN npm install
RUN npm run build
RUN rm public/config.json
# production environment
FROM nginx:alpine
COPY --from=nodejs /hiveemulator/src/MapClient/dist/ /usr/share/nginx/html/
EXPOSE 80
ENTRYPOINT ["nginx", "-g", "daemon off;"]

View File

@ -8,11 +8,6 @@
- [Communiction Control](#communiction-control)
- [Hive Mind](#hive-mind)
- [Usage](#usage)
- [Build](#build)
- [Map Clinet](#map-clinet)
- [Communiction Control](#communiction-control-1)
- [Hive Mind](#hive-mind-1)
- [Communiction Control](#communiction-control-2)
## About
This is a demo project used in the Uni DevOps course
@ -44,7 +39,7 @@ dotnet run --project DevOpsProject/DevOpsProject.CommunicationControl.API.cspro
```bash
cd src/CommunicationControl
dotnet run --project DevOpsProject.HiveMind.API/DevOpsProject.HiveMind.API.csproj
dotnet run --project DevOpsProject/DevOpsProject.HiveMind.API.csproj
```
@ -59,20 +54,3 @@ dotnet run --project DevOpsProject.HiveMind.API/DevOpsProject.HiveMind.API.cspr
```
3. Communication Control Swagger: http://localhost:8080
## Build
### Map Clinet
cd src/MapClient
npm install
npm run build
### Communiction Control
cd src/CommunicationControl
dotnet publish -p:PublishProfile=FolderProfile --artifacts-path=build/CommunicationControl DevOpsProject/DevOpsProject.CommunicationControl.API.csproj
### Hive Mind
### Communiction Control
cd src/CommunicationControl
dotnet publish -p:PublishProfile=FolderProfile --artifacts-path=build/HiveMind DevOpsProject/DevOpsProject.HiveMind.API.csproj

50
docker-compose.yaml Normal file
View File

@ -0,0 +1,50 @@
services:
redis:
image: redis:7
restart: always
networks:
- sys
cc:
build:
context: .
dockerfile: Dockerfile-cc
#image: registry.digitalocean.com/duke-listings/cc
restart: always
environment:
Redis__ConnectionString: "redis:6379"
ports:
- 8080:8080
networks:
- sys
depends_on:
- redis
hm:
build:
context: .
dockerfile: Dockerfile-hm
#image: registry.digitalocean.com/duke-listings/hm
restart: always
environment:
CommunicationConfiguration__CommunicationControlIP: "cc"
networks:
- sys
depends_on:
- cc
map:
build:
context: .
dockerfile: Dockerfile-map
#image: registry.digitalocean.com/duke-listings/map
restart: always
volumes:
- ./map/config.json:/usr/share/nginx/html/config.json:ro
ports:
- 80:80
networks:
- sys
networks:
sys:

3
map/config.json Normal file
View File

@ -0,0 +1,3 @@
{
"API": "http://10.1.1.2:8080/api/v1/client"
}

View File

@ -57,8 +57,11 @@ using (var scope = app.Services.CreateScope())
app.UseExceptionHandler();
// Configure the HTTP request pipeline.
app.UseSwagger();
app.UseSwaggerUI();
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseCors(corsPolicyName);

View File

@ -1,4 +1,2 @@
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AConnectionMultiplexer_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003FLibrary_003FApplication_0020Support_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FSourcesCache_003F777330fcb5805c27956d104ff76bca3d9647f0def3f139feed35c0ef42c745_003FConnectionMultiplexer_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ACorsPolicyBuilder_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003FLibrary_003FApplication_0020Support_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FSourcesCache_003Ff2b268c5e2cd9f1f915a357be6a8df853a5e36d3641a02dea9c31d924ca17a1_003FCorsPolicyBuilder_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AExceptionDispatchInfo_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003FLibrary_003FApplication_0020Support_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FSourcesCache_003Fbf9021a960b74107a7e141aa06bc9d8a0a53c929178c2fb95b1597be8af8dc_003FExceptionDispatchInfo_002Ecs/@EntryIndexedValue">ForceIncluded</s:String></wpf:ResourceDictionary>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ACorsPolicyBuilder_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003FLibrary_003FApplication_0020Support_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FSourcesCache_003Ff2b268c5e2cd9f1f915a357be6a8df853a5e36d3641a02dea9c31d924ca17a1_003FCorsPolicyBuilder_002Ecs/@EntryIndexedValue">ForceIncluded</s:String></wpf:ResourceDictionary>

View File

@ -19,8 +19,6 @@ internal class Program
// TODO: consider this approach
builder.Services.AddJsonControllerOptionsConfiguration();
string basePath = builder.Configuration.GetValue<string>("BasePath") ?? string.Empty;
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen(c =>
{
@ -43,26 +41,15 @@ internal class Program
builder.Services.AddProblemDetails();
var app = builder.Build();
if (!string.IsNullOrEmpty(basePath))
{
var pathBase = new PathString(basePath);
app.UsePathBase(pathBase);
app.Use(async (context, next) =>
{
context.Request.PathBase = pathBase;
await next();
});
}
app.UseExceptionHandler();
app.UseSwagger();
app.UseSwaggerUI(c =>
if (app.Environment.IsDevelopment())
{
c.SwaggerEndpoint($"{basePath}/swagger/v1/swagger.json", "CommunicationControl - V1");
c.RoutePrefix = $"swagger";
app.UseSwagger();
app.UseSwaggerUI();
}
});
app.UseCors(corsPolicyName);
app.UseAuthorization();

View File

@ -20,7 +20,6 @@
},
"AllowedHosts": "*",
"Urls": "http://0.0.0.0:8080",
"BasePath": "",
"Serilog": {
"Using": [ "Serilog.Sinks.Console", "Serilog.Sinks.File" ],
"MinimumLevel": {