Compare commits

...

12 Commits

Author SHA1 Message Date
dymik739 e65bfa501a fix image for kubernetes 2025-05-12 20:47:11 +03:00
dymik739 1d5157b635 fix all issues 2025-05-12 20:47:11 +03:00
dymik739 99e91324bc add Dockerfile for building the container 2025-05-12 20:47:11 +03:00
Kirill 6d2533e53d Merge branch 'feature/com-control-base-path' into 'main'
fixed path for swagger

See merge request kzotkin/hiveemulator!8
2025-04-23 08:58:51 +00:00
Kirill Zotkin fb36a7d13b fixed path for swagger 2025-04-23 11:57:36 +03:00
Kirill f1d8b95744 Merge branch 'feature/com-control-base-path' into 'main'
added base path to communication control

See merge request kzotkin/hiveemulator!7
2025-04-21 19:41:23 +00:00
Kirill Zotkin 3fa3ef13b2 added base path to communication control 2025-04-21 22:38:07 +03:00
Kirill Zotkin dd189fc094 fixed Readme for HiveMind 2025-04-06 22:08:37 +03:00
Kirill Zotkin e341fc14b3 reverted Redis connection string 2025-04-06 20:53:32 +03:00
Kirill Zotkin 2c50dc75eb enable swagger for prod 2025-04-06 15:39:39 +03:00
Kirill Zotkin 4df4437487 Merge branch 'main' of https://gitlab.com/kzotkin/hiveemulator 2025-03-18 22:40:19 +02:00
Kirill Zotkin bee604d68e always start swagger 2025-03-12 00:24:56 +02:00
10 changed files with 166 additions and 15 deletions

4
.gitignore vendored
View File

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

70
Dockerfile Normal file
View File

@ -0,0 +1,70 @@
# dotnet build environment
FROM alpine:latest as dotnet
WORKDIR /
RUN apk add dotnet8-sdk git
RUN git clone https://gitlab.com/kzotkin/hiveemulator
WORKDIR /hiveemulator/src/CommunicationControl/
RUN dotnet build DevOpsProject/DevOpsProject.CommunicationControl.API.csproj
RUN dotnet build DevOpsProject.HiveMind.API/DevOpsProject.HiveMind.API.csproj
# nodejs build environment
#FROM alpine:latest as nodejs
#WORKDIR /
#RUN apk add git npm
#RUN git clone https://gitlab.com/kzotkin/hiveemulator
#WORKDIR /hiveemulator/src/MapClient/
#RUN npm install
#RUN npm run build
# production environment
FROM alpine:latest
WORKDIR /
#RUN apk add dotnet8-sdk redis openrc lighttpd npm
#RUN apk add git dotnet8-sdk redis openrc npm
#RUN apk add git aspnetcore8-runtime redis openrc npm
RUN apk add aspnetcore8-runtime redis openrc npm
#RUN git clone https://gitlab.com/kzotkin/hiveemulator
#COPY --from=nodejs /hiveemulator/ /hiveemulator/
COPY --from=dotnet /hiveemulator/ /hiveemulator/
#COPY --from=nodejs /hiveemulator/src/MapClient/dist/* /var/www/localhost/htdocs/
#RUN mkdir /hive-cc
#COPY --from=0 /hiveemulator/src/CommunicationControl/DevOpsProject/* /hive-cc/
#COPY --from=dotnet /hiveemulator/src/CommunicationControl/DevOpsProject/* /hiveemulator/src/CommunicationControl/DevOpsProject/
#COPY --from=dotnet /hiveemulator/src/CommunicationControl/DevOpsProject.HiveMind.API/* /hiveemulator/src/CommunicationControl/DevOpsProject.HiveMind.API/
#RUN mkdir /hive-hm
#COPY --from=0 /hiveemulator/src/CommunicationControl/DevOpsProject.HiveMind.API/* /hive-hm/
WORKDIR /hiveemulator/src/MapClient/
RUN npm install
RUN sed -i 's/localhost/10\.1\.1\.2/' public/config.json
WORKDIR /
COPY ./daemon-files/hive-cc /etc/init.d/hive-cc
COPY ./daemon-files/hive-hm /etc/init.d/hive-hm
COPY ./daemon-files/hive-map /etc/init.d/hive-map
RUN chmod u+x /etc/init.d/hive-hm /etc/init.d/hive-cc /etc/init.d/hive-map
#RUN mkdir /etc/rulevels/{stage-redis,stage-cc,stage-hm,stage-map}
#RUN rc-update add redis default
#RUN rc-update add hive-hm default
#RUN rc-update add hive-cc default
#RUN rc-update add hive-map default
CMD sh -c "openrc default ; \
rc-service redis start ; \
rc-service hive-cc start ; \
rc-service hive-hm start ; \
rc-service hive-map start ; \
sleep 96h; \
exec sh"

View File

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

14
daemon-files/hive-cc Normal file
View File

@ -0,0 +1,14 @@
#!/sbin/openrc-run
command="./DevOpsProject.CommunicationControl.API"
command_args=""
pidfile="/run/hive-cc.pid"
supervisor="supervise-daemon"
start_pre() {
cd /hiveemulator/src/CommunicationControl/DevOpsProject/bin/Debug/net8.0/
}
depend() {
need redis
}

14
daemon-files/hive-hm Normal file
View File

@ -0,0 +1,14 @@
#!/sbin/openrc-run
command="./DevOpsProject.HiveMind.API"
command_args=""
pidfile="/run/hive-hm.pid"
supervisor="supervise-daemon"
start_pre() {
cd /hiveemulator/src/CommunicationControl/DevOpsProject.HiveMind.API/bin/Debug/net8.0/
}
depend() {
need hive-cc
}

14
daemon-files/hive-map Normal file
View File

@ -0,0 +1,14 @@
#!/sbin/openrc-run
command="npm"
command_args="run dev"
pidfile="/run/hive-map.pid"
supervisor="supervise-daemon"
depend() {
need hive-cc
}
start_pre() {
cd /hiveemulator/src/MapClient/
}

View File

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

View File

@ -1,2 +1,4 @@
<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"> <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_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> <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>

View File

@ -19,6 +19,8 @@ internal class Program
// TODO: consider this approach // TODO: consider this approach
builder.Services.AddJsonControllerOptionsConfiguration(); builder.Services.AddJsonControllerOptionsConfiguration();
string basePath = builder.Configuration.GetValue<string>("BasePath") ?? string.Empty;
builder.Services.AddEndpointsApiExplorer(); builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen(c => builder.Services.AddSwaggerGen(c =>
{ {
@ -41,15 +43,26 @@ internal class Program
builder.Services.AddProblemDetails(); builder.Services.AddProblemDetails();
var app = builder.Build(); 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.UseExceptionHandler();
if (app.Environment.IsDevelopment()) app.UseSwagger();
app.UseSwaggerUI(c =>
{ {
app.UseSwagger(); c.SwaggerEndpoint($"{basePath}/swagger/v1/swagger.json", "CommunicationControl - V1");
app.UseSwaggerUI(); c.RoutePrefix = $"swagger";
}
});
app.UseCors(corsPolicyName); app.UseCors(corsPolicyName);
app.UseAuthorization(); app.UseAuthorization();

View File

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