diff --git a/Azaion.Api/Azaion.Api.csproj b/Azaion.Api/Azaion.Api.csproj index 60050f0..adde894 100644 --- a/Azaion.Api/Azaion.Api.csproj +++ b/Azaion.Api/Azaion.Api.csproj @@ -11,6 +11,11 @@ + + + + + diff --git a/Azaion.Api/Program.cs b/Azaion.Api/Program.cs index 66c109f..048378f 100644 --- a/Azaion.Api/Program.cs +++ b/Azaion.Api/Program.cs @@ -11,6 +11,16 @@ using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.IdentityModel.Tokens; using Microsoft.OpenApi.Models; +using Serilog; + +Log.Logger = new LoggerConfiguration() + .Enrich.FromLogContext() + .MinimumLevel.Information() + .WriteTo.Console() + .WriteTo.File( + path: "logs/log.txt", + rollingInterval: RollingInterval.Day) + .CreateLogger(); var builder = WebApplication.CreateBuilder(args); builder.WebHost.ConfigureKestrel(o => o.Limits.MaxRequestBodySize = 209715200); //increase upload limit up to 200mb @@ -20,6 +30,7 @@ if (jwtConfig == null || string.IsNullOrEmpty(jwtConfig.Secret)) throw new Exception("Missing configuration section: JwtConfig"); var signingKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(jwtConfig.Secret)); +builder.Services.AddSerilog(); builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(o => { diff --git a/Azaion.Common/Entities/RoleEnum.cs b/Azaion.Common/Entities/RoleEnum.cs index 6573da8..4bd7a36 100644 --- a/Azaion.Common/Entities/RoleEnum.cs +++ b/Azaion.Common/Entities/RoleEnum.cs @@ -3,10 +3,10 @@ public enum RoleEnum { None = 0, - Operator = 10, - Validator = 20, + Operator = 10, //only annotator is available. Could send annotations to queue. + Validator = 20, //annotator + dataset explorer. This role allows to receive annotations from the queue. CompanionPC = 30, - Admin = 40, - ResourceUploader = 50, - ApiAdmin = 1000 + Admin = 40, // + ResourceUploader = 50, //Uploading dll and ai models + ApiAdmin = 1000 //everything } diff --git a/Azaion.Services/ResourcesService.cs b/Azaion.Services/ResourcesService.cs index b4dcdb4..a687d8d 100644 --- a/Azaion.Services/ResourcesService.cs +++ b/Azaion.Services/ResourcesService.cs @@ -4,6 +4,7 @@ using Azaion.Common.Database; using Azaion.Common.Entities; using LinqToDB; using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; namespace Azaion.Services; @@ -14,7 +15,7 @@ public interface IResourcesService Task SaveResource(IFormFile data, CancellationToken cancellationToken = default); } -public class ResourcesService(IOptions resourcesConfig) : IResourcesService +public class ResourcesService(IOptions resourcesConfig, ILogger logger) : IResourcesService { public async Task GetEncryptedResource(string fileName, string key, CancellationToken cancellationToken = default) { @@ -37,5 +38,6 @@ public class ResourcesService(IOptions resourcesConfig) : IReso var resourcePath = Path.Combine(resourcesConfig.Value.ResourcesFolder, data.FileName); await using var fileStream = new FileStream(resourcePath, FileMode.OpenOrCreate, FileAccess.ReadWrite); await data.CopyToAsync(fileStream, cancellationToken); + logger.LogInformation($"Resource {data.FileName} Saved Successfully"); } } \ No newline at end of file diff --git a/Azaion.Services/UserService.cs b/Azaion.Services/UserService.cs index 520dbe5..36b3f64 100644 --- a/Azaion.Services/UserService.cs +++ b/Azaion.Services/UserService.cs @@ -11,7 +11,7 @@ namespace Azaion.Services; public interface IUserService { Task RegisterUser(RegisterUserRequest request, CancellationToken cancellationToken = default); - Task ValidateUser(LoginRequest request, string? hardwareId = null, CancellationToken cancellationToken = default); + Task ValidateUser(LoginRequest request, CancellationToken cancellationToken = default); Task UpdateHardware(string email, HardwareInfo hardwareInfo, CancellationToken cancellationToken = default); Task> GetUsers(string? searchEmail, RoleEnum? searchRole, CancellationToken cancellationToken); Task CheckHardware(User user, GetResourceRequest request); @@ -37,7 +37,7 @@ public class UserService(IDbFactory dbFactory) : IUserService }); } - public async Task ValidateUser(LoginRequest request, string? hardwareId = null, CancellationToken cancellationToken = default) => + public async Task ValidateUser(LoginRequest request, CancellationToken cancellationToken = default) => await dbFactory.Run(async db => { var user = await db.Users.FirstOrDefaultAsync(x => x.Email == request.Email, token: cancellationToken); @@ -47,12 +47,6 @@ public class UserService(IDbFactory dbFactory) : IUserService if (request.Password.ToHash() != user.PasswordHash) throw new BusinessException(ExceptionEnum.WrongPassword); - if (user.Role == RoleEnum.ApiAdmin) - return user; - - // For Non-API admins hardwareId should match if it was already set - if (user.HardwareHash != null && user.HardwareHash != hardwareId) - throw new BusinessException(ExceptionEnum.HardwareIdMismatch); return user; }); diff --git a/env/01 sh-install/04-nginx-docker-registry.sh b/env/01 sh-install/04-nginx-docker-registry.sh index 03529d9..9fc16d3 100644 --- a/env/01 sh-install/04-nginx-docker-registry.sh +++ b/env/01 sh-install/04-nginx-docker-registry.sh @@ -12,8 +12,8 @@ chmod 640 .htpasswd chown root:www-data .htpasswd # create certs -certbot --nginx -d api.mywebsite.com -certbot --nginx -d docker.mywebsite.com +certbot --nginx -d api.azaion.com +certbot --nginx -d docker.azaion.com cd /etc/nginx/sites-available tee -a docker.azaion.com << END @@ -23,7 +23,6 @@ server { ssl_certificate /etc/letsencrypt/live/docker.azaion.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/docker.azaion.com/privkey.pem; - client_max_body_size 200M; location / { auth_basic "Registry"; @@ -40,7 +39,6 @@ server { server { listen 80; server_name docker.azaion.com; - client_max_body_size 200M; location / { auth_basic "Registry"; @@ -60,6 +58,7 @@ tee -a api.azaion.com << END server { listen 443 ssl; server_name api.azaion.com; + client_max_body_size 200M; ssl_certificate /etc/letsencrypt/live/api.azaion.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/api.azaion.com/privkey.pem; @@ -77,6 +76,7 @@ server { server { listen 80; server_name api.azaion.com; + client_max_body_size 200M; # Redirect all HTTP requests to HTTPS return 301 https://\$host\$request_uri; diff --git a/env/01 sh-install/05 start scripts/restart-api.sh b/env/01 sh-install/05 start scripts/restart-api.sh new file mode 100644 index 0000000..63e496f --- /dev/null +++ b/env/01 sh-install/05 start scripts/restart-api.sh @@ -0,0 +1,2 @@ +docker rm azaion.api +sh start-container.sh diff --git a/env/01 sh-install/05 start scripts/start-container.sh b/env/01 sh-install/05 start scripts/start-container.sh new file mode 100644 index 0000000..f969c6e --- /dev/null +++ b/env/01 sh-install/05 start scripts/start-container.sh @@ -0,0 +1,5 @@ +docker run \ + --env-file .env \ + -p 4000:8080 \ + -v /root/content:/app/Content \ + --name azaion.api docker.azaion.com/api \ No newline at end of file diff --git a/env/01 sh-install/05 start scripts/update-api.sh b/env/01 sh-install/05 start scripts/update-api.sh new file mode 100644 index 0000000..837e808 --- /dev/null +++ b/env/01 sh-install/05 start scripts/update-api.sh @@ -0,0 +1,6 @@ +docker stop azaion.api +docker rm azaion.api +docker login docker.azaion.com +docker pull docker.azaion.com/api:latest +sh start-container.sh +