From e46593222237bda43edbcc8adb2fd084d3b8e928 Mon Sep 17 00:00:00 2001 From: Mikhail Kuznetsov Date: Thu, 1 Jun 2023 16:42:44 +1000 Subject: [PATCH] cicd --- .gitlab-ci.yml | 93 +++++++++++++++++++ NuGet.config | 12 +++ PARR_API.sln => PARR.API.sln | 20 ++-- .../Contracts/V1/ApiRoutes.cs | 0 .../Controllers/V1/ApiStatusController.cs | 0 .../Controllers/V1/Base/BaseApiController.cs | 0 .../Controllers/V1/HomeController.cs | 0 {PARR_API => PARR.API}/Dockerfile | 14 ++- .../Installers/ApiServicesInstaller.cs | 0 .../Installers/CorsInstaller.cs | 0 .../Installers/SettingsInstaller.cs | 0 .../Installers/SwaggerInstaller.cs | 0 .../DomainToResponseProfile.cs | 0 .../MappingProfiles/RequestToDomainProfile.cs | 0 {PARR_API => PARR.API}/PARR.API.csproj | 0 {PARR_API => PARR.API}/Program.cs | 0 .../Properties/launchSettings.json | 0 .../Services/Implementations/UriService.cs | 0 .../Services/Interfaces/IUriService.cs | 0 .../Settings/CorsSettings.cs | 0 .../appsettings.Development.json | 0 {PARR_API => PARR.API}/appsettings.json | 0 PARR.Worker/PARR.Worker/Dockerfile | 29 ++++++ PARR.Worker/PARR.Worker/PARR.Worker.csproj | 3 + .../Properties/launchSettings.json | 11 ++- docker-compose.aihit-syncher.yml | 20 ++++ docker-compose.dcproj | 6 +- docker-compose.override.yml | 8 -- docker-compose.yml | 24 +++-- 29 files changed, 206 insertions(+), 34 deletions(-) create mode 100644 .gitlab-ci.yml create mode 100644 NuGet.config rename PARR_API.sln => PARR.API.sln (82%) rename {PARR_API => PARR.API}/Contracts/V1/ApiRoutes.cs (100%) rename {PARR_API => PARR.API}/Controllers/V1/ApiStatusController.cs (100%) rename {PARR_API => PARR.API}/Controllers/V1/Base/BaseApiController.cs (100%) rename {PARR_API => PARR.API}/Controllers/V1/HomeController.cs (100%) rename {PARR_API => PARR.API}/Dockerfile (62%) rename {PARR_API => PARR.API}/Installers/ApiServicesInstaller.cs (100%) rename {PARR_API => PARR.API}/Installers/CorsInstaller.cs (100%) rename {PARR_API => PARR.API}/Installers/SettingsInstaller.cs (100%) rename {PARR_API => PARR.API}/Installers/SwaggerInstaller.cs (100%) rename {PARR_API => PARR.API}/MappingProfiles/DomainToResponseProfile.cs (100%) rename {PARR_API => PARR.API}/MappingProfiles/RequestToDomainProfile.cs (100%) rename {PARR_API => PARR.API}/PARR.API.csproj (100%) rename {PARR_API => PARR.API}/Program.cs (100%) rename {PARR_API => PARR.API}/Properties/launchSettings.json (100%) rename {PARR_API => PARR.API}/Services/Implementations/UriService.cs (100%) rename {PARR_API => PARR.API}/Services/Interfaces/IUriService.cs (100%) rename {PARR_API => PARR.API}/Settings/CorsSettings.cs (100%) rename {PARR_API => PARR.API}/appsettings.Development.json (100%) rename {PARR_API => PARR.API}/appsettings.json (100%) create mode 100644 PARR.Worker/PARR.Worker/Dockerfile create mode 100644 docker-compose.aihit-syncher.yml delete mode 100644 docker-compose.override.yml diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 00000000..4b791e0a --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,93 @@ +variables: + REPO: "10.99.253.167:8088" + PROD_NAME_API: "parr/parr-api" + PROD_NAME_AIHIT: "parr/parr-aihit-syncher" + +stages: + - build + - deploy + + +### API PROD ### +prod_build: + stage: build + only: + - /^v[0-9]+\.[0-9]+\.[0-9]+$/ + except: + - branches + services: + - name: docker:20.10.21-dind + command: ["--insecure-registry=10.99.253.167:8090","--registry-mirror=http://10.99.253.167:8090","--insecure-registry=10.99.253.167:8088","--registry-mirror=http://10.99.253.167:8088"] + variables: + DOCKER_HOST: tcp://docker:2375 + DOCKER_DRIVER: overlay2 + DOCKER_TLS_CERTDIR: "" + script: + - IMAGE_VERSION=$(echo $CI_COMMIT_TAG | tr -d v) + - docker build -t $REPO/$PROD_NAME_API:$CI_COMMIT_TAG -t $REPO/$PROD_NAME_API:latest -t $PROD_NAME_API:$CI_COMMIT_TAG -t $PROD_NAME_API:latest --build-arg app_version=$IMAGE_VERSION -f PARR.API/Dockerfile . + - docker login -u $NEXUS_PUSH_USER -p $NEXUS_PUSH_PASS $REPO + - docker push --all-tags $REPO/$PROD_NAME_API + tags: + - docker + + +prod_deploy: + stage: deploy + environment: + name: prod + url: http://10.99.253.215:8090/api/v1/version + only: + - /^v[0-9]+\.[0-9]+\.[0-9]+$/ + except: + - branches + script: + - tag=$CI_COMMIT_TAG docker compose up -d + parallel: + matrix: + - RUNNER: shell-1 + tags: + - ${RUNNER} + + + + +### AIHIT PROD ### +prod_aihit_build: + stage: build + only: + - /^as[0-9]+\.[0-9]+\.[0-9]+$/ + except: + - branches + services: + - name: docker:20.10.21-dind + command: ["--insecure-registry=10.99.253.167:8090","--registry-mirror=http://10.99.253.167:8090","--insecure-registry=10.99.253.167:8088","--registry-mirror=http://10.99.253.167:8088"] + variables: + DOCKER_HOST: tcp://docker:2375 + DOCKER_DRIVER: overlay2 + DOCKER_TLS_CERTDIR: "" + script: + - IMAGE_VERSION=$(echo $CI_COMMIT_TAG | tr wl v) + - docker build -t $REPO/$PROD_NAME_AIHIT:$IMAGE_VERSION -t $REPO/$PROD_NAME_AIHIT:latest -t $PROD_NAME_AIHIT:$IMAGE_VERSION -t $PROD_NAME_AIHIT:latest -f PARR.Worker/Dockerfile . + - docker login -u $NEXUS_PUSH_USER -p $NEXUS_PUSH_PASS $REPO + - docker push --all-tags $REPO/$PROD_NAME_AIHIT + tags: + - docker + + +prod_aihit_deploy: + stage: deploy + environment: + name: parr-aihit-syncher + only: + - /^as[0-9]+\.[0-9]+\.[0-9]+$/ + except: + - branches + script: + - IMAGE_VERSION=$(echo $CI_COMMIT_TAG | tr as v) + - tag=$IMAGE_VERSION docker compose -f docker-compose.aihit-syncher.yml up -d + parallel: + matrix: + - RUNNER: shell-as-1 + tags: + - ${RUNNER} + diff --git a/NuGet.config b/NuGet.config new file mode 100644 index 00000000..e74aed57 --- /dev/null +++ b/NuGet.config @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/PARR_API.sln b/PARR.API.sln similarity index 82% rename from PARR_API.sln rename to PARR.API.sln index b594be0d..a2df5e56 100644 --- a/PARR_API.sln +++ b/PARR.API.sln @@ -3,17 +3,23 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 17 VisualStudioVersion = 17.4.33213.308 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PARR.API", "PARR_API\PARR.API.csproj", "{82C57299-DA04-4A99-9C04-614FDDCE7AA1}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PARR.API", "PARR.API\PARR.API.csproj", "{82C57299-DA04-4A99-9C04-614FDDCE7AA1}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PARR.DAL", "PARR.DAL\PARR.DAL.csproj", "{CBC557EE-382E-4386-B4D2-2EE3DC9A7CBE}" EndProject -Project("{E53339B2-1760-4266-BCC7-CA923CBCF16C}") = "docker-compose", "docker-compose.dcproj", "{AF6BD539-34B2-4D57-AEB3-F6FDE26B98ED}" -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PARR.Mail", "PARR.Mail\PARR.Mail\PARR.Mail.csproj", "{228C8124-69E4-4AE0-8C33-0438E54FF1BA}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PARR.Worker", "PARR.Worker\PARR.Worker\PARR.Worker.csproj", "{D15F308C-9F63-4D69-B06E-DDA26FEE9BAB}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PARR.AIHIT", "PARR.AIHIT\AIHIT\PARR.AIHIT.csproj", "{3ED4E1CE-2AF5-4EB3-B7DF-B77CCC242B9E}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PARR.AIHIT", "PARR.AIHIT\AIHIT\PARR.AIHIT.csproj", "{3ED4E1CE-2AF5-4EB3-B7DF-B77CCC242B9E}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{C170A32C-5A9D-4F1C-B6FF-FAE12736ED17}" + ProjectSection(SolutionItems) = preProject + .gitlab-ci.yml = .gitlab-ci.yml + NuGet.config = NuGet.config + EndProjectSection +EndProject +Project("{E53339B2-1760-4266-BCC7-CA923CBCF16C}") = "docker-compose", "docker-compose.dcproj", "{AB278172-BFB4-4D54-9022-2D2A5B3338D7}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -29,9 +35,6 @@ Global {CBC557EE-382E-4386-B4D2-2EE3DC9A7CBE}.Debug|Any CPU.Build.0 = Debug|Any CPU {CBC557EE-382E-4386-B4D2-2EE3DC9A7CBE}.Release|Any CPU.ActiveCfg = Release|Any CPU {CBC557EE-382E-4386-B4D2-2EE3DC9A7CBE}.Release|Any CPU.Build.0 = Release|Any CPU - {AF6BD539-34B2-4D57-AEB3-F6FDE26B98ED}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {AF6BD539-34B2-4D57-AEB3-F6FDE26B98ED}.Release|Any CPU.ActiveCfg = Release|Any CPU - {AF6BD539-34B2-4D57-AEB3-F6FDE26B98ED}.Release|Any CPU.Build.0 = Release|Any CPU {228C8124-69E4-4AE0-8C33-0438E54FF1BA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {228C8124-69E4-4AE0-8C33-0438E54FF1BA}.Debug|Any CPU.Build.0 = Debug|Any CPU {228C8124-69E4-4AE0-8C33-0438E54FF1BA}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -44,6 +47,9 @@ Global {3ED4E1CE-2AF5-4EB3-B7DF-B77CCC242B9E}.Debug|Any CPU.Build.0 = Debug|Any CPU {3ED4E1CE-2AF5-4EB3-B7DF-B77CCC242B9E}.Release|Any CPU.ActiveCfg = Release|Any CPU {3ED4E1CE-2AF5-4EB3-B7DF-B77CCC242B9E}.Release|Any CPU.Build.0 = Release|Any CPU + {AB278172-BFB4-4D54-9022-2D2A5B3338D7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AB278172-BFB4-4D54-9022-2D2A5B3338D7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AB278172-BFB4-4D54-9022-2D2A5B3338D7}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/PARR_API/Contracts/V1/ApiRoutes.cs b/PARR.API/Contracts/V1/ApiRoutes.cs similarity index 100% rename from PARR_API/Contracts/V1/ApiRoutes.cs rename to PARR.API/Contracts/V1/ApiRoutes.cs diff --git a/PARR_API/Controllers/V1/ApiStatusController.cs b/PARR.API/Controllers/V1/ApiStatusController.cs similarity index 100% rename from PARR_API/Controllers/V1/ApiStatusController.cs rename to PARR.API/Controllers/V1/ApiStatusController.cs diff --git a/PARR_API/Controllers/V1/Base/BaseApiController.cs b/PARR.API/Controllers/V1/Base/BaseApiController.cs similarity index 100% rename from PARR_API/Controllers/V1/Base/BaseApiController.cs rename to PARR.API/Controllers/V1/Base/BaseApiController.cs diff --git a/PARR_API/Controllers/V1/HomeController.cs b/PARR.API/Controllers/V1/HomeController.cs similarity index 100% rename from PARR_API/Controllers/V1/HomeController.cs rename to PARR.API/Controllers/V1/HomeController.cs diff --git a/PARR_API/Dockerfile b/PARR.API/Dockerfile similarity index 62% rename from PARR_API/Dockerfile rename to PARR.API/Dockerfile index 9e5c59f7..5e63105b 100644 --- a/PARR_API/Dockerfile +++ b/PARR.API/Dockerfile @@ -1,11 +1,12 @@ #See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging. -FROM mcr.microsoft.com/dotnet/aspnet:7.0 AS base +FROM 10.99.253.167:8090/dotnet/aspnet:7.0 AS base WORKDIR /app EXPOSE 80 -FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build +FROM 10.99.253.167:8090/dotnet/sdk:7.0 AS build WORKDIR /src +COPY ["NuGet.config", "."] COPY ["PARR_API/PARR.API.csproj", "PARR_API/"] COPY ["PARR.DAL/PARR.DAL.csproj", "PARR.DAL/"] RUN dotnet restore "PARR_API/PARR.API.csproj" @@ -14,9 +15,14 @@ WORKDIR "/src/PARR_API" RUN dotnet build "PARR.API.csproj" -c Release -o /app/build FROM build AS publish -RUN dotnet publish "PARR.API.csproj" -c Release -o /app/publish /p:UseAppHost=false +ARG app_version=0.0.0-default +RUN dotnet publish "PARR.API.csproj" -c Release -o /app/publish /p:UseAppHost=false /p:Version=$app_version FROM base AS final WORKDIR /app COPY --from=publish /app/publish . -ENTRYPOINT ["dotnet", "PARR.API.dll"] \ No newline at end of file +ENTRYPOINT ["dotnet", "PARR.API.dll"] + + +### EXAMPLE ### +# docker build -t parr-api:v1.0.0 --build-arg app_version=1.0.0 -f PARR.API/Dockerfile . \ No newline at end of file diff --git a/PARR_API/Installers/ApiServicesInstaller.cs b/PARR.API/Installers/ApiServicesInstaller.cs similarity index 100% rename from PARR_API/Installers/ApiServicesInstaller.cs rename to PARR.API/Installers/ApiServicesInstaller.cs diff --git a/PARR_API/Installers/CorsInstaller.cs b/PARR.API/Installers/CorsInstaller.cs similarity index 100% rename from PARR_API/Installers/CorsInstaller.cs rename to PARR.API/Installers/CorsInstaller.cs diff --git a/PARR_API/Installers/SettingsInstaller.cs b/PARR.API/Installers/SettingsInstaller.cs similarity index 100% rename from PARR_API/Installers/SettingsInstaller.cs rename to PARR.API/Installers/SettingsInstaller.cs diff --git a/PARR_API/Installers/SwaggerInstaller.cs b/PARR.API/Installers/SwaggerInstaller.cs similarity index 100% rename from PARR_API/Installers/SwaggerInstaller.cs rename to PARR.API/Installers/SwaggerInstaller.cs diff --git a/PARR_API/MappingProfiles/DomainToResponseProfile.cs b/PARR.API/MappingProfiles/DomainToResponseProfile.cs similarity index 100% rename from PARR_API/MappingProfiles/DomainToResponseProfile.cs rename to PARR.API/MappingProfiles/DomainToResponseProfile.cs diff --git a/PARR_API/MappingProfiles/RequestToDomainProfile.cs b/PARR.API/MappingProfiles/RequestToDomainProfile.cs similarity index 100% rename from PARR_API/MappingProfiles/RequestToDomainProfile.cs rename to PARR.API/MappingProfiles/RequestToDomainProfile.cs diff --git a/PARR_API/PARR.API.csproj b/PARR.API/PARR.API.csproj similarity index 100% rename from PARR_API/PARR.API.csproj rename to PARR.API/PARR.API.csproj diff --git a/PARR_API/Program.cs b/PARR.API/Program.cs similarity index 100% rename from PARR_API/Program.cs rename to PARR.API/Program.cs diff --git a/PARR_API/Properties/launchSettings.json b/PARR.API/Properties/launchSettings.json similarity index 100% rename from PARR_API/Properties/launchSettings.json rename to PARR.API/Properties/launchSettings.json diff --git a/PARR_API/Services/Implementations/UriService.cs b/PARR.API/Services/Implementations/UriService.cs similarity index 100% rename from PARR_API/Services/Implementations/UriService.cs rename to PARR.API/Services/Implementations/UriService.cs diff --git a/PARR_API/Services/Interfaces/IUriService.cs b/PARR.API/Services/Interfaces/IUriService.cs similarity index 100% rename from PARR_API/Services/Interfaces/IUriService.cs rename to PARR.API/Services/Interfaces/IUriService.cs diff --git a/PARR_API/Settings/CorsSettings.cs b/PARR.API/Settings/CorsSettings.cs similarity index 100% rename from PARR_API/Settings/CorsSettings.cs rename to PARR.API/Settings/CorsSettings.cs diff --git a/PARR_API/appsettings.Development.json b/PARR.API/appsettings.Development.json similarity index 100% rename from PARR_API/appsettings.Development.json rename to PARR.API/appsettings.Development.json diff --git a/PARR_API/appsettings.json b/PARR.API/appsettings.json similarity index 100% rename from PARR_API/appsettings.json rename to PARR.API/appsettings.json diff --git a/PARR.Worker/PARR.Worker/Dockerfile b/PARR.Worker/PARR.Worker/Dockerfile new file mode 100644 index 00000000..d3ab2197 --- /dev/null +++ b/PARR.Worker/PARR.Worker/Dockerfile @@ -0,0 +1,29 @@ +#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging. + +FROM 10.99.253.167:8090/dotnet/runtime:7.0 AS base +WORKDIR /app + +FROM 10.99.253.167:8090/dotnet/sdk:7.0 AS build +WORKDIR /src +COPY ["NuGet.config", "."] +COPY ["PARR.Worker/PARR.Worker/PARR.Worker.csproj", "PARR.Worker/PARR.Worker/"] +COPY ["PARR.AIHIT/AIHIT/PARR.AIHIT.csproj", "PARR.AIHIT/AIHIT/"] +COPY ["PARR.DAL/PARR.DAL.csproj", "PARR.DAL/"] +COPY ["PARR.Mail/PARR.Mail/PARR.Mail.csproj", "PARR.Mail/PARR.Mail/"] +RUN dotnet restore "PARR.Worker/PARR.Worker/PARR.Worker.csproj" +COPY . . +WORKDIR "/src/PARR.Worker/PARR.Worker" +RUN dotnet build "PARR.Worker.csproj" -c Release -o /app/build + +FROM build AS publish +ARG app_version=0.0.0-default +RUN dotnet publish "PARR.Worker.csproj" -c Release -o /app/publish /p:UseAppHost=false /p:Version=$app_version + +FROM base AS final +WORKDIR /app +COPY --from=publish /app/publish . +ENTRYPOINT ["dotnet", "PARR.Worker.dll"] + + +### EXAMPLE ### +# docker build -t parr-aihit-syncher:v1.0.0 --build-arg app_version=1.0.0 -f PARR.Worker/Dockerfile . \ No newline at end of file diff --git a/PARR.Worker/PARR.Worker/PARR.Worker.csproj b/PARR.Worker/PARR.Worker/PARR.Worker.csproj index 873749d8..8d361a46 100644 --- a/PARR.Worker/PARR.Worker/PARR.Worker.csproj +++ b/PARR.Worker/PARR.Worker/PARR.Worker.csproj @@ -5,11 +5,14 @@ enable enable dotnet-PARR.Worker-87bfa085-3c62-4b97-b25f-bdece8fc03df + Linux + ..\.. + diff --git a/PARR.Worker/PARR.Worker/Properties/launchSettings.json b/PARR.Worker/PARR.Worker/Properties/launchSettings.json index a4856b40..115b11d7 100644 --- a/PARR.Worker/PARR.Worker/Properties/launchSettings.json +++ b/PARR.Worker/PARR.Worker/Properties/launchSettings.json @@ -1,11 +1,14 @@ -{ +{ "profiles": { "PARR.Worker": { "commandName": "Project", - "dotnetRunMessages": true, "environmentVariables": { "DOTNET_ENVIRONMENT": "Development" - } + }, + "dotnetRunMessages": true + }, + "Docker": { + "commandName": "Docker" } } -} +} \ No newline at end of file diff --git a/docker-compose.aihit-syncher.yml b/docker-compose.aihit-syncher.yml new file mode 100644 index 00000000..392b7a40 --- /dev/null +++ b/docker-compose.aihit-syncher.yml @@ -0,0 +1,20 @@ +version: '3.4' + +#AIHIT SYNCHER +services: + mail-reader: + image: 10.99.253.167:8090/parr/parr-aihit-syncher:${tag:-latest} + container_name: parr-aihit-syncher + restart: always + environment: + - ASPNETCORE_ENVIRONMENT=Production + - TZ=Europe/Moscow + volumes: + - /var/log/parr-aihit-syncher:/app/log + + +# последняя версия +#docker compose -f docker-compose.aihit-syncher.yml up -d +# указанная версия +#tag=v1.0.0 docker compose -f docker-compose.aihit-syncher.yml up -d + diff --git a/docker-compose.dcproj b/docker-compose.dcproj index d451c895..754dcc9c 100644 --- a/docker-compose.dcproj +++ b/docker-compose.dcproj @@ -3,15 +3,13 @@ 2.1 Linux - af6bd539-34b2-4d57-aeb3-f6fde26b98ed + ab278172-bfb4-4d54-9022-2d2a5b3338d7 LaunchBrowser {Scheme}://localhost:{ServicePort}/swagger parr.api - - docker-compose.yml - + diff --git a/docker-compose.override.yml b/docker-compose.override.yml deleted file mode 100644 index 3546a8d5..00000000 --- a/docker-compose.override.yml +++ /dev/null @@ -1,8 +0,0 @@ -#version: '3.4' - -#services: -# parr.api: -# environment: -# - ASPNETCORE_ENVIRONMENT=Development -# ports: -# - "80" diff --git a/docker-compose.yml b/docker-compose.yml index f8a19b73..c1ce6986 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,8 +1,18 @@ -#version: '3.4' +version: '3.4' -#services: -# parr.api: -# image: ${DOCKER_REGISTRY-}parrapi -# build: -# context: . -# dockerfile: PARR_API/Dockerfile +#API +services: + rzdi-api: + image: 10.99.253.167:8090/parr/parr-api:${tag:-latest} + container_name: parr-api + restart: always + environment: + - ASPNETCORE_ENVIRONMENT=Production + - TZ=Europe/Moscow + ports: + - 8082:80 + volumes: + - /var/log/parr-api:/app/log + + +#tag=v1.0.0 docker compose up -d \ No newline at end of file