From 9fa602664ff957ea9f638ddea2c0b5de473b4c42 Mon Sep 17 00:00:00 2001 From: Julian Date: Sat, 12 Feb 2022 14:48:49 +0100 Subject: [PATCH] Health check --- Controllers/FamilyController.cs | 8 ++++++-- Dtos/CreateFamilyDto.cs | 2 ++ Dtos/FamilyDto.cs | 2 ++ Dtos/UpdateFamilyDto.cs | 2 ++ Models/Family.cs | 2 ++ README.md | 30 +++++++++++++++++++++++++++++- Startup.cs | 20 ++++++++++++++++++-- appsettings.json | 2 +- docker-compose.yml | 31 +++++++++++++++++++++++++++++++ weddingapi.csproj | 1 + 10 files changed, 94 insertions(+), 6 deletions(-) create mode 100644 docker-compose.yml diff --git a/Controllers/FamilyController.cs b/Controllers/FamilyController.cs index f67e66c..3f6032f 100644 --- a/Controllers/FamilyController.cs +++ b/Controllers/FamilyController.cs @@ -22,11 +22,13 @@ namespace weddingapi.Controllers this.repository = repository; } - // GET /families + // GET /family [HttpGet] public async Task> GetFamiliesAsync() { - return (await repository.GetFamiliesAsync()).Select(family => family.AsDto()); + var fams = (await repository.GetFamiliesAsync()).Select(family => family.AsDto()); + Response.Headers.Add("X-Total-Count", fams.Count().ToString()); + return fams; } // GET /family/{id} @@ -52,6 +54,7 @@ namespace weddingapi.Controllers Id = Guid.NewGuid(), CreatedDate = DateTimeOffset.UtcNow, Name = familyDto.Name, + Overnight = familyDto.Overnight, Members = familyDto.Members.Select(person => new Person() { IsChild = person.IsChild, Name = person.Name, @@ -80,6 +83,7 @@ namespace weddingapi.Controllers Name = person.Name, IsChild = person.IsChild, }).ToList(), + Overnight = familyDto.Overnight, Name = familyDto.Name, }; diff --git a/Dtos/CreateFamilyDto.cs b/Dtos/CreateFamilyDto.cs index 8ce6f75..6f465e4 100644 --- a/Dtos/CreateFamilyDto.cs +++ b/Dtos/CreateFamilyDto.cs @@ -8,6 +8,8 @@ namespace weddingapi.Dtos [Required] public string Name { get; init; } [Required] + public bool Overnight { get; set; } + [Required] public IList Members { get; init;} } } \ No newline at end of file diff --git a/Dtos/FamilyDto.cs b/Dtos/FamilyDto.cs index a28d37f..9a9cf00 100644 --- a/Dtos/FamilyDto.cs +++ b/Dtos/FamilyDto.cs @@ -9,6 +9,8 @@ namespace weddingapi.Dtos public string Name { get; init; } + public bool Overnight { get; init; } + public DateTimeOffset CreatedDate { get; set; } public IList Members { get; init;} diff --git a/Dtos/UpdateFamilyDto.cs b/Dtos/UpdateFamilyDto.cs index 04bd29d..cee4555 100644 --- a/Dtos/UpdateFamilyDto.cs +++ b/Dtos/UpdateFamilyDto.cs @@ -9,5 +9,7 @@ namespace weddingapi.Dtos public string Name { get; init; } [Required] public IList Members { get; init;} + [Required] + public bool Overnight { get; set; } } } \ No newline at end of file diff --git a/Models/Family.cs b/Models/Family.cs index ceab1d1..c75a882 100644 --- a/Models/Family.cs +++ b/Models/Family.cs @@ -13,6 +13,8 @@ namespace weddingapi.Models public IList Members { get; init; } + public bool Overnight { get; init; } + public Family() { this.Members = new List(); diff --git a/README.md b/README.md index fbf343d..3d964af 100644 --- a/README.md +++ b/README.md @@ -1 +1,29 @@ -https://www.youtube.com/watch?v=bgk8N_rx1F4 \ No newline at end of file + +https://www.youtube.com/watch?v=bgk8N_rx1F4 + +# Build docker image: + +docker build -t weddingapi:v2 . + +# Run weddingapi + +docker run -d --rm --name weddingapi -p 8080:80 -e MongoDbConfig:Host=mongo -e MongoDbConfig:Port=27017 weddingapi:v2 + +# Run mongodb + +docker run -d --rm --name mongo -p 27017:27017 -v mongodbdata:/data/db mongo + + +# Push new docker version to registry: + +## Rename + +docker image tag weddingapi:v2 registry.git.rismer.de/rismer/weddingapi:v2 + +docker image tag weddingapi:v2 registry.git.rismer.de/rismer/weddingapi:latest + +## Push + +docker push registry.git.rismer.de/rismer/weddingapi:v2 + + diff --git a/Startup.cs b/Startup.cs index b4d3d9e..df6898f 100644 --- a/Startup.cs +++ b/Startup.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Diagnostics.HealthChecks; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.HttpsPolicy; using Microsoft.AspNetCore.Mvc; @@ -34,11 +35,11 @@ namespace weddingapi { BsonSerializer.RegisterSerializer(new GuidSerializer(BsonType.String)); BsonSerializer.RegisterSerializer(new DateTimeOffsetSerializer(BsonType.String)); + var mongoDbConfig = Configuration.GetSection(nameof(MongoDbConfig)).Get(); services.AddSingleton(serviceProvider => { - var config = Configuration.GetSection(nameof(MongoDbConfig)).Get(); - return new MongoClient(config.ConnectionString); + return new MongoClient(mongoDbConfig.ConnectionString); }); services.AddSingleton(); @@ -49,6 +50,13 @@ namespace weddingapi { c.SwaggerDoc("v1", new OpenApiInfo { Title = "weddingapi", Version = "v1" }); }); + + services.AddHealthChecks() + .AddMongoDb(mongoDbConfig.ConnectionString, + name: "mongodb", + timeout: TimeSpan.FromSeconds(3), + tags: new[] { "ready" }); + } // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. @@ -73,6 +81,14 @@ namespace weddingapi app.UseEndpoints(endpoints => { endpoints.MapControllers(); + + endpoints.MapHealthChecks("/health/ready", new HealthCheckOptions { + Predicate = (check) => check.Tags.Contains("ready") + }); + + endpoints.MapHealthChecks("/health/live", new HealthCheckOptions { + Predicate = (_) => false + }); }); } } diff --git a/appsettings.json b/appsettings.json index 27ec8cb..a36f796 100644 --- a/appsettings.json +++ b/appsettings.json @@ -8,7 +8,7 @@ }, "AllowedHosts": "*", "MongoDbConfig": { - "Host": "localhost", + "Host": "truenas", "Port": "27017" } } diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..263f7a4 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,31 @@ +version: "3.9" + +volumes: + mongodbdata: + name: "mongodbdata" + +networks: + weddingNetwork: + + +services: + weddingapi: + container_name: "weddingapi" + image: "weddingapi:v3" + ports: + - "8080:80" + networks: + - "weddingNetwork" + environment: + - MongoDbConfig:Host=mongo + - MongoDbConfig:Port=27017 + + mongo: + container_name: mongo + image: "mongo" + ports: + - "27017:27017" + volumes: + - "mongodbdata:/data/db" + networks: + - "weddingNetwork" \ No newline at end of file diff --git a/weddingapi.csproj b/weddingapi.csproj index 0f549b6..3351ccb 100644 --- a/weddingapi.csproj +++ b/weddingapi.csproj @@ -5,6 +5,7 @@ +