Merge branch 'dev'
# Conflicts: # docs/Microservicios-NET-Arquitectura-para-aplicaciones-NET-Contenerizadas-(Microsoft-eBook)-es-ES.pdf # docs/NET-Microservices-Architecture-for-Containerized-NET-Applications-(Microsoft-eBook).pdf # docs/NET-Microservices-Architecture-for-Containerized-NET-Applications-(Microsoft-for-Kindle).mobi # docs/NET-Microservices-Architecture-for-Containerized-NET-Applications-(Microsoft-for-eReader).epub # readme/readme-docker-compose.md
32
.dockerignore
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
.dockerignore
|
||||||
|
.env
|
||||||
|
.git
|
||||||
|
.gitignore
|
||||||
|
.vs
|
||||||
|
.vscode
|
||||||
|
docker-compose*.yml
|
||||||
|
docker-compose.dcproj
|
||||||
|
*.sln
|
||||||
|
!eShopOnContainers-ServicesAndWebApps.sln
|
||||||
|
*.md
|
||||||
|
hosts
|
||||||
|
LICENSE
|
||||||
|
*.testsettings
|
||||||
|
vsts-docs
|
||||||
|
ServiceFabric
|
||||||
|
readme
|
||||||
|
k8s
|
||||||
|
img
|
||||||
|
docs
|
||||||
|
deploy
|
||||||
|
Components
|
||||||
|
cli-windows
|
||||||
|
cli-mac
|
||||||
|
cli-linux
|
||||||
|
**/bin/
|
||||||
|
**/obj/
|
||||||
|
**/node_modules/
|
||||||
|
**/bower_components/
|
||||||
|
**/wwwroot/lib/
|
||||||
|
global.json
|
||||||
|
src/Web/WebSPA/wwwroot/
|
2
.env
@ -5,7 +5,7 @@
|
|||||||
# The IP below should be swapped to your real IP or DNS name, like 192.168.88.248, etc. if testing from remote browsers or mobile devices
|
# The IP below should be swapped to your real IP or DNS name, like 192.168.88.248, etc. if testing from remote browsers or mobile devices
|
||||||
|
|
||||||
ESHOP_EXTERNAL_DNS_NAME_OR_IP=localhost
|
ESHOP_EXTERNAL_DNS_NAME_OR_IP=localhost
|
||||||
ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP=10.121.122.92
|
ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP=10.121.122.162
|
||||||
|
|
||||||
#ESHOP_AZURE_REDIS_BASKET_DB=<YourAzureRedisBasketInfo>
|
#ESHOP_AZURE_REDIS_BASKET_DB=<YourAzureRedisBasketInfo>
|
||||||
#ESHOP_AZURE_STORAGE_CATALOG_URL=<YourAzureStorage_Catalog_BLOB_URL>
|
#ESHOP_AZURE_STORAGE_CATALOG_URL=<YourAzureStorage_Catalog_BLOB_URL>
|
||||||
|
@ -1,5 +1,8 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<configuration>
|
<configuration>
|
||||||
|
<config>
|
||||||
|
<add key="repositoryPath" value="packages" />
|
||||||
|
</config>
|
||||||
<packageSources>
|
<packageSources>
|
||||||
<add key="AspNetCore" value="https://dotnet.myget.org/F/aspnet-feb2017-patch/api/v3/index.json" />
|
<add key="AspNetCore" value="https://dotnet.myget.org/F/aspnet-feb2017-patch/api/v3/index.json" />
|
||||||
<add key="NuGet" value="https://api.nuget.org/v3/index.json" />
|
<add key="NuGet" value="https://api.nuget.org/v3/index.json" />
|
||||||
|
40
README.md
@ -1,25 +1,28 @@
|
|||||||
# eShopOnContainers - Microservices Architecture and Containers based Reference Application (**BETA state** - Visual Studio 2017 and CLI environments compatible)
|
# eShopOnContainers - Microservices Architecture and Containers based Reference Application (**BETA state** - Visual Studio 2017 and CLI environments compatible)
|
||||||
Sample .NET Core reference application, powered by Microsoft, based on a simplified microservices architecture and Docker containers. <p>
|
Sample .NET Core reference application, powered by Microsoft, based on a simplified microservices architecture and Docker containers. <p>
|
||||||
**Note Visual Studio 2017 version required**: This is important as of Oct. 11th 2017. For working with Docker and docker-compose files (needed with eShopOnContainers), do not migrate to VS 2017 15.4 as it has a bug when using TAGs in the docker-compose files.
|
|
||||||
Please, either use VS 2017 15.35 or VS 2017 15.5 Preview 1 (bug is fixed here) or later.
|
**NEWS / ANNOUNCEMENTS**
|
||||||
VS Preview installs next to your stable Visual Studio IDE, allowing you to use either independently.
|
Do you want to be up-to-date on .NET Architecture guidance and reference apps like eShopOnContainers? --> Subscribe by "WATCHING" this new GitHub repo: https://github.com/dotnet-architecture/News
|
||||||
Download of Preview here: https://www.visualstudio.com/vs/preview/
|
|
||||||
|
|
||||||
**Note for Pull Requests**: We accept pull request from the community. When doing it, please do it onto the DEV branch which is the consolidated work-in-progress branch. Do not request it onto Master, if possible.
|
**Note for Pull Requests**: We accept pull request from the community. When doing it, please do it onto the DEV branch which is the consolidated work-in-progress branch. Do not request it onto Master, if possible.
|
||||||
|
|
||||||
## Moving to .NET Core 2.0 "wave"
|
## Updated for .NET Core 2.0 "wave" of technologies
|
||||||
NOTE: During August/September 2017 we'll be moving the solution to .NET Core "wave". Not just compilation but also new recommended code in EF Core 2.0, ASP.NET Core 2.0, and other new related versions.
|
NOTE: We have migrated the whole server-side solution to .NET Core 2.0 "wave". Not just compilation but also new recommended code in EF Core 2.0, ASP.NET Core 2.0, and other new related versions.
|
||||||
|
|
||||||
|
The **dockerfiles** in the solution have also been updated and now support [**Docker Multi-Stage**](https://blogs.msdn.microsoft.com/stevelasker/2017/09/11/net-and-multistage-dockerfiles/) since mid-December 2017.
|
||||||
|
|
||||||
|
For a list on the new .NET Core 2.0 related implemented features, see this [blog post](https://blogs.msdn.microsoft.com/dotnet/2017/08/02/microservices-and-docker-containers-architecture-patterns-and-development-guidance/).
|
||||||
|
|
||||||
>**PLEASE** Read our [branch guide](./branch-guide.md) to know about our branching policy
|
>**PLEASE** Read our [branch guide](./branch-guide.md) to know about our branching policy
|
||||||
|
|
||||||
> ### DISCLAIMER
|
> ### DISCLAIMER
|
||||||
> **IMPORTANT:** The current state of this sample application is **BETA**, consider it version 0.1, a foundational version. Therefore, many areas could be improved and change significantly while refactoring current code and implementing new features. Feedback with improvements and pull requests from the community will be highly appreciated and accepted.
|
> **IMPORTANT:** The current state of this sample application is **BETA**, because we are constantly evolving towards new released technologies. Therefore, many areas could be improved and change significantly while refactoring current code and implementing new features. Feedback with improvements and pull requests from the community will be highly appreciated and accepted.
|
||||||
>
|
>
|
||||||
> This reference application proposes a simplified microservice oriented architecture implementation to introduce technologies like .NET Core with Docker containers through a comprehensive application. The chosen domain is an eShop/eCommerce but simply because it is a well-know domain by most people/developers.
|
> This reference application proposes a simplified microservice oriented architecture implementation to introduce technologies like .NET Core with Docker containers through a comprehensive application. The chosen domain is an eShop/eCommerce but simply because it is a well-know domain by most people/developers.
|
||||||
However, this sample application should not be considered as an "eCommerce reference model", at all. The implemented business domain might not be ideal from an eCommerce business point of view. It is neither trying to solve all the problems in a large, scalable and mission-critical distributed system. It is just a bootstrap for developers to easily get started in the world of Docker containers and microservices with .NET Core.
|
However, this sample application should not be considered as an "eCommerce reference model", at all. The implemented business domain might not be ideal from an eCommerce business point of view. It is neither trying to solve all the problems in a large, scalable and mission-critical distributed system. It is just a bootstrap for developers to easily get started in the world of Docker containers and microservices with .NET Core.
|
||||||
> <p>For example, the next step (still not covered in eShopOnContainers) after understanding Docker containers and microservices development with .NET Core, is to select a microservice cluster/orchestrator like Docker Swarm, Kubernetes or DC/OS (in Azure Container Service) or Azure Service Fabric which in most of the cases will require additional partial changes to your application's configuration (although the present architecture should work on most orchestrators with small changes).
|
> <p>For example, the next step after running the solution in the local dev PC and understanding Docker containers and microservices development with .NET Core, is to select a microservice cluster/orchestrator like Kubernetes in Azure or Azure Service Fabric, both environments tested and supported by this solution.
|
||||||
> Additional steps would be to move your databases to HA cloud services, or to implement your EventBus with Azure Service Bus or any other production ready Service Bus in the market.
|
> Additional steps would be to move your databases to HA cloud services (like Azure SQL Database), or to implement your EventBus with Azure Service Bus or any other production ready Service Bus in the market.
|
||||||
> <p> In the future we might fork this project and make multiple versions targeting specific microservice cluster/orchestrators plus using additional cloud infrastructure. <p>
|
> <p>
|
||||||
> <img src="img/exploring-to-production-ready.png">
|
> <img src="img/exploring-to-production-ready.png">
|
||||||
> Read the planned <a href='https://github.com/dotnet/eShopOnContainers/wiki/01.-Roadmap-and-Milestones-for-future-releases'>Roadmap and Milestones for future releases of eShopOnContainers</a> within the Wiki for further info about possible new implementations and provide feedback at the <a href='https://github.com/dotnet/eShopOnContainers/issues'>ISSUES section</a> if you'd like to see any specific scenario implemented or improved. Also, feel free to discuss on any current issue.
|
> Read the planned <a href='https://github.com/dotnet/eShopOnContainers/wiki/01.-Roadmap-and-Milestones-for-future-releases'>Roadmap and Milestones for future releases of eShopOnContainers</a> within the Wiki for further info about possible new implementations and provide feedback at the <a href='https://github.com/dotnet/eShopOnContainers/issues'>ISSUES section</a> if you'd like to see any specific scenario implemented or improved. Also, feel free to discuss on any current issue.
|
||||||
|
|
||||||
@ -66,11 +69,13 @@ You can download them and start reviewing these Guides/eBooks here:
|
|||||||
| Architecting & Developing | Containers Lifecycle & CI/CD | App patterns with Xamarin.Forms |
|
| Architecting & Developing | Containers Lifecycle & CI/CD | App patterns with Xamarin.Forms |
|
||||||
| ------------ | ------------| ------------|
|
| ------------ | ------------| ------------|
|
||||||
| <a href='https://aka.ms/microservicesebook'><img src="img/ebook_arch_dev_microservices_containers_cover.png"> </a> | <a href='https://aka.ms/dockerlifecycleebook'> <img src="img/ebook_containers_lifecycle.png"> </a> | <a href='https://aka.ms/xamarinpatternsebook'> <img src="img/xamarin-enterprise-patterns-ebook-cover-small.png"> </a> |
|
| <a href='https://aka.ms/microservicesebook'><img src="img/ebook_arch_dev_microservices_containers_cover.png"> </a> | <a href='https://aka.ms/dockerlifecycleebook'> <img src="img/ebook_containers_lifecycle.png"> </a> | <a href='https://aka.ms/xamarinpatternsebook'> <img src="img/xamarin-enterprise-patterns-ebook-cover-small.png"> </a> |
|
||||||
| <sup> <a href='https://aka.ms/microservicesebook'>**Download** (First Edition)</a> </sup> | <sup> <a href='https://aka.ms/dockerlifecycleebook'>**Download** (First Edition) </a> </sup> | <sup> <a href='https://aka.ms/xamarinpatternsebook'>**Download** (First Edition) </a> </sup> |
|
| <sup> <a href='https://aka.ms/microservicesebook'>**Download .PDF** (2nd Edition)</a> </sup> | <sup> <a href='https://aka.ms/dockerlifecycleebook'>**Download** </a> </sup> | <sup> <a href='https://aka.ms/xamarinpatternsebook'>**Download** </a> </sup> |
|
||||||
|
|
||||||
|
Download in other formats (**eReaders** like **MOBI**, **EPUB**) and other eBooks at the [.NET Architecture center](http://dot.net/architecture).
|
||||||
|
|
||||||
Send feedback to [dotnet-architecture-ebooks-feedback@service.microsoft.com](dotnet-architecture-ebooks-feedback@service.microsoft.com)
|
Send feedback to [dotnet-architecture-ebooks-feedback@service.microsoft.com](dotnet-architecture-ebooks-feedback@service.microsoft.com)
|
||||||
<p>
|
|
||||||
However, we encourage to download and review the "Architecting & Developing eBook" because the architectural styles and architectural patterns and technologies explained in the guidance are using this reference application when explaining many pattern implementations, so you'll understand much better the context, design and decisions taken in the current architecture and internal designs.
|
However, we encourage to download and review the [Architecting and Developing Microservices eBook](https://aka.ms/microservicesebook) because the architectural styles and architectural patterns and technologies explained in the guidance are using this reference application when explaining many pattern implementations, so you'll understand much better the context, design and decisions taken in the current architecture and internal designs.
|
||||||
|
|
||||||
## Overview of the application code
|
## Overview of the application code
|
||||||
In this repo you can find a sample reference application that will help you to understand how to implement a microservice architecture based application using <b>.NET Core</b> and <b>Docker</b>.
|
In this repo you can find a sample reference application that will help you to understand how to implement a microservice architecture based application using <b>.NET Core</b> and <b>Docker</b>.
|
||||||
@ -89,7 +94,7 @@ Finally, those microservices are consumed by multiple client web and mobile apps
|
|||||||
<b>*MVC Application (ASP.NET Core)*</b>: It's an MVC application where you can find interesting scenarios on how to consume HTTP-based microservices from C# running in the server side, as it is a typical ASP.NET Core MVC application. Since it is a server-side application, access to other containers/microservices is done within the internal Docker Host network with its internal name resolution.
|
<b>*MVC Application (ASP.NET Core)*</b>: It's an MVC application where you can find interesting scenarios on how to consume HTTP-based microservices from C# running in the server side, as it is a typical ASP.NET Core MVC application. Since it is a server-side application, access to other containers/microservices is done within the internal Docker Host network with its internal name resolution.
|
||||||
<img src="img/eshop-webmvc-app-screenshot.png">
|
<img src="img/eshop-webmvc-app-screenshot.png">
|
||||||
<br>
|
<br>
|
||||||
<b>*SPA (Single Page Application)*</b>: Providing similar "eShop business functionality" but developed with Angular 2, Typescript and slightly using ASP.NET Core MVC. This is another approach for client web applications to be used when you want to have a more modern client behavior which is not behaving with the typical browser round-trip on every action but behaving like a Single-Page-Application which is more similar to a desktop app usage experience. The consumption of the HTTP-based microservices is done from TypeScript/JavaScript in the client browser, so the client calls to the microservices come from out of the Docker Host internal network (Like from your network or even from the Internet).
|
<b>*SPA (Single Page Application)*</b>: Providing similar "eShop business functionality" but developed with Angular, Typescript and slightly using ASP.NET Core MVC. This is another approach for client web applications to be used when you want to have a more modern client behavior which is not behaving with the typical browser round-trip on every action but behaving like a Single-Page-Application which is more similar to a desktop app usage experience. The consumption of the HTTP-based microservices is done from TypeScript/JavaScript in the client browser, so the client calls to the microservices come from out of the Docker Host internal network (Like from your network or even from the Internet).
|
||||||
<img src="img/eshop-webspa-app-screenshot.png">
|
<img src="img/eshop-webspa-app-screenshot.png">
|
||||||
<br>
|
<br>
|
||||||
<b>*Xamarin Mobile App (For iOS, Android and Windows/UWP)*</b>: It is a client mobile app supporting the most common mobile OS platforms (iOS, Android and Windows/UWP). In this case, the consumption of the microservices is done from C# but running on the client devices, so out of the Docker Host internal network (Like from your network or even the Internet).
|
<b>*Xamarin Mobile App (For iOS, Android and Windows/UWP)*</b>: It is a client mobile app supporting the most common mobile OS platforms (iOS, Android and Windows/UWP). In this case, the consumption of the microservices is done from C# but running on the client devices, so out of the Docker Host internal network (Like from your network or even the Internet).
|
||||||
@ -106,12 +111,11 @@ For those who prefer the CLI on Windows, using dotnet CLI, docker CLI and VS Cod
|
|||||||
https://github.com/dotnet/eShopOnContainers/wiki/03.-Setting-the-eShopOnContainers-solution-up-in-a-Windows-CLI-environment-(dotnet-CLI,-Docker-CLI-and-VS-Code)
|
https://github.com/dotnet/eShopOnContainers/wiki/03.-Setting-the-eShopOnContainers-solution-up-in-a-Windows-CLI-environment-(dotnet-CLI,-Docker-CLI-and-VS-Code)
|
||||||
|
|
||||||
### CLI and Mac based
|
### CLI and Mac based
|
||||||
For those who prefer the CLI on a Mac, using dotnet CLI, docker CLI and VS Code for Mac
|
For those who prefer the CLI on a Mac, using dotnet CLI, docker CLI and VS Code for Mac:
|
||||||
(Instructions still TBD, but similar to Windows CLI):
|
https://github.com/dotnet-architecture/eShopOnContainers/wiki/04.-Setting-eShopOnContainer-solution-up-in-a-Mac,-VS-for-Mac-or-with-CLI-environment--(dotnet-CLI,-Docker-CLI-and-VS-Code)
|
||||||
https://github.com/dotnet/eShopOnContainers/wiki/04.-Setting-eShopOnContainer-solution-up-in-a-Mac,-VS-Code-and-CLI-environment--(dotnet-CLI,-Docker-CLI-and-VS-Code)
|
|
||||||
|
|
||||||
## Orchestrators: Kubernetes and Service Fabric
|
## Orchestrators: Kubernetes and Service Fabric
|
||||||
See at the Wiki the posts on setup/instructions about how to deploy to Kubernetes or Service Fabric in Azure (although you could also deploy to any other cloud or on-premises).
|
See at the [Wiki](https://github.com/dotnet-architecture/eShopOnContainers/wiki) the posts on setup/instructions about how to deploy to Kubernetes or Service Fabric in Azure (although you could also deploy to any other cloud or on-premises).
|
||||||
|
|
||||||
## Sending feedback and pull requests
|
## Sending feedback and pull requests
|
||||||
As mentioned, we'd appreciate your feedback, improvements and ideas.
|
As mentioned, we'd appreciate your feedback, improvements and ideas.
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||||
<Parameters>
|
<Parameters>
|
||||||
|
<Parameter Name="OrderingBackground_InstanceCount" DefaultValue="-1" />
|
||||||
<Parameter Name="MarketingApi_InstanceCount" DefaultValue="-1" />
|
<Parameter Name="MarketingApi_InstanceCount" DefaultValue="-1" />
|
||||||
<Parameter Name="LocationsApi_InstanceCount" DefaultValue="-1" />
|
<Parameter Name="LocationsApi_InstanceCount" DefaultValue="-1" />
|
||||||
<Parameter Name="PaymentApi_InstanceCount" DefaultValue="-1" />
|
<Parameter Name="PaymentApi_InstanceCount" DefaultValue="-1" />
|
||||||
@ -19,6 +20,18 @@
|
|||||||
<!-- Import the ServiceManifest from the ServicePackage. The ServiceManifestName and ServiceManifestVersion
|
<!-- Import the ServiceManifest from the ServicePackage. The ServiceManifestName and ServiceManifestVersion
|
||||||
should match the Name and Version attributes of the ServiceManifest element defined in the
|
should match the Name and Version attributes of the ServiceManifest element defined in the
|
||||||
ServiceManifest.xml file. -->
|
ServiceManifest.xml file. -->
|
||||||
|
<ServiceManifestImport>
|
||||||
|
<ServiceManifestRef ServiceManifestName="OrderingBackgroundPkg" ServiceManifestVersion="1.0.0" />
|
||||||
|
<ConfigOverrides />
|
||||||
|
<EnvironmentOverrides CodePackageRef="Code">
|
||||||
|
<EnvironmentVariable Name="ApplicationInsights__InstrumentationKey" Value="[InstrumentationKey]"/>
|
||||||
|
</EnvironmentOverrides>
|
||||||
|
<Policies>
|
||||||
|
<ContainerHostPolicies CodePackageRef="Code">
|
||||||
|
<PortBinding ContainerPort="80" EndpointRef="OrderingBackgroundTypeEndpoint"/>
|
||||||
|
</ContainerHostPolicies>
|
||||||
|
</Policies>
|
||||||
|
</ServiceManifestImport>
|
||||||
|
|
||||||
<ServiceManifestImport>
|
<ServiceManifestImport>
|
||||||
<ServiceManifestRef ServiceManifestName="MarketingApiPkg" ServiceManifestVersion="1.0.0" />
|
<ServiceManifestRef ServiceManifestName="MarketingApiPkg" ServiceManifestVersion="1.0.0" />
|
||||||
@ -99,6 +112,11 @@
|
|||||||
ServiceFabric PowerShell module.
|
ServiceFabric PowerShell module.
|
||||||
|
|
||||||
The attribute ServiceTypeName below must match the name defined in the imported ServiceManifest.xml file. -->
|
The attribute ServiceTypeName below must match the name defined in the imported ServiceManifest.xml file. -->
|
||||||
|
<Service Name="OrderingBackground" ServicePackageActivationMode="ExclusiveProcess">
|
||||||
|
<StatelessService ServiceTypeName="OrderingBackgroundType" InstanceCount="[OrderingBackground_InstanceCount]">
|
||||||
|
<SingletonPartition />
|
||||||
|
</StatelessService>
|
||||||
|
</Service>
|
||||||
|
|
||||||
<Service Name="MarketingApi" ServiceDnsName="marketingapi.eshoponservicefabric" ServicePackageActivationMode="ExclusiveProcess">
|
<Service Name="MarketingApi" ServiceDnsName="marketingapi.eshoponservicefabric" ServicePackageActivationMode="ExclusiveProcess">
|
||||||
<StatelessService ServiceTypeName="MarketingApiType" InstanceCount="[MarketingApi_InstanceCount]">
|
<StatelessService ServiceTypeName="MarketingApiType" InstanceCount="[MarketingApi_InstanceCount]">
|
||||||
|
@ -28,8 +28,6 @@
|
|||||||
<EnvironmentVariable Name="EventBusConnection" Value="rabbitmq.eshoponservicefabricbus"/>
|
<EnvironmentVariable Name="EventBusConnection" Value="rabbitmq.eshoponservicefabricbus"/>
|
||||||
<EnvironmentVariable Name="AzureServiceBusEnabled" Value="False"/>
|
<EnvironmentVariable Name="AzureServiceBusEnabled" Value="False"/>
|
||||||
<EnvironmentVariable Name="UseCustomizationData" Value="True"/>
|
<EnvironmentVariable Name="UseCustomizationData" Value="True"/>
|
||||||
<EnvironmentVariable Name="GracePeriodTime" Value="1"/>
|
|
||||||
<EnvironmentVariable Name="CheckUpdateTime" Value="30000"/>
|
|
||||||
<EnvironmentVariable Name="ApplicationInsights__InstrumentationKey" Value=""/>
|
<EnvironmentVariable Name="ApplicationInsights__InstrumentationKey" Value=""/>
|
||||||
<EnvironmentVariable Name="OrchestratorType" Value="SF"/>
|
<EnvironmentVariable Name="OrchestratorType" Value="SF"/>
|
||||||
<EnvironmentVariable Name="UseLoadTest" Value="True"/>
|
<EnvironmentVariable Name="UseLoadTest" Value="True"/>
|
||||||
|
@ -0,0 +1,9 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8" ?>
|
||||||
|
<Settings xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/2011/01/fabric">
|
||||||
|
<!-- Add your custom configuration sections and parameters here -->
|
||||||
|
<!--
|
||||||
|
<Section Name="MyConfigSection">
|
||||||
|
<Parameter Name="MyParameter" Value="Value1" />
|
||||||
|
</Section>
|
||||||
|
-->
|
||||||
|
</Settings>
|
@ -0,0 +1,48 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<ServiceManifest Name="OrderingBackgroundPkg"
|
||||||
|
Version="1.0.0"
|
||||||
|
xmlns="http://schemas.microsoft.com/2011/01/fabric"
|
||||||
|
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||||
|
<ServiceTypes>
|
||||||
|
<!-- This is the name of your ServiceType.
|
||||||
|
The UseImplicitHost attribute indicates this is a guest service. -->
|
||||||
|
<StatelessServiceType ServiceTypeName="OrderingBackgroundType" UseImplicitHost="true" />
|
||||||
|
</ServiceTypes>
|
||||||
|
|
||||||
|
<!-- Code package is your service executable. -->
|
||||||
|
<CodePackage Name="Code" Version="1.0.0">
|
||||||
|
<EntryPoint>
|
||||||
|
<!-- Follow this link for more information about deploying Windows containers to Service Fabric: https://aka.ms/sfguestcontainers -->
|
||||||
|
<ContainerHost>
|
||||||
|
<ImageName>eshop/ordering.backgroundtasks</ImageName>
|
||||||
|
</ContainerHost>
|
||||||
|
</EntryPoint>
|
||||||
|
<!-- Pass environment variables to your container: -->
|
||||||
|
<EnvironmentVariables>
|
||||||
|
<EnvironmentVariable Name="ASPNETCORE_ENVIRONMENT" Value="Development"/>
|
||||||
|
<EnvironmentVariable Name="ASPNETCORE_URLS" Value="http://0.0.0.0:80"/>
|
||||||
|
<EnvironmentVariable Name="ConnectionString" Value="Data Source=sqlserver.eshoponservicefabricsql,5433;Database=Microsoft.eShopOnContainers.Services.OrderingDb;User Id=sa;Password=Pass@word"/>
|
||||||
|
<EnvironmentVariable Name="EventBusConnection" Value="rabbitmq.eshoponservicefabricbus"/>
|
||||||
|
<EnvironmentVariable Name="AzureServiceBusEnabled" Value="False"/>
|
||||||
|
<EnvironmentVariable Name="GracePeriodTime" Value="1"/>
|
||||||
|
<EnvironmentVariable Name="CheckUpdateTime" Value="30000"/>
|
||||||
|
<EnvironmentVariable Name="ApplicationInsights__InstrumentationKey" Value=""/>
|
||||||
|
<EnvironmentVariable Name="OrchestratorType" Value="SF"/>
|
||||||
|
<EnvironmentVariable Name="UseLoadTest" Value="True"/>
|
||||||
|
</EnvironmentVariables>
|
||||||
|
</CodePackage>
|
||||||
|
|
||||||
|
<!-- Config package is the contents of the Config directoy under PackageRoot that contains an
|
||||||
|
independently-updateable and versioned set of custom configuration settings for your service. -->
|
||||||
|
<ConfigPackage Name="Config" Version="1.0.0" />
|
||||||
|
|
||||||
|
<Resources>
|
||||||
|
<Endpoints>
|
||||||
|
<!-- This endpoint is used by the communication listener to obtain the port on which to
|
||||||
|
listen. Please note that if your service is partitioned, this port is shared with
|
||||||
|
replicas of different partitions that are placed in your code. -->
|
||||||
|
<Endpoint Name="OrderingBackgroundTypeEndpoint" Port="5111" UriScheme="http"/>
|
||||||
|
</Endpoints>
|
||||||
|
</Resources>
|
||||||
|
</ServiceManifest>
|
@ -1,6 +1,7 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<Application Name="fabric:/eShopOnServiceFabric" xmlns="http://schemas.microsoft.com/2011/01/fabric" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
<Application Name="fabric:/eShopOnServiceFabric" xmlns="http://schemas.microsoft.com/2011/01/fabric" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||||
<Parameters>
|
<Parameters>
|
||||||
|
<Parameter Name="OrderingBackground_InstanceCount" Value="-1" />
|
||||||
<Parameter Name="MarketingApi_InstanceCount" Value="1" />
|
<Parameter Name="MarketingApi_InstanceCount" Value="1" />
|
||||||
<Parameter Name="LocationsApi_InstanceCount" Value="1" />
|
<Parameter Name="LocationsApi_InstanceCount" Value="1" />
|
||||||
<Parameter Name="PaymentApi_InstanceCount" Value="1" />
|
<Parameter Name="PaymentApi_InstanceCount" Value="1" />
|
||||||
|
@ -38,6 +38,8 @@
|
|||||||
<Content Include="ApplicationPackageRoot\MarketingApiPkg\ServiceManifest.xml" />
|
<Content Include="ApplicationPackageRoot\MarketingApiPkg\ServiceManifest.xml" />
|
||||||
<Content Include="ApplicationPackageRoot\OrderingApiPkg\Config\Settings.xml" />
|
<Content Include="ApplicationPackageRoot\OrderingApiPkg\Config\Settings.xml" />
|
||||||
<Content Include="ApplicationPackageRoot\OrderingApiPkg\ServiceManifest.xml" />
|
<Content Include="ApplicationPackageRoot\OrderingApiPkg\ServiceManifest.xml" />
|
||||||
|
<Content Include="ApplicationPackageRoot\OrderingBackgroundPkg\Config\Settings.xml" />
|
||||||
|
<Content Include="ApplicationPackageRoot\OrderingBackgroundPkg\ServiceManifest.xml" />
|
||||||
<Content Include="ApplicationPackageRoot\PaymentApiPkg\Config\Settings.xml" />
|
<Content Include="ApplicationPackageRoot\PaymentApiPkg\Config\Settings.xml" />
|
||||||
<Content Include="ApplicationPackageRoot\PaymentApiPkg\ServiceManifest.xml" />
|
<Content Include="ApplicationPackageRoot\PaymentApiPkg\ServiceManifest.xml" />
|
||||||
<Content Include="packages.config" />
|
<Content Include="packages.config" />
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||||
<Parameters>
|
<Parameters>
|
||||||
|
<Parameter Name="OrderingBackground_InstanceCount" DefaultValue="-1" />
|
||||||
<Parameter Name="MarketingApi_InstanceCount" DefaultValue="-1" />
|
<Parameter Name="MarketingApi_InstanceCount" DefaultValue="-1" />
|
||||||
<Parameter Name="LocationsApi_InstanceCount" DefaultValue="-1" />
|
<Parameter Name="LocationsApi_InstanceCount" DefaultValue="-1" />
|
||||||
<Parameter Name="PaymentApi_InstanceCount" DefaultValue="-1" />
|
<Parameter Name="PaymentApi_InstanceCount" DefaultValue="-1" />
|
||||||
@ -19,6 +20,18 @@
|
|||||||
<!-- Import the ServiceManifest from the ServicePackage. The ServiceManifestName and ServiceManifestVersion
|
<!-- Import the ServiceManifest from the ServicePackage. The ServiceManifestName and ServiceManifestVersion
|
||||||
should match the Name and Version attributes of the ServiceManifest element defined in the
|
should match the Name and Version attributes of the ServiceManifest element defined in the
|
||||||
ServiceManifest.xml file. -->
|
ServiceManifest.xml file. -->
|
||||||
|
<ServiceManifestImport>
|
||||||
|
<ServiceManifestRef ServiceManifestName="OrderingBackgroundPkg" ServiceManifestVersion="1.0.0" />
|
||||||
|
<ConfigOverrides />
|
||||||
|
<EnvironmentOverrides CodePackageRef="Code">
|
||||||
|
<EnvironmentVariable Name="ApplicationInsights:InstrumentationKey" Value="[InstrumentationKey]"/>
|
||||||
|
</EnvironmentOverrides>
|
||||||
|
<Policies>
|
||||||
|
<ContainerHostPolicies CodePackageRef="Code">
|
||||||
|
<PortBinding ContainerPort="80" EndpointRef="OrderingBackgroundTasksTypeEndpoint"/>
|
||||||
|
</ContainerHostPolicies>
|
||||||
|
</Policies>
|
||||||
|
</ServiceManifestImport>
|
||||||
|
|
||||||
<ServiceManifestImport>
|
<ServiceManifestImport>
|
||||||
<ServiceManifestRef ServiceManifestName="MarketingApiPkg" ServiceManifestVersion="1.0.0" />
|
<ServiceManifestRef ServiceManifestName="MarketingApiPkg" ServiceManifestVersion="1.0.0" />
|
||||||
@ -99,6 +112,11 @@
|
|||||||
ServiceFabric PowerShell module.
|
ServiceFabric PowerShell module.
|
||||||
|
|
||||||
The attribute ServiceTypeName below must match the name defined in the imported ServiceManifest.xml file. -->
|
The attribute ServiceTypeName below must match the name defined in the imported ServiceManifest.xml file. -->
|
||||||
|
<Service Name="OrderingBackground" ServicePackageActivationMode="ExclusiveProcess">
|
||||||
|
<StatelessService ServiceTypeName="OrderingBackgroundType" InstanceCount="[OrderingBackground_InstanceCount]">
|
||||||
|
<SingletonPartition />
|
||||||
|
</StatelessService>
|
||||||
|
</Service>
|
||||||
|
|
||||||
<Service Name="MarketingApi" ServiceDnsName="marketingapi.eshoponservicefabric" ServicePackageActivationMode="ExclusiveProcess">
|
<Service Name="MarketingApi" ServiceDnsName="marketingapi.eshoponservicefabric" ServicePackageActivationMode="ExclusiveProcess">
|
||||||
<StatelessService ServiceTypeName="MarketingApiType" InstanceCount="[MarketingApi_InstanceCount]">
|
<StatelessService ServiceTypeName="MarketingApiType" InstanceCount="[MarketingApi_InstanceCount]">
|
||||||
|
@ -28,8 +28,6 @@
|
|||||||
<EnvironmentVariable Name="EventBusConnection" Value="rabbitmq.eshoponservicefabricbus"/>
|
<EnvironmentVariable Name="EventBusConnection" Value="rabbitmq.eshoponservicefabricbus"/>
|
||||||
<EnvironmentVariable Name="AzureServiceBusEnabled" Value="False"/>
|
<EnvironmentVariable Name="AzureServiceBusEnabled" Value="False"/>
|
||||||
<EnvironmentVariable Name="UseCustomizationData" Value="True"/>
|
<EnvironmentVariable Name="UseCustomizationData" Value="True"/>
|
||||||
<EnvironmentVariable Name="GracePeriodTime" Value="1"/>
|
|
||||||
<EnvironmentVariable Name="CheckUpdateTime" Value="30000"/>
|
|
||||||
<EnvironmentVariable Name="EventBusUserName" Value="admin"/>
|
<EnvironmentVariable Name="EventBusUserName" Value="admin"/>
|
||||||
<EnvironmentVariable Name="EventBusPassword" Value="password"/>
|
<EnvironmentVariable Name="EventBusPassword" Value="password"/>
|
||||||
<EnvironmentVariable Name="ApplicationInsights:InstrumentationKey" Value=""/>
|
<EnvironmentVariable Name="ApplicationInsights:InstrumentationKey" Value=""/>
|
||||||
|
@ -0,0 +1,9 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8" ?>
|
||||||
|
<Settings xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/2011/01/fabric">
|
||||||
|
<!-- Add your custom configuration sections and parameters here -->
|
||||||
|
<!--
|
||||||
|
<Section Name="MyConfigSection">
|
||||||
|
<Parameter Name="MyParameter" Value="Value1" />
|
||||||
|
</Section>
|
||||||
|
-->
|
||||||
|
</Settings>
|
@ -0,0 +1,50 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<ServiceManifest Name="OrderingBackgroundPkg"
|
||||||
|
Version="1.0.0"
|
||||||
|
xmlns="http://schemas.microsoft.com/2011/01/fabric"
|
||||||
|
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||||
|
<ServiceTypes>
|
||||||
|
<!-- This is the name of your ServiceType.
|
||||||
|
The UseImplicitHost attribute indicates this is a guest service. -->
|
||||||
|
<StatelessServiceType ServiceTypeName="OrderingBackgroundType" UseImplicitHost="true" />
|
||||||
|
</ServiceTypes>
|
||||||
|
|
||||||
|
<!-- Code package is your service executable. -->
|
||||||
|
<CodePackage Name="Code" Version="1.0.0">
|
||||||
|
<EntryPoint>
|
||||||
|
<!-- Follow this link for more information about deploying Windows containers to Service Fabric: https://aka.ms/sfguestcontainers -->
|
||||||
|
<ContainerHost>
|
||||||
|
<ImageName>eshop/ordering.backgroundtasks-win</ImageName>
|
||||||
|
</ContainerHost>
|
||||||
|
</EntryPoint>
|
||||||
|
<!-- Pass environment variables to your container: -->
|
||||||
|
<EnvironmentVariables>
|
||||||
|
<EnvironmentVariable Name="ASPNETCORE_ENVIRONMENT" Value="Development"/>
|
||||||
|
<EnvironmentVariable Name="ASPNETCORE_URLS" Value="http://0.0.0.0:80"/>
|
||||||
|
<EnvironmentVariable Name="ConnectionString" Value="Data Source=sqlserver.eshoponservicefabricsql,5433;Database=Microsoft.eShopOnContainers.Services.OrderingDb;User Id=sa;Password=Pass@word"/>
|
||||||
|
<EnvironmentVariable Name="EventBusConnection" Value="rabbitmq.eshoponservicefabricbus"/>
|
||||||
|
<EnvironmentVariable Name="AzureServiceBusEnabled" Value="False"/>
|
||||||
|
<EnvironmentVariable Name="GracePeriodTime" Value="1"/>
|
||||||
|
<EnvironmentVariable Name="CheckUpdateTime" Value="30000"/>
|
||||||
|
<EnvironmentVariable Name="EventBusUserName" Value="admin"/>
|
||||||
|
<EnvironmentVariable Name="EventBusPassword" Value="password"/>
|
||||||
|
<EnvironmentVariable Name="ApplicationInsights:InstrumentationKey" Value=""/>
|
||||||
|
<EnvironmentVariable Name="OrchestratorType" Value="SF"/>
|
||||||
|
<EnvironmentVariable Name="UseLoadTest" Value="False"/>
|
||||||
|
</EnvironmentVariables>
|
||||||
|
</CodePackage>
|
||||||
|
|
||||||
|
<!-- Config package is the contents of the Config directoy under PackageRoot that contains an
|
||||||
|
independently-updateable and versioned set of custom configuration settings for your service. -->
|
||||||
|
<ConfigPackage Name="Config" Version="1.0.0" />
|
||||||
|
|
||||||
|
<Resources>
|
||||||
|
<Endpoints>
|
||||||
|
<!-- This endpoint is used by the communication listener to obtain the port on which to
|
||||||
|
listen. Please note that if your service is partitioned, this port is shared with
|
||||||
|
replicas of different partitions that are placed in your code. -->
|
||||||
|
<Endpoint Name="OrderingBackgroundTasksTypeEndpoint" Port="5111" UriScheme="http" PathSuffix="eShopOnServiceFabric/OrderingBackgroundTasks"/>
|
||||||
|
</Endpoints>
|
||||||
|
</Resources>
|
||||||
|
</ServiceManifest>
|
@ -1,6 +1,7 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<Application Name="fabric:/eShopOnServiceFabric" xmlns="http://schemas.microsoft.com/2011/01/fabric" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
<Application Name="fabric:/eShopOnServiceFabric" xmlns="http://schemas.microsoft.com/2011/01/fabric" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||||
<Parameters>
|
<Parameters>
|
||||||
|
<Parameter Name="OrderingBackground_InstanceCount" Value="-1" />
|
||||||
<Parameter Name="MarketingApi_InstanceCount" Value="1" />
|
<Parameter Name="MarketingApi_InstanceCount" Value="1" />
|
||||||
<Parameter Name="LocationsApi_InstanceCount" Value="1" />
|
<Parameter Name="LocationsApi_InstanceCount" Value="1" />
|
||||||
<Parameter Name="PaymentApi_InstanceCount" Value="1" />
|
<Parameter Name="PaymentApi_InstanceCount" Value="1" />
|
||||||
|
@ -38,6 +38,8 @@
|
|||||||
<Content Include="ApplicationPackageRoot\MarketingApiPkg\ServiceManifest.xml" />
|
<Content Include="ApplicationPackageRoot\MarketingApiPkg\ServiceManifest.xml" />
|
||||||
<Content Include="ApplicationPackageRoot\OrderingApiPkg\Config\Settings.xml" />
|
<Content Include="ApplicationPackageRoot\OrderingApiPkg\Config\Settings.xml" />
|
||||||
<Content Include="ApplicationPackageRoot\OrderingApiPkg\ServiceManifest.xml" />
|
<Content Include="ApplicationPackageRoot\OrderingApiPkg\ServiceManifest.xml" />
|
||||||
|
<Content Include="ApplicationPackageRoot\OrderingBackgroundPkg\Config\Settings.xml" />
|
||||||
|
<Content Include="ApplicationPackageRoot\OrderingBackgroundPkg\ServiceManifest.xml" />
|
||||||
<Content Include="ApplicationPackageRoot\PaymentApiPkg\Config\Settings.xml" />
|
<Content Include="ApplicationPackageRoot\PaymentApiPkg\Config\Settings.xml" />
|
||||||
<Content Include="ApplicationPackageRoot\PaymentApiPkg\ServiceManifest.xml" />
|
<Content Include="ApplicationPackageRoot\PaymentApiPkg\ServiceManifest.xml" />
|
||||||
<Content Include="packages.config" />
|
<Content Include="packages.config" />
|
||||||
|
13
ServiceFabric/Windows/sfwin.sln
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
|
||||||
|
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||||
|
# Visual Studio 15
|
||||||
|
VisualStudioVersion = 15.0.27323.2
|
||||||
|
MinimumVisualStudioVersion = 10.0.40219.1
|
||||||
|
Global
|
||||||
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
|
HideSolutionNode = FALSE
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||||
|
SolutionGuid = {04B6E659-060F-4550-A5CA-70B9E9D8F010}
|
||||||
|
EndGlobalSection
|
||||||
|
EndGlobal
|
@ -21,6 +21,6 @@ try {
|
|||||||
Write-Host "Rule found"
|
Write-Host "Rule found"
|
||||||
}
|
}
|
||||||
catch [Exception] {
|
catch [Exception] {
|
||||||
New-NetFirewallRule -DisplayName eShopOnContainers-Inbound -Confirm -Description "eShopOnContainers Inbound Rule for port range 5100-5110" -LocalAddress Any -LocalPort 5100-5110 -Protocol tcp -RemoteAddress Any -RemotePort Any -Direction Inbound
|
New-NetFirewallRule -DisplayName eShopOnContainers-Inbound -Confirm -Description "eShopOnContainers Inbound Rule for port range 5100-5150" -LocalAddress Any -LocalPort 5100-5150 -Protocol tcp -RemoteAddress Any -RemotePort Any -Direction Inbound
|
||||||
New-NetFirewallRule -DisplayName eShopOnContainers-Outbound -Confirm -Description "eShopOnContainers Outbound Rule for port range 5100-5110" -LocalAddress Any -LocalPort 5100-5110 -Protocol tcp -RemoteAddress Any -RemotePort Any -Direction Outbound
|
New-NetFirewallRule -DisplayName eShopOnContainers-Outbound -Confirm -Description "eShopOnContainers Outbound Rule for port range 5100-5150" -LocalAddress Any -LocalPort 5100-5150 -Protocol tcp -RemoteAddress Any -RemotePort Any -Direction Outbound
|
||||||
}
|
}
|
@ -5,7 +5,7 @@
|
|||||||
Param(
|
Param(
|
||||||
[parameter(Mandatory=$false)][string] $rootPath,
|
[parameter(Mandatory=$false)][string] $rootPath,
|
||||||
[parameter(Mandatory=$false)][bool] $customEventBusLoginPassword=$false,
|
[parameter(Mandatory=$false)][bool] $customEventBusLoginPassword=$false,
|
||||||
[parameter(Mandatory=$false)][bool]$buildBits=$true
|
[parameter(Mandatory=$false)][bool]$buildBits=$false
|
||||||
)
|
)
|
||||||
|
|
||||||
$scriptPath = Split-Path $script:MyInvocation.MyCommand.Path
|
$scriptPath = Split-Path $script:MyInvocation.MyCommand.Path
|
||||||
|
78
deploy/az/createresources.sh
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
CreateGroup()
|
||||||
|
{
|
||||||
|
echo Creating resource group $resource_group in '$location'
|
||||||
|
az group create --name $resource_group --location $location
|
||||||
|
} # end of CreateGroup()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
deployresources()
|
||||||
|
{
|
||||||
|
echo Deploying ARM template '$path_and_filename.json' in resource group $resource_group
|
||||||
|
az group deployment create --resource-group $resource_group --parameters @$path_and_filename.parameters.json --template-file $path_and_filename.json
|
||||||
|
} # end of deployresources
|
||||||
|
|
||||||
|
Error_Usage()
|
||||||
|
{
|
||||||
|
echo ""
|
||||||
|
echo Usage:
|
||||||
|
echo create-resources arm-file resource-group-name [-c location]
|
||||||
|
echo arm-file: Path to ARM template WITHOUT .json extension. An parameter file with same name plus '.parameters' MUST exist in same folder
|
||||||
|
echo resource-grop-name: Name of the resource group to use or create
|
||||||
|
echo -c: If appears means that resource group must be created. If -c is specified, must use enter location
|
||||||
|
echo ""
|
||||||
|
echo Examples:
|
||||||
|
echo "1 create-resources path_and_filename testgroup (Deploys path_and_filename.json with parameters specified in path_and_filename.parameters.json file)."
|
||||||
|
echo "2 create-resources path_and_filename newgroup -c westus (Deploys path_and_filename.json (with parameters specified in path_and_filename.parameters.json file) in a NEW resource group named newgroup in the westus location)"
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if [ $# -le 1 ]; then
|
||||||
|
Error_Usage
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
if [ "$1" == "" ]; then
|
||||||
|
echo "path_and_filename is empty"
|
||||||
|
Error_Usage
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$2" == "" ]; then
|
||||||
|
echo "Resource Group is empty"
|
||||||
|
Error_Usage
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -f "$1.json" ]; then
|
||||||
|
echo "$1.json doesn't exist"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -f "$2.parameters.json" ]; then
|
||||||
|
echo "$2.parameters.json doesn't exist"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
path_and_filename=$1
|
||||||
|
resource_group=$2
|
||||||
|
|
||||||
|
|
||||||
|
if [ "$3" == "-c" ]; then
|
||||||
|
echo "Resource Group needs to be created"
|
||||||
|
if [ "$4" == "" ]; then
|
||||||
|
echo "but Resource Group name is missing"
|
||||||
|
Error_Usage
|
||||||
|
exit 1
|
||||||
|
else
|
||||||
|
location=$4
|
||||||
|
CreateGroup
|
||||||
|
fi
|
||||||
|
|
||||||
|
fi
|
||||||
|
deployresources
|
||||||
|
|
||||||
|
echo "all resources finished successfully"
|
@ -1,17 +1,37 @@
|
|||||||
|
|
||||||
# Deploying resources using create-resources script
|
# Deploying resources using create-resources script
|
||||||
|
|
||||||
The `create-resources` script is a basic script to allow easy deployment of one ARM template in one resource group. You can deploy to an existing resource group or to create one.
|
The `create-resources.cmd ` script is a basic script to allow easy deployment of one ARM template in one resource group. You can deploy to an existing resource group or to create one.
|
||||||
|
|
||||||
## Deploying to a existing resource group
|
**NOTE**: Alternatively, you can also use the `createresources.sh` bash script which can be used as a second option, convenient if you are using the Azure Cloud Bash Shell, a Mac or Linux machine, or simply, bash on Windows, instead of CMD/CommandPrompt in a local Windows
|
||||||
|
|
||||||
Just type `create-resources path-to-arm-template resourcegroup`. Called this way the script will:
|
## Deploying to a existing resource group - Windows CMD
|
||||||
|
|
||||||
|
Just type `create-resources [pathfile-to-arm-template] resourcegroup` from command-prompt. Called this way the script will:
|
||||||
|
|
||||||
1. Search for `path-to-arm-template.json` and `path-to-arm-template.parameters.json` files
|
1. Search for `path-to-arm-template.json` and `path-to-arm-template.parameters.json` files
|
||||||
2. If they exist, will deploy them in the `resourcegroup` specified (that has to exist).
|
2. If they exist, will deploy them in the `resourcegroup` specified (that resource group in Azure has to exist).
|
||||||
|
|
||||||
## Deploying to a new resource group
|
## Deploying to a new resource group - Windows CMD
|
||||||
|
|
||||||
Just type `create-resources path-to-arm-template resourcegroup -c location`. Called this way the script will:
|
Just type `create-resources [pathfile-to-arm-template] resourcegroup -c location`. Called this way the script will:
|
||||||
|
|
||||||
|
1. Search for `path-to-arm-template.json` and `path-to-arm-template.parameters.json` files
|
||||||
|
2. If they exist, will create the `resourcegroup` specified in the `location` specified.
|
||||||
|
3. Finally will deploy `path-to-arm-template.json` and `path-to-arm-template.parameters.json` files in the `resourcegroup`
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## Deploying to a existing resource group - Bash shell
|
||||||
|
|
||||||
|
Just type `createresources.sh [pathfile-to-arm-template] resourcegroup` from command-prompt. Called this way the script will:
|
||||||
|
|
||||||
|
1. Search for `path-to-arm-template.json` and `path-to-arm-template.parameters.json` files
|
||||||
|
2. If they exist, will deploy them in the `resourcegroup` specified (that resource group in Azure has to exist).
|
||||||
|
|
||||||
|
## Deploying to a new resource group - Bash shell
|
||||||
|
|
||||||
|
Just type `createresources.sh [pathfile-to-arm-template] resourcegroup -c location`. Called this way the script will:
|
||||||
|
|
||||||
1. Search for `path-to-arm-template.json` and `path-to-arm-template.parameters.json` files
|
1. Search for `path-to-arm-template.json` and `path-to-arm-template.parameters.json` files
|
||||||
2. If they exist, will create the `resourcegroup` specified in the `location` specified.
|
2. If they exist, will create the `resourcegroup` specified in the `location` specified.
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
The ARM template `sbusdeploy.json` and its parameter file (`sbusdeploy.parameters.json`) are used to deploy following resources:
|
The ARM template `sbusdeploy.json` and its parameter file (`sbusdeploy.parameters.json`) are used to deploy following resources:
|
||||||
|
|
||||||
1. One Service Bus namespace
|
1. One Service Bus namespace
|
||||||
2. One Service Bus
|
2. One Service Bus topic
|
||||||
3. Subscriptions used by application
|
3. Subscriptions used by application
|
||||||
|
|
||||||
## Editing sbusdeploy.parameters.json file
|
## Editing sbusdeploy.parameters.json file
|
||||||
@ -17,17 +17,8 @@ be set is:
|
|||||||
|
|
||||||
Once parameter file is edited you can deploy it using [create-resources script](../readme.md).
|
Once parameter file is edited you can deploy it using [create-resources script](../readme.md).
|
||||||
|
|
||||||
i. e. if you are in windows, to deploy sql databases in a new resourcegroup located in westus, go to `deploy\az` folder and type:
|
i. e. if you are in windows, to deploy servicebus in a new resourcegroup located in westus, go to `deploy\az` folder and type:
|
||||||
|
|
||||||
```
|
```
|
||||||
create-resources.cmd servicebus\sbusdeploy newResourceGroup -c westus
|
create-resources.cmd servicebus\sbusdeploy newResourceGroup -c westus
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -2,6 +2,9 @@
|
|||||||
"$schema": "http://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json",
|
"$schema": "http://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json",
|
||||||
"contentVersion": "1.0.0.0",
|
"contentVersion": "1.0.0.0",
|
||||||
"parameters": {
|
"parameters": {
|
||||||
|
"prefix": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
"clusterLocation": {
|
"clusterLocation": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"metadata": {
|
"metadata": {
|
||||||
@ -233,13 +236,16 @@
|
|||||||
"publicIPApiVersion": "2015-06-15",
|
"publicIPApiVersion": "2015-06-15",
|
||||||
"vnetID": "[resourceId('Microsoft.Network/virtualNetworks',parameters('virtualNetworkName'))]",
|
"vnetID": "[resourceId('Microsoft.Network/virtualNetworks',parameters('virtualNetworkName'))]",
|
||||||
"subnet0Ref": "[concat(variables('vnetID'),'/subnets/',parameters('subnet0Name'))]",
|
"subnet0Ref": "[concat(variables('vnetID'),'/subnets/',parameters('subnet0Name'))]",
|
||||||
"lbID0": "[resourceId('Microsoft.Network/loadBalancers', concat('LB','-', parameters('clusterName'),'-',parameters('vmNodeType0Name')))]",
|
"lbID0": "[resourceId('Microsoft.Network/loadBalancers', concat('LB','-', variables('clusterName'),'-',parameters('vmNodeType0Name')))]",
|
||||||
"lbIPConfig0": "[concat(variables('lbID0'),'/frontendIPConfigurations/LoadBalancerIPConfig')]",
|
"lbIPConfig0": "[concat(variables('lbID0'),'/frontendIPConfigurations/LoadBalancerIPConfig')]",
|
||||||
"lbPoolID0": "[concat(variables('lbID0'),'/backendAddressPools/LoadBalancerBEAddressPool')]",
|
"lbPoolID0": "[concat(variables('lbID0'),'/backendAddressPools/LoadBalancerBEAddressPool')]",
|
||||||
"lbProbeID0": "[concat(variables('lbID0'),'/probes/FabricGatewayProbe')]",
|
"lbProbeID0": "[concat(variables('lbID0'),'/probes/FabricGatewayProbe')]",
|
||||||
"lbHttpProbeID0": "[concat(variables('lbID0'),'/probes/FabricHttpGatewayProbe')]",
|
"lbHttpProbeID0": "[concat(variables('lbID0'),'/probes/FabricHttpGatewayProbe')]",
|
||||||
"lbNatPoolID0": "[concat(variables('lbID0'),'/inboundNatPools/LoadBalancerBEAddressNatPool')]",
|
"lbNatPoolID0": "[concat(variables('lbID0'),'/inboundNatPools/LoadBalancerBEAddressNatPool')]",
|
||||||
"vmStorageAccountName0": "[toLower(concat(uniqueString(resourceGroup().id), '1', '0' ))]",
|
"vmStorageAccountName0": "[toLower(concat(uniqueString(resourceGroup().id), '1', '0' ))]",
|
||||||
|
"supportLogStorageAccountName": "[take(concat(parameters('prefix'), parameters('supportLogStorageAccountName')),22)]",
|
||||||
|
"applicationDiagnosticsStorageAccountName" : "[take(concat(parameters('prefix'), parameters('applicationDiagnosticsStorageAccountName')),22)]",
|
||||||
|
"clusterName": "[concat(parameters('prefix'), parameters('clusterName'))]",
|
||||||
"uniqueStringArray0": [
|
"uniqueStringArray0": [
|
||||||
"[concat(variables('vmStorageAccountName0'), '0')]",
|
"[concat(variables('vmStorageAccountName0'), '0')]",
|
||||||
"[concat(variables('vmStorageAccountName0'), '1')]",
|
"[concat(variables('vmStorageAccountName0'), '1')]",
|
||||||
@ -252,7 +258,7 @@
|
|||||||
{
|
{
|
||||||
"apiVersion": "[variables('storageApiVersion')]",
|
"apiVersion": "[variables('storageApiVersion')]",
|
||||||
"type": "Microsoft.Storage/storageAccounts",
|
"type": "Microsoft.Storage/storageAccounts",
|
||||||
"name": "[parameters('supportLogStorageAccountName')]",
|
"name": "[variables('supportLogStorageAccountName')]",
|
||||||
"location": "[parameters('computeLocation')]",
|
"location": "[parameters('computeLocation')]",
|
||||||
"dependsOn": [],
|
"dependsOn": [],
|
||||||
"properties": {},
|
"properties": {},
|
||||||
@ -262,13 +268,13 @@
|
|||||||
},
|
},
|
||||||
"tags": {
|
"tags": {
|
||||||
"resourceType": "Service Fabric",
|
"resourceType": "Service Fabric",
|
||||||
"clusterName": "[parameters('clusterName')]"
|
"clusterName": "[variables('clusterName')]"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"apiVersion": "[variables('storageApiVersion')]",
|
"apiVersion": "[variables('storageApiVersion')]",
|
||||||
"type": "Microsoft.Storage/storageAccounts",
|
"type": "Microsoft.Storage/storageAccounts",
|
||||||
"name": "[parameters('applicationDiagnosticsStorageAccountName')]",
|
"name": "[variables('applicationDiagnosticsStorageAccountName')]",
|
||||||
"location": "[parameters('computeLocation')]",
|
"location": "[parameters('computeLocation')]",
|
||||||
"dependsOn": [],
|
"dependsOn": [],
|
||||||
"properties": {},
|
"properties": {},
|
||||||
@ -278,7 +284,7 @@
|
|||||||
},
|
},
|
||||||
"tags": {
|
"tags": {
|
||||||
"resourceType": "Service Fabric",
|
"resourceType": "Service Fabric",
|
||||||
"clusterName": "[parameters('clusterName')]"
|
"clusterName": "[variables('clusterName')]"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -304,7 +310,7 @@
|
|||||||
},
|
},
|
||||||
"tags": {
|
"tags": {
|
||||||
"resourceType": "Service Fabric",
|
"resourceType": "Service Fabric",
|
||||||
"clusterName": "[parameters('clusterName')]"
|
"clusterName": "[variables('clusterName')]"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -320,13 +326,13 @@
|
|||||||
},
|
},
|
||||||
"tags": {
|
"tags": {
|
||||||
"resourceType": "Service Fabric",
|
"resourceType": "Service Fabric",
|
||||||
"clusterName": "[parameters('clusterName')]"
|
"clusterName": "[variables('clusterName')]"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"apiVersion": "[variables('lbApiVersion')]",
|
"apiVersion": "[variables('lbApiVersion')]",
|
||||||
"type": "Microsoft.Network/loadBalancers",
|
"type": "Microsoft.Network/loadBalancers",
|
||||||
"name": "[concat('LB','-', parameters('clusterName'),'-',parameters('vmNodeType0Name'))]",
|
"name": "[concat('LB','-', variables('clusterName'),'-',parameters('vmNodeType0Name'))]",
|
||||||
"location": "[parameters('computeLocation')]",
|
"location": "[parameters('computeLocation')]",
|
||||||
"dependsOn": [
|
"dependsOn": [
|
||||||
"[concat('Microsoft.Network/publicIPAddresses/',concat(parameters('lbIPName'),'-','0'))]"
|
"[concat('Microsoft.Network/publicIPAddresses/',concat(parameters('lbIPName'),'-','0'))]"
|
||||||
@ -600,7 +606,7 @@
|
|||||||
},
|
},
|
||||||
"tags": {
|
"tags": {
|
||||||
"resourceType": "Service Fabric",
|
"resourceType": "Service Fabric",
|
||||||
"clusterName": "[parameters('clusterName')]"
|
"clusterName": "[variables('clusterName')]"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -620,7 +626,7 @@
|
|||||||
},
|
},
|
||||||
"tags": {
|
"tags": {
|
||||||
"resourceType": "Service Fabric",
|
"resourceType": "Service Fabric",
|
||||||
"clusterName": "[parameters('clusterName')]"
|
"clusterName": "[variables('clusterName')]"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -635,9 +641,9 @@
|
|||||||
"[concat('Microsoft.Storage/storageAccounts/', variables('uniqueStringArray0')[2])]",
|
"[concat('Microsoft.Storage/storageAccounts/', variables('uniqueStringArray0')[2])]",
|
||||||
"[concat('Microsoft.Storage/storageAccounts/', variables('uniqueStringArray0')[3])]",
|
"[concat('Microsoft.Storage/storageAccounts/', variables('uniqueStringArray0')[3])]",
|
||||||
"[concat('Microsoft.Storage/storageAccounts/', variables('uniqueStringArray0')[4])]",
|
"[concat('Microsoft.Storage/storageAccounts/', variables('uniqueStringArray0')[4])]",
|
||||||
"[concat('Microsoft.Network/loadBalancers/', concat('LB','-', parameters('clusterName'),'-',parameters('vmNodeType0Name')))]",
|
"[concat('Microsoft.Network/loadBalancers/', concat('LB','-', variables('clusterName'),'-',parameters('vmNodeType0Name')))]",
|
||||||
"[concat('Microsoft.Storage/storageAccounts/', parameters('supportLogStorageAccountName'))]",
|
"[concat('Microsoft.Storage/storageAccounts/', variables('supportLogStorageAccountName'))]",
|
||||||
"[concat('Microsoft.Storage/storageAccounts/', parameters('applicationDiagnosticsStorageAccountName'))]"
|
"[concat('Microsoft.Storage/storageAccounts/', variables('applicationDiagnosticsStorageAccountName'))]"
|
||||||
],
|
],
|
||||||
"properties": {
|
"properties": {
|
||||||
"overprovision": "[parameters('overProvision')]",
|
"overprovision": "[parameters('overProvision')]",
|
||||||
@ -653,12 +659,12 @@
|
|||||||
"type": "ServiceFabricNode",
|
"type": "ServiceFabricNode",
|
||||||
"autoUpgradeMinorVersion": true,
|
"autoUpgradeMinorVersion": true,
|
||||||
"protectedSettings": {
|
"protectedSettings": {
|
||||||
"StorageAccountKey1": "[listKeys(resourceId('Microsoft.Storage/storageAccounts', parameters('supportLogStorageAccountName')),'2015-05-01-preview').key1]",
|
"StorageAccountKey1": "[listKeys(resourceId('Microsoft.Storage/storageAccounts', variables('supportLogStorageAccountName')),'2015-05-01-preview').key1]",
|
||||||
"StorageAccountKey2": "[listKeys(resourceId('Microsoft.Storage/storageAccounts', parameters('supportLogStorageAccountName')),'2015-05-01-preview').key2]"
|
"StorageAccountKey2": "[listKeys(resourceId('Microsoft.Storage/storageAccounts', variables('supportLogStorageAccountName')),'2015-05-01-preview').key2]"
|
||||||
},
|
},
|
||||||
"publisher": "Microsoft.Azure.ServiceFabric",
|
"publisher": "Microsoft.Azure.ServiceFabric",
|
||||||
"settings": {
|
"settings": {
|
||||||
"clusterEndpoint": "[reference(parameters('clusterName')).clusterEndpoint]",
|
"clusterEndpoint": "[reference(variables('clusterName')).clusterEndpoint]",
|
||||||
"nodeTypeRef": "[parameters('vmNodeType0Name')]",
|
"nodeTypeRef": "[parameters('vmNodeType0Name')]",
|
||||||
"dataPath": "D:\\\\SvcFab",
|
"dataPath": "D:\\\\SvcFab",
|
||||||
"durabilityLevel": "Bronze",
|
"durabilityLevel": "Bronze",
|
||||||
@ -674,8 +680,8 @@
|
|||||||
"type": "IaaSDiagnostics",
|
"type": "IaaSDiagnostics",
|
||||||
"autoUpgradeMinorVersion": true,
|
"autoUpgradeMinorVersion": true,
|
||||||
"protectedSettings": {
|
"protectedSettings": {
|
||||||
"storageAccountName": "[parameters('applicationDiagnosticsStorageAccountName')]",
|
"storageAccountName": "[variables('applicationDiagnosticsStorageAccountName')]",
|
||||||
"storageAccountKey": "[listKeys(resourceId('Microsoft.Storage/storageAccounts', parameters('applicationDiagnosticsStorageAccountName')),'2015-05-01-preview').key1]",
|
"storageAccountKey": "[listKeys(resourceId('Microsoft.Storage/storageAccounts', variables('applicationDiagnosticsStorageAccountName')),'2015-05-01-preview').key1]",
|
||||||
"storageAccountEndPoint": "https://core.windows.net/"
|
"storageAccountEndPoint": "https://core.windows.net/"
|
||||||
},
|
},
|
||||||
"publisher": "Microsoft.Azure.Diagnostics",
|
"publisher": "Microsoft.Azure.Diagnostics",
|
||||||
@ -715,7 +721,7 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"StorageAccount": "[parameters('applicationDiagnosticsStorageAccountName')]"
|
"StorageAccount": "[variables('applicationDiagnosticsStorageAccountName')]"
|
||||||
},
|
},
|
||||||
"typeHandlerVersion": "1.5"
|
"typeHandlerVersion": "1.5"
|
||||||
}
|
}
|
||||||
@ -786,16 +792,16 @@
|
|||||||
},
|
},
|
||||||
"tags": {
|
"tags": {
|
||||||
"resourceType": "Service Fabric",
|
"resourceType": "Service Fabric",
|
||||||
"clusterName": "[parameters('clusterName')]"
|
"clusterName": "[variables('clusterName')]"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"apiVersion": "2017-07-01-preview",
|
"apiVersion": "2017-07-01-preview",
|
||||||
"type": "Microsoft.ServiceFabric/clusters",
|
"type": "Microsoft.ServiceFabric/clusters",
|
||||||
"name": "[parameters('clusterName')]",
|
"name": "[variables('clusterName')]",
|
||||||
"location": "[parameters('clusterLocation')]",
|
"location": "[parameters('clusterLocation')]",
|
||||||
"dependsOn": [
|
"dependsOn": [
|
||||||
"[concat('Microsoft.Storage/storageAccounts/', parameters('supportLogStorageAccountName'))]"
|
"[concat('Microsoft.Storage/storageAccounts/', variables('supportLogStorageAccountName'))]"
|
||||||
],
|
],
|
||||||
"properties": {
|
"properties": {
|
||||||
"addonFeatures": [
|
"addonFeatures": [
|
||||||
@ -803,14 +809,14 @@
|
|||||||
],
|
],
|
||||||
"clientCertificateCommonNames": [],
|
"clientCertificateCommonNames": [],
|
||||||
"clientCertificateThumbprints": [],
|
"clientCertificateThumbprints": [],
|
||||||
"clusterCodeVersion": "5.7.207.9494",
|
"clusterCodeVersion": "6.0.232.9494",
|
||||||
"clusterState": "Default",
|
"clusterState": "Default",
|
||||||
"diagnosticsStorageAccountConfig": {
|
"diagnosticsStorageAccountConfig": {
|
||||||
"blobEndpoint": "[reference(concat('Microsoft.Storage/storageAccounts/', parameters('supportLogStorageAccountName')), variables('storageApiVersion')).primaryEndpoints.blob]",
|
"blobEndpoint": "[reference(concat('Microsoft.Storage/storageAccounts/', variables('supportLogStorageAccountName')), variables('storageApiVersion')).primaryEndpoints.blob]",
|
||||||
"protectedAccountKeyName": "StorageAccountKey1",
|
"protectedAccountKeyName": "StorageAccountKey1",
|
||||||
"queueEndpoint": "[reference(concat('Microsoft.Storage/storageAccounts/', parameters('supportLogStorageAccountName')), variables('storageApiVersion')).primaryEndpoints.queue]",
|
"queueEndpoint": "[reference(concat('Microsoft.Storage/storageAccounts/', variables('supportLogStorageAccountName')), variables('storageApiVersion')).primaryEndpoints.queue]",
|
||||||
"storageAccountName": "[parameters('supportLogStorageAccountName')]",
|
"storageAccountName": "[variables('supportLogStorageAccountName')]",
|
||||||
"tableEndpoint": "[reference(concat('Microsoft.Storage/storageAccounts/', parameters('supportLogStorageAccountName')), variables('storageApiVersion')).primaryEndpoints.table]"
|
"tableEndpoint": "[reference(concat('Microsoft.Storage/storageAccounts/', variables('supportLogStorageAccountName')), variables('storageApiVersion')).primaryEndpoints.table]"
|
||||||
},
|
},
|
||||||
"fabricSettings": [],
|
"fabricSettings": [],
|
||||||
"managementEndpoint": "[concat('http://',reference(concat(parameters('lbIPName'),'-','0')).dnsSettings.fqdn,':',parameters('nt0fabricHttpGatewayPort'))]",
|
"managementEndpoint": "[concat('http://',reference(concat(parameters('lbIPName'),'-','0')).dnsSettings.fqdn,':',parameters('nt0fabricHttpGatewayPort'))]",
|
||||||
@ -840,13 +846,13 @@
|
|||||||
},
|
},
|
||||||
"tags": {
|
"tags": {
|
||||||
"resourceType": "Service Fabric",
|
"resourceType": "Service Fabric",
|
||||||
"clusterName": "[parameters('clusterName')]"
|
"clusterName": "[variables('clusterName')]"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"outputs": {
|
"outputs": {
|
||||||
"clusterProperties": {
|
"clusterProperties": {
|
||||||
"value": "[reference(parameters('clusterName'))]",
|
"value": "[reference(variables('clusterName'))]",
|
||||||
"type": "object"
|
"type": "object"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2,8 +2,11 @@
|
|||||||
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#",
|
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#",
|
||||||
"contentVersion": "1.0.0.0",
|
"contentVersion": "1.0.0.0",
|
||||||
"parameters": {
|
"parameters": {
|
||||||
|
"prefix": {
|
||||||
|
"value": "qa"
|
||||||
|
},
|
||||||
"clusterName": {
|
"clusterName": {
|
||||||
"value": "qa-eshop-sfwin-cluster"
|
"value": "-eshop-sfwin-cluster"
|
||||||
},
|
},
|
||||||
"clusterLocation": {
|
"clusterLocation": {
|
||||||
"value": "westus"
|
"value": "westus"
|
||||||
@ -12,10 +15,10 @@
|
|||||||
"value": "westus"
|
"value": "westus"
|
||||||
},
|
},
|
||||||
"adminUserName": {
|
"adminUserName": {
|
||||||
"value": "eshop"
|
"value": "testedu"
|
||||||
},
|
},
|
||||||
"adminPassword": {
|
"adminPassword": {
|
||||||
"value": "Your_complex_Pass@word1"
|
"value": "testedu1234!"
|
||||||
},
|
},
|
||||||
"nicName": {
|
"nicName": {
|
||||||
"value": "NIC-eshopsfwin"
|
"value": "NIC-eshopsfwin"
|
||||||
@ -24,7 +27,7 @@
|
|||||||
"value": "eshopsfwin-PubIP"
|
"value": "eshopsfwin-PubIP"
|
||||||
},
|
},
|
||||||
"dnsName": {
|
"dnsName": {
|
||||||
"value": "qa-eshop-sfwin-cluster"
|
"value": "testedu-eshop-sfwin-cluster"
|
||||||
},
|
},
|
||||||
"virtualNetworkName": {
|
"virtualNetworkName": {
|
||||||
"value": "VNet-eshopsfwin"
|
"value": "VNet-eshopsfwin"
|
||||||
@ -36,10 +39,10 @@
|
|||||||
"value": "LBIP-eshopsfwin"
|
"value": "LBIP-eshopsfwin"
|
||||||
},
|
},
|
||||||
"applicationDiagnosticsStorageAccountName": {
|
"applicationDiagnosticsStorageAccountName": {
|
||||||
"value": "sfdgqaeshopsfwin"
|
"value": "sfdiageshopw"
|
||||||
},
|
},
|
||||||
"supportLogStorageAccountName": {
|
"supportLogStorageAccountName": {
|
||||||
"value": "sflogsqaeshopsfwin"
|
"value": "sflogeshopw"
|
||||||
},
|
},
|
||||||
"vmImageSku": {
|
"vmImageSku": {
|
||||||
"value": "2016-Datacenter-with-Containers"
|
"value": "2016-Datacenter-with-Containers"
|
||||||
|
@ -24,7 +24,7 @@ Once parameter file is edited you can deploy it using [create-resources script](
|
|||||||
i. e. if you are in windows, to deploy a Storage Account in a new resourcegroup located in westus, go to `deploy\az` folder and type:
|
i. e. if you are in windows, to deploy a Storage Account in a new resourcegroup located in westus, go to `deploy\az` folder and type:
|
||||||
|
|
||||||
```
|
```
|
||||||
create-resources.cmd catalog\deploystorage newResourceGroup -c westus
|
create-resources.cmd storage\catalog\deploystorage newResourceGroup -c westus
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
@ -24,7 +24,7 @@ Once parameter file is edited you can deploy it using [create-resources script](
|
|||||||
i. e. if you are in windows, to deploy a Storage account in a new resourcegroup located in westus, go to `deploy\az` folder and type:
|
i. e. if you are in windows, to deploy a Storage account in a new resourcegroup located in westus, go to `deploy\az` folder and type:
|
||||||
|
|
||||||
```
|
```
|
||||||
create-resources.cmd marketing\deploystorage newResourceGroup -c westus
|
create-resources.cmd storage\marketing\deploystorage newResourceGroup -c westus
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,9 +1,14 @@
|
|||||||
version: '2'
|
version: '3.4'
|
||||||
|
|
||||||
services:
|
services:
|
||||||
sql.data:
|
sql.data:
|
||||||
environment:
|
environment:
|
||||||
- MSSQL_SA_PASSWORD=Pass@word
|
- MSSQL_SA_PASSWORD=Pass@word
|
||||||
- ACCEPT_EULA=Y
|
- ACCEPT_EULA=Y
|
||||||
|
- MSSQL_PID=Developer
|
||||||
ports:
|
ports:
|
||||||
- "5433:1433"
|
- "5433:1433"
|
||||||
|
|
||||||
|
nosql.data:
|
||||||
|
ports:
|
||||||
|
- "27017:27017"
|
@ -1,4 +1,4 @@
|
|||||||
version: '3'
|
version: '3.4'
|
||||||
|
|
||||||
services:
|
services:
|
||||||
sql.data:
|
sql.data:
|
||||||
@ -13,3 +13,6 @@ services:
|
|||||||
image: rabbitmq
|
image: rabbitmq
|
||||||
ports:
|
ports:
|
||||||
- "5672:5672"
|
- "5672:5672"
|
||||||
|
|
||||||
|
nosql.data:
|
||||||
|
image: mongo
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
version: '3'
|
version: '3.4'
|
||||||
|
|
||||||
# The Production docker-compose file has to have the external/real IPs or DNS names for the services
|
# The Production docker-compose file has to have the external/real IPs or DNS names for the services
|
||||||
# The ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP environment variable is taken, by default, from the ".env" file defined like:
|
# The ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP environment variable is taken, by default, from the ".env" file defined like:
|
||||||
@ -69,6 +69,17 @@ services:
|
|||||||
ports:
|
ports:
|
||||||
- "5102:80"
|
- "5102:80"
|
||||||
|
|
||||||
|
ordering.backgroundtasks:
|
||||||
|
environment:
|
||||||
|
- ASPNETCORE_ENVIRONMENT=Production
|
||||||
|
- ASPNETCORE_URLS=http://0.0.0.0:80
|
||||||
|
- ConnectionString=${ESHOP_AZURE_ORDERING_DB:-Server=sql.data;Database=Microsoft.eShopOnContainers.Services.OrderingDb;User Id=sa;Password=Pass@word}
|
||||||
|
- EventBusConnection=${ESHOP_AZURE_SERVICE_BUS:-rabbitmq}
|
||||||
|
- UseCustomizationData=True
|
||||||
|
- AzureServiceBusEnabled=False
|
||||||
|
ports:
|
||||||
|
- "5111:80"
|
||||||
|
|
||||||
webspa:
|
webspa:
|
||||||
environment:
|
environment:
|
||||||
- ASPNETCORE_ENVIRONMENT=Production
|
- ASPNETCORE_ENVIRONMENT=Production
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
version: '3'
|
version: '3.4'
|
||||||
|
|
||||||
services:
|
services:
|
||||||
basket.api:
|
basket.api:
|
||||||
image: eshop/basket.api-win:${TAG:-latest}
|
image: eshop/basket.api-win:${TAG:-latest}
|
||||||
build:
|
build:
|
||||||
context: ./src/Services/Basket/Basket.API
|
context: .
|
||||||
dockerfile: Dockerfile
|
dockerfile: src/Services/Basket/Basket.API/Dockerfile
|
||||||
depends_on:
|
depends_on:
|
||||||
- basket.data
|
- basket.data
|
||||||
- identity.api
|
- identity.api
|
||||||
@ -14,8 +14,8 @@ services:
|
|||||||
catalog.api:
|
catalog.api:
|
||||||
image: eshop/catalog.api-win:${TAG:-latest}
|
image: eshop/catalog.api-win:${TAG:-latest}
|
||||||
build:
|
build:
|
||||||
context: ./src/Services/Catalog/Catalog.API
|
context: .
|
||||||
dockerfile: Dockerfile
|
dockerfile: src/Services/Catalog/Catalog.API/Dockerfile
|
||||||
depends_on:
|
depends_on:
|
||||||
- sql.data
|
- sql.data
|
||||||
- rabbitmq
|
- rabbitmq
|
||||||
@ -23,16 +23,25 @@ services:
|
|||||||
identity.api:
|
identity.api:
|
||||||
image: eshop/identity.api-win:${TAG:-latest}
|
image: eshop/identity.api-win:${TAG:-latest}
|
||||||
build:
|
build:
|
||||||
context: ./src/Services/Identity/Identity.API
|
context: .
|
||||||
dockerfile: Dockerfile
|
dockerfile: src/Services/Identity/Identity.API/Dockerfile
|
||||||
depends_on:
|
depends_on:
|
||||||
- sql.data
|
- sql.data
|
||||||
|
|
||||||
ordering.api:
|
ordering.api:
|
||||||
image: eshop/ordering.api-win:${TAG:-latest}
|
image: eshop/ordering.api-win:${TAG:-latest}
|
||||||
build:
|
build:
|
||||||
context: ./src/Services/Ordering/Ordering.API
|
context: .
|
||||||
dockerfile: Dockerfile
|
dockerfile: src/Services/Ordering/Ordering.API/Dockerfile
|
||||||
|
depends_on:
|
||||||
|
- sql.data
|
||||||
|
- rabbitmq
|
||||||
|
|
||||||
|
ordering.backgroundtasks:
|
||||||
|
image: eshop/ordering.backgroundtasks-win:${TAG:-latest}
|
||||||
|
build:
|
||||||
|
context: .
|
||||||
|
dockerfile: src/Services/Ordering/Ordering.BackgroundTasks/Dockerfile
|
||||||
depends_on:
|
depends_on:
|
||||||
- sql.data
|
- sql.data
|
||||||
- rabbitmq
|
- rabbitmq
|
||||||
@ -40,8 +49,8 @@ services:
|
|||||||
marketing.api:
|
marketing.api:
|
||||||
image: eshop/marketing.api-win:${TAG:-latest}
|
image: eshop/marketing.api-win:${TAG:-latest}
|
||||||
build:
|
build:
|
||||||
context: ./src/Services/Marketing/Marketing.API
|
context: .
|
||||||
dockerfile: Dockerfile
|
dockerfile: src/Services/Marketing/Marketing.API/Dockerfile
|
||||||
depends_on:
|
depends_on:
|
||||||
- sql.data
|
- sql.data
|
||||||
- nosql.data
|
- nosql.data
|
||||||
@ -51,8 +60,8 @@ services:
|
|||||||
webspa:
|
webspa:
|
||||||
image: eshop/webspa-win:${TAG:-latest}
|
image: eshop/webspa-win:${TAG:-latest}
|
||||||
build:
|
build:
|
||||||
context: ./src/Web/WebSPA
|
context: .
|
||||||
dockerfile: Dockerfile
|
dockerfile: src/Web/WebSPA/Dockerfile
|
||||||
depends_on:
|
depends_on:
|
||||||
- catalog.api
|
- catalog.api
|
||||||
- ordering.api
|
- ordering.api
|
||||||
@ -63,8 +72,8 @@ services:
|
|||||||
webmvc:
|
webmvc:
|
||||||
image: eshop/webmvc-win:${TAG:-latest}
|
image: eshop/webmvc-win:${TAG:-latest}
|
||||||
build:
|
build:
|
||||||
context: ./src/Web/WebMVC
|
context: .
|
||||||
dockerfile: Dockerfile
|
dockerfile: src/Web/WebMVC/Dockerfile
|
||||||
depends_on:
|
depends_on:
|
||||||
- catalog.api
|
- catalog.api
|
||||||
- ordering.api
|
- ordering.api
|
||||||
@ -75,28 +84,28 @@ services:
|
|||||||
webstatus:
|
webstatus:
|
||||||
image: eshop/webstatus-win:${TAG:-latest}
|
image: eshop/webstatus-win:${TAG:-latest}
|
||||||
build:
|
build:
|
||||||
context: ./src/Web/WebStatus
|
context: .
|
||||||
dockerfile: Dockerfile
|
dockerfile: src/Web/WebStatus/Dockerfile
|
||||||
|
|
||||||
payment.api:
|
payment.api:
|
||||||
image: eshop/payment.api-win:${TAG:-latest}
|
image: eshop/payment.api-win:${TAG:-latest}
|
||||||
build:
|
build:
|
||||||
context: ./src/Services/Payment/Payment.API
|
context: .
|
||||||
dockerfile: Dockerfile
|
dockerfile: src/Services/Payment/Payment.API/Dockerfile
|
||||||
depends_on:
|
depends_on:
|
||||||
- rabbitmq
|
- rabbitmq
|
||||||
|
|
||||||
locations.api:
|
locations.api:
|
||||||
image: eshop/locations.api-win:${TAG:-latest}
|
image: eshop/locations.api-win:${TAG:-latest}
|
||||||
build:
|
build:
|
||||||
context: ./src/Services/Location/Locations.API
|
context: .
|
||||||
dockerfile: Dockerfile
|
dockerfile: src/Services/Location/Locations.API/Dockerfile
|
||||||
depends_on:
|
depends_on:
|
||||||
- nosql.data
|
- nosql.data
|
||||||
- rabbitmq
|
- rabbitmq
|
||||||
|
|
||||||
sql.data:
|
sql.data:
|
||||||
image: microsoft/mssql-server-windows
|
image: microsoft/mssql-server-windows-developer
|
||||||
|
|
||||||
nosql.data:
|
nosql.data:
|
||||||
image: mongo:windowsservercore
|
image: mongo:windowsservercore
|
||||||
|
@ -1,18 +1,19 @@
|
|||||||
version: '3'
|
version: '3.4'
|
||||||
|
|
||||||
services:
|
services:
|
||||||
ci-build:
|
ci-build:
|
||||||
image: microsoft/aspnetcore-build:2.0
|
image: microsoft/aspnetcore-build:2.0.2 #Depending on the bug below, you can also try this other SDK image: microsoft/aspnetcore-build:1.0-2.0-2017-10 or microsoft/aspnetcore-build:1.0-2.0
|
||||||
volumes:
|
volumes:
|
||||||
- .:/src
|
- .:/src
|
||||||
- ./cli-linux:/cli-linux
|
- ./cli-linux:/cli-linux
|
||||||
working_dir: /src
|
working_dir: /src
|
||||||
|
|
||||||
|
|
||||||
# Next line is using the .sln file to compile all the projects.
|
# Next line is using the .sln file to compile all the projects.
|
||||||
# Sometime there is an issue in msbuild exits the process before finishing building the bits: (https://github.com/Microsoft/msbuild/issues/2153)
|
# Sometime there is an issue in msbuild exits the process before finishing building the bits: (https://github.com/Microsoft/msbuild/issues/2153)
|
||||||
# Random error: error MSB4017: The build stopped unexpectedly be cause of an unexpected logger failure.
|
# Random error: error MSB4017: The build stopped unexpectedly be cause of an unexpected logger failure.
|
||||||
#command: /bin/bash -c "pushd ./src/Web/WebSPA && npm rebuild node-sass && popd && dotnet restore ./eShopOnContainers-ServicesAndWebApps.sln --verbosity minimal && dotnet publish ./eShopOnContainers-ServicesAndWebApps.sln -c Release -o ./obj/Docker/publish --verbosity minimal"
|
command: /bin/bash -c "pushd ./src/Web/WebSPA && npm rebuild node-sass && popd && dotnet publish ./eShopOnContainers-ServicesAndWebApps.sln -c Release -o ./obj/Docker/publish"
|
||||||
|
|
||||||
# NOTE: Using build-bits-linux.sh from Linux build container exits before ending.
|
# NOTE: Using build-bits-linux.sh from Linux build container exits before ending.
|
||||||
command: /bin/bash -c "pushd ./src/Web/WebSPA && npm rebuild node-sass && popd && pushd /cli-linux && ./build-bits-linux.sh /src"
|
#command: /bin/bash -c "pushd ./src/Web/WebSPA && npm rebuild node-sass && popd && pushd /cli-linux && ./build-bits-linux.sh /src"
|
||||||
|
|
@ -6,9 +6,10 @@
|
|||||||
<DockerServiceUrl>http://localhost:5100</DockerServiceUrl>
|
<DockerServiceUrl>http://localhost:5100</DockerServiceUrl>
|
||||||
<DockerServiceName>webmvc</DockerServiceName>
|
<DockerServiceName>webmvc</DockerServiceName>
|
||||||
<DockerTargetOS>Linux</DockerTargetOS>
|
<DockerTargetOS>Linux</DockerTargetOS>
|
||||||
<ProjectVersion>2.0</ProjectVersion>
|
<ProjectVersion>2.1</ProjectVersion>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<None Include=".dockerignore" />
|
||||||
<None Include="docker-compose.ci.build.yml" />
|
<None Include="docker-compose.ci.build.yml" />
|
||||||
<None Include="docker-compose.override.yml">
|
<None Include="docker-compose.override.yml">
|
||||||
<DependentUpon>docker-compose.yml</DependentUpon>
|
<DependentUpon>docker-compose.yml</DependentUpon>
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
version: '3'
|
version: '3.4'
|
||||||
|
|
||||||
services:
|
services:
|
||||||
basket.api:
|
basket.api:
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
version: '3'
|
version: '3.4'
|
||||||
|
|
||||||
# ONLY NEEDED WHEN RUNNING WINDOWS CONTAINERS
|
# ONLY NEEDED WHEN RUNNING WINDOWS CONTAINERS
|
||||||
#
|
#
|
||||||
@ -37,7 +37,12 @@ services:
|
|||||||
- EventBusUserName=admin
|
- EventBusUserName=admin
|
||||||
- EventBusPassword=password
|
- EventBusPassword=password
|
||||||
|
|
||||||
marketing.api:
|
ordering.api:
|
||||||
|
environment:
|
||||||
|
- EventBusUserName=admin
|
||||||
|
- EventBusPassword=password
|
||||||
|
|
||||||
|
ordering.backgroundtasks:
|
||||||
environment:
|
environment:
|
||||||
- EventBusUserName=admin
|
- EventBusUserName=admin
|
||||||
- EventBusPassword=password
|
- EventBusPassword=password
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
version: '3'
|
version: '3.4'
|
||||||
|
|
||||||
# The default docker-compose.override file can use the "localhost" as the external name for testing web apps within the same dev machine.
|
# The default docker-compose.override file can use the "localhost" as the external name for testing web apps within the same dev machine.
|
||||||
# The ESHOP_EXTERNAL_DNS_NAME_OR_IP environment variable is taken, by default, from the ".env" file defined like:
|
# The ESHOP_EXTERNAL_DNS_NAME_OR_IP environment variable is taken, by default, from the ".env" file defined like:
|
||||||
@ -83,6 +83,24 @@ services:
|
|||||||
ports:
|
ports:
|
||||||
- "5102:80"
|
- "5102:80"
|
||||||
|
|
||||||
|
ordering.backgroundtasks:
|
||||||
|
environment:
|
||||||
|
- ASPNETCORE_ENVIRONMENT=Development
|
||||||
|
- ASPNETCORE_URLS=http://0.0.0.0:80
|
||||||
|
- ConnectionString=${ESHOP_AZURE_ORDERING_DB:-Server=sql.data;Database=Microsoft.eShopOnContainers.Services.OrderingDb;User Id=sa;Password=Pass@word}
|
||||||
|
- EventBusConnection=${ESHOP_AZURE_SERVICE_BUS:-rabbitmq}
|
||||||
|
- EventBusUserName=${ESHOP_SERVICE_BUS_USERNAME}
|
||||||
|
- EventBusPassword=${ESHOP_SERVICE_BUS_PASSWORD}
|
||||||
|
- UseCustomizationData=True
|
||||||
|
- AzureServiceBusEnabled=False
|
||||||
|
- CheckUpdateTime=30000
|
||||||
|
- GracePeriodTime=1
|
||||||
|
- ApplicationInsights__InstrumentationKey=${INSTRUMENTATION_KEY}
|
||||||
|
- OrchestratorType=${ORCHESTRATOR_TYPE}
|
||||||
|
- UseLoadTest=${USE_LOADTEST:-False}
|
||||||
|
ports:
|
||||||
|
- "5111:80"
|
||||||
|
|
||||||
marketing.api:
|
marketing.api:
|
||||||
environment:
|
environment:
|
||||||
- ASPNETCORE_ENVIRONMENT=Development
|
- ASPNETCORE_ENVIRONMENT=Development
|
||||||
@ -137,8 +155,8 @@ services:
|
|||||||
- OrderingUrl=http://ordering.api
|
- OrderingUrl=http://ordering.api
|
||||||
- BasketUrl=http://basket.api
|
- BasketUrl=http://basket.api
|
||||||
- LocationsUrl=http://locations.api
|
- LocationsUrl=http://locations.api
|
||||||
- IdentityUrl=http://10.0.75.1:5105
|
- IdentityUrl=http://10.0.75.1:5105 # Local Mac: Use http://docker.for.mac.localhost:5105 || Local Windows: Use 10.0.75.1 in a "Docker for Windows" environment, if using "localhost" from browser. || #Remote access: Use ${ESHOP_EXTERNAL_DNS_NAME_OR_IP} if using external IP or DNS name from browser.
|
||||||
- MarketingUrl=http://marketing.api #Local: Use 10.0.75.1 in a "Docker for Windows" environment, if using "localhost" from browser. #Remote: Use ${ESHOP_EXTERNAL_DNS_NAME_OR_IP} if using external IP or DNS name from browser.
|
- MarketingUrl=http://marketing.api
|
||||||
- CatalogUrlHC=http://catalog.api/hc
|
- CatalogUrlHC=http://catalog.api/hc
|
||||||
- OrderingUrlHC=http://ordering.api/hc
|
- OrderingUrlHC=http://ordering.api/hc
|
||||||
- IdentityUrlHC=http://identity.api/hc #Local: Use ${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}, if using external IP or DNS name from browser.
|
- IdentityUrlHC=http://identity.api/hc #Local: Use ${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}, if using external IP or DNS name from browser.
|
||||||
@ -203,12 +221,21 @@ services:
|
|||||||
|
|
||||||
sql.data:
|
sql.data:
|
||||||
environment:
|
environment:
|
||||||
- MSSQL_SA_PASSWORD=Pass@word
|
- SA_PASSWORD=Pass@word
|
||||||
- ACCEPT_EULA=Y
|
- ACCEPT_EULA=Y
|
||||||
- MSSQL_PID=Developer
|
|
||||||
ports:
|
ports:
|
||||||
- "5433:1433"
|
- "5433:1433"
|
||||||
|
|
||||||
nosql.data:
|
nosql.data:
|
||||||
ports:
|
ports:
|
||||||
- "27017:27017"
|
- "27017:27017"
|
||||||
|
|
||||||
|
basket.data:
|
||||||
|
ports:
|
||||||
|
- "6379:6379"
|
||||||
|
|
||||||
|
rabbitmq:
|
||||||
|
ports:
|
||||||
|
- "15672:15672"
|
||||||
|
- "5672:5672"
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
version: '3'
|
version: '3.4'
|
||||||
|
|
||||||
# The Production docker-compose file has to have the external/real IPs or DNS names for the services
|
# The Production docker-compose file has to have the external/real IPs or DNS names for the services
|
||||||
# The ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP environment variable is taken, by default, from the ".env" file defined like:
|
# The ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP environment variable is taken, by default, from the ".env" file defined like:
|
||||||
@ -6,7 +6,9 @@ version: '3'
|
|||||||
# but values present in the environment vars at runtime will always override those defined inside the .env file
|
# but values present in the environment vars at runtime will always override those defined inside the .env file
|
||||||
# An external IP or DNS name has to be used when testing the Web apps and the Xamarin apps from remote machines/devices using the same WiFi, for instance.
|
# An external IP or DNS name has to be used when testing the Web apps and the Xamarin apps from remote machines/devices using the same WiFi, for instance.
|
||||||
#
|
#
|
||||||
# Set ASPNETCORE_ENVIRONMENT=Development to get errors while testing.
|
# IMPORTANT: Note that this compose file uses ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP instead of ESHOP_EXTERNAL_DNS_NAME_OR_IP
|
||||||
|
|
||||||
|
# Set ASPNETCORE_ENVIRONMENT= Development or Production, depending if you want to show up errors while testing.
|
||||||
#
|
#
|
||||||
# You need to start it with the following CLI command:
|
# You need to start it with the following CLI command:
|
||||||
# docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d
|
# docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d
|
||||||
@ -15,70 +17,107 @@ services:
|
|||||||
|
|
||||||
basket.api:
|
basket.api:
|
||||||
environment:
|
environment:
|
||||||
- ASPNETCORE_ENVIRONMENT=Production
|
- ASPNETCORE_ENVIRONMENT=Development
|
||||||
- ASPNETCORE_URLS=http://0.0.0.0:80
|
- ASPNETCORE_URLS=http://0.0.0.0:80
|
||||||
- ConnectionString=${ESHOP_AZURE_REDIS_BASKET_DB:-basket.data}
|
- ConnectionString=${ESHOP_AZURE_REDIS_BASKET_DB:-basket.data}
|
||||||
- identityUrl=http://identity.api #Local: You need to open your local dev-machine firewall at range 5100-5110.
|
- identityUrl=http://identity.api #Local: You need to open your local dev-machine firewall at range 5100-5110.
|
||||||
- IdentityUrlExternal=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5105
|
- IdentityUrlExternal=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5105
|
||||||
- EventBusConnection=${ESHOP_AZURE_SERVICE_BUS:-rabbitmq}
|
- EventBusConnection=${ESHOP_AZURE_SERVICE_BUS:-rabbitmq}
|
||||||
|
- EventBusUserName=${ESHOP_SERVICE_BUS_USERNAME}
|
||||||
|
- EventBusPassword=${ESHOP_SERVICE_BUS_PASSWORD}
|
||||||
- AzureServiceBusEnabled=False
|
- AzureServiceBusEnabled=False
|
||||||
|
- ApplicationInsights__InstrumentationKey=${INSTRUMENTATION_KEY}
|
||||||
|
- OrchestratorType=${ORCHESTRATOR_TYPE}
|
||||||
|
- UseLoadTest=${USE_LOADTEST:-False}
|
||||||
|
|
||||||
ports:
|
ports:
|
||||||
- "5103:80"
|
- "5103:80"
|
||||||
|
|
||||||
catalog.api:
|
catalog.api:
|
||||||
environment:
|
environment:
|
||||||
- ASPNETCORE_ENVIRONMENT=Production
|
- ASPNETCORE_ENVIRONMENT=Development
|
||||||
- ASPNETCORE_URLS=http://0.0.0.0:80
|
- ASPNETCORE_URLS=http://0.0.0.0:80
|
||||||
- ConnectionString=${ESHOP_AZURE_CATALOG_DB:-Server=sql.data;Database=Microsoft.eShopOnContainers.Services.CatalogDb;User Id=sa;Password=Pass@word}
|
- ConnectionString=${ESHOP_AZURE_CATALOG_DB:-Server=sql.data;Database=Microsoft.eShopOnContainers.Services.CatalogDb;User Id=sa;Password=Pass@word}
|
||||||
- PicBaseUrl=${ESHOP_AZURE_STORAGE_CATALOG_URL:-http://localhost:5101/api/v1/catalog/items/[0]/pic/} #Local: You need to open your local dev-machine firewall at range 5100-5110.
|
- PicBaseUrl=${ESHOP_AZURE_STORAGE_CATALOG_URL:-http://localhost:5101/api/v1/catalog/items/[0]/pic/} #Local: You need to open your local dev-machine firewall at range 5100-5110.
|
||||||
- EventBusConnection=${ESHOP_AZURE_SERVICE_BUS:-rabbitmq}
|
- EventBusConnection=${ESHOP_AZURE_SERVICE_BUS:-rabbitmq}
|
||||||
|
- EventBusUserName=${ESHOP_SERVICE_BUS_USERNAME}
|
||||||
|
- EventBusPassword=${ESHOP_SERVICE_BUS_PASSWORD}
|
||||||
- AzureStorageAccountName=${ESHOP_AZURE_STORAGE_CATALOG_NAME}
|
- AzureStorageAccountName=${ESHOP_AZURE_STORAGE_CATALOG_NAME}
|
||||||
- AzureStorageAccountKey=${ESHOP_AZURE_STORAGE_CATALOG_KEY}
|
- AzureStorageAccountKey=${ESHOP_AZURE_STORAGE_CATALOG_KEY}
|
||||||
- UseCustomizationData=True
|
- UseCustomizationData=True
|
||||||
- AzureServiceBusEnabled=False
|
- AzureServiceBusEnabled=False
|
||||||
- AzureStorageEnabled=False
|
- AzureStorageEnabled=False
|
||||||
|
- ApplicationInsights__InstrumentationKey=${INSTRUMENTATION_KEY}
|
||||||
|
- OrchestratorType=${ORCHESTRATOR_TYPE}
|
||||||
ports:
|
ports:
|
||||||
- "5101:80"
|
- "5101:80"
|
||||||
|
|
||||||
identity.api:
|
identity.api:
|
||||||
environment:
|
environment:
|
||||||
- ASPNETCORE_ENVIRONMENT=Production
|
- ASPNETCORE_ENVIRONMENT=Development
|
||||||
- ASPNETCORE_URLS=http://0.0.0.0:80
|
- ASPNETCORE_URLS=http://0.0.0.0:80
|
||||||
- SpaClient=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5104
|
- SpaClient=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5104
|
||||||
- XamarinCallback=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5105/xamarincallback
|
- XamarinCallback=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5105/xamarincallback #localhost do not work for UWP login, so we have to use "external" IP always
|
||||||
- ConnectionStrings__DefaultConnection=${ESHOP_AZURE_IDENTITY_DB:-Server=sql.data;Database=Microsoft.eShopOnContainers.Service.IdentityDb;User Id=sa;Password=Pass@word}
|
- ConnectionString=${ESHOP_AZURE_IDENTITY_DB:-Server=sql.data;Database=Microsoft.eShopOnContainers.Service.IdentityDb;User Id=sa;Password=Pass@word}
|
||||||
- MvcClient=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5100 #Local: You need to open your local dev-machine firewall at range 5100-5110.
|
- MvcClient=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5100 #Local: You need to open your local dev-machine firewall at range 5100-5110.
|
||||||
- LocationApiClient=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5109
|
- LocationApiClient=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5109
|
||||||
- MarketingApiClient=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5110
|
- MarketingApiClient=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5110
|
||||||
- BasketApiClient=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5103
|
- BasketApiClient=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5103
|
||||||
- OrderingApiClient=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5102
|
- OrderingApiClient=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5102
|
||||||
- UseCustomizationData=True
|
- UseCustomizationData=True
|
||||||
|
- ApplicationInsights__InstrumentationKey=${INSTRUMENTATION_KEY}
|
||||||
|
- OrchestratorType=${ORCHESTRATOR_TYPE}
|
||||||
ports:
|
ports:
|
||||||
- "5105:80"
|
- "5105:80"
|
||||||
|
|
||||||
ordering.api:
|
ordering.api:
|
||||||
environment:
|
environment:
|
||||||
- ASPNETCORE_ENVIRONMENT=Production
|
- ASPNETCORE_ENVIRONMENT=Development
|
||||||
- ASPNETCORE_URLS=http://0.0.0.0:80
|
- ASPNETCORE_URLS=http://0.0.0.0:80
|
||||||
- ConnectionString=${ESHOP_AZURE_ORDERING_DB:-Server=sql.data;Database=Microsoft.eShopOnContainers.Services.OrderingDb;User Id=sa;Password=Pass@word}
|
- ConnectionString=${ESHOP_AZURE_ORDERING_DB:-Server=sql.data;Database=Microsoft.eShopOnContainers.Services.OrderingDb;User Id=sa;Password=Pass@word}
|
||||||
- identityUrl=http://identity.api #Local: You need to open your local dev-machine firewall at range 5100-5110.
|
- identityUrl=http://identity.api #Local: You need to open your local dev-machine firewall at range 5100-5110.
|
||||||
- IdentityUrlExternal=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5105
|
- IdentityUrlExternal=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5105
|
||||||
- EventBusConnection=${ESHOP_AZURE_SERVICE_BUS:-rabbitmq}
|
- EventBusConnection=${ESHOP_AZURE_SERVICE_BUS:-rabbitmq}
|
||||||
|
- EventBusUserName=${ESHOP_SERVICE_BUS_USERNAME}
|
||||||
|
- EventBusPassword=${ESHOP_SERVICE_BUS_PASSWORD}
|
||||||
- UseCustomizationData=True
|
- UseCustomizationData=True
|
||||||
- AzureServiceBusEnabled=False
|
- AzureServiceBusEnabled=False
|
||||||
- CheckUpdateTime=30000
|
- CheckUpdateTime=30000
|
||||||
- GracePeriodTime=1
|
- GracePeriodTime=1
|
||||||
|
- ApplicationInsights__InstrumentationKey=${INSTRUMENTATION_KEY}
|
||||||
|
- OrchestratorType=${ORCHESTRATOR_TYPE}
|
||||||
|
- UseLoadTest=${USE_LOADTEST:-False}
|
||||||
ports:
|
ports:
|
||||||
- "5102:80"
|
- "5102:80"
|
||||||
|
|
||||||
|
ordering.backgroundtasks:
|
||||||
|
environment:
|
||||||
|
- ASPNETCORE_ENVIRONMENT=Development
|
||||||
|
- ASPNETCORE_URLS=http://0.0.0.0:80
|
||||||
|
- ConnectionString=${ESHOP_AZURE_ORDERING_DB:-Server=sql.data;Database=Microsoft.eShopOnContainers.Services.OrderingDb;User Id=sa;Password=Pass@word}
|
||||||
|
- EventBusConnection=${ESHOP_AZURE_SERVICE_BUS:-rabbitmq}
|
||||||
|
- EventBusUserName=${ESHOP_SERVICE_BUS_USERNAME}
|
||||||
|
- EventBusPassword=${ESHOP_SERVICE_BUS_PASSWORD}
|
||||||
|
- UseCustomizationData=True
|
||||||
|
- AzureServiceBusEnabled=False
|
||||||
|
- CheckUpdateTime=30000
|
||||||
|
- GracePeriodTime=1
|
||||||
|
- ApplicationInsights__InstrumentationKey=${INSTRUMENTATION_KEY}
|
||||||
|
- OrchestratorType=${ORCHESTRATOR_TYPE}
|
||||||
|
- UseLoadTest=${USE_LOADTEST:-False}
|
||||||
|
ports:
|
||||||
|
- "5111:80"
|
||||||
|
|
||||||
marketing.api:
|
marketing.api:
|
||||||
environment:
|
environment:
|
||||||
- ASPNETCORE_ENVIRONMENT=Production
|
- ASPNETCORE_ENVIRONMENT=Development
|
||||||
- ASPNETCORE_URLS=http://0.0.0.0:80
|
- ASPNETCORE_URLS=http://0.0.0.0:80
|
||||||
- ConnectionString=${ESHOP_AZURE_MARKETING_DB:-Server=sql.data;Database=Microsoft.eShopOnContainers.Services.MarketingDb;User Id=sa;Password=Pass@word}
|
- ConnectionString=${ESHOP_AZURE_MARKETING_DB:-Server=sql.data;Database=Microsoft.eShopOnContainers.Services.MarketingDb;User Id=sa;Password=Pass@word}
|
||||||
- MongoConnectionString=${ESHOP_AZURE_COSMOSDB:-mongodb://nosql.data}
|
- MongoConnectionString=${ESHOP_AZURE_COSMOSDB:-mongodb://nosql.data}
|
||||||
- MongoDatabase=MarketingDb
|
- MongoDatabase=MarketingDb
|
||||||
- EventBusConnection=${ESHOP_AZURE_SERVICE_BUS:-rabbitmq}
|
- EventBusConnection=${ESHOP_AZURE_SERVICE_BUS:-rabbitmq}
|
||||||
|
- EventBusUserName=${ESHOP_SERVICE_BUS_USERNAME}
|
||||||
|
- EventBusPassword=${ESHOP_SERVICE_BUS_PASSWORD}
|
||||||
- identityUrl=http://identity.api #Local: You need to open your local dev-machine firewall at range 5100-5110.
|
- identityUrl=http://identity.api #Local: You need to open your local dev-machine firewall at range 5100-5110.
|
||||||
- IdentityUrlExternal=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5105
|
- IdentityUrlExternal=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5105
|
||||||
- CampaignDetailFunctionUri=${ESHOP_AZUREFUNC_CAMPAIGN_DETAILS_URI}
|
- CampaignDetailFunctionUri=${ESHOP_AZUREFUNC_CAMPAIGN_DETAILS_URI}
|
||||||
@ -87,41 +126,106 @@ services:
|
|||||||
- AzureStorageAccountKey=${ESHOP_AZURE_STORAGE_MARKETING_KEY}
|
- AzureStorageAccountKey=${ESHOP_AZURE_STORAGE_MARKETING_KEY}
|
||||||
- AzureServiceBusEnabled=False
|
- AzureServiceBusEnabled=False
|
||||||
- AzureStorageEnabled=False
|
- AzureStorageEnabled=False
|
||||||
|
- ApplicationInsights__InstrumentationKey=${INSTRUMENTATION_KEY}
|
||||||
|
- OrchestratorType=${ORCHESTRATOR_TYPE}
|
||||||
|
- UseLoadTest=${USE_LOADTEST:-False}
|
||||||
ports:
|
ports:
|
||||||
- "5110:80"
|
- "5110:80"
|
||||||
|
|
||||||
webspa:
|
webspa:
|
||||||
environment:
|
environment:
|
||||||
- ASPNETCORE_ENVIRONMENT=Production
|
- ASPNETCORE_ENVIRONMENT=Development
|
||||||
- ASPNETCORE_URLS=http://0.0.0.0:80
|
- ASPNETCORE_URLS=http://0.0.0.0:80
|
||||||
- CatalogUrl=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5101
|
- CatalogUrl=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5101
|
||||||
- OrderingUrl=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5102
|
- OrderingUrl=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5102
|
||||||
- IdentityUrl=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5105 #Local: You need to open your host's firewall at range 5100-5110.
|
- IdentityUrl=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5105 #Local: You need to open your local dev-machine firewall at range 5100-5105. at range 5100-5105.
|
||||||
- BasketUrl=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5103
|
- BasketUrl=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5103
|
||||||
- MarketingUrl=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5110
|
- MarketingUrl=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5110
|
||||||
|
- LocationsUrl=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5109
|
||||||
- CatalogUrlHC=http://catalog.api/hc
|
- CatalogUrlHC=http://catalog.api/hc
|
||||||
- OrderingUrlHC=http://ordering.api/hc
|
- OrderingUrlHC=http://ordering.api/hc
|
||||||
- IdentityUrlHC=http://identity.api/hc #Local: Use ${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}, if using external IP or DNS name from browser.
|
- IdentityUrlHC=http://identity.api/hc
|
||||||
- BasketUrlHC=http://basket.api/hc
|
- BasketUrlHC=http://basket.api/hc
|
||||||
- MarketingUrlHC=http://marketing.api/hc
|
- MarketingUrlHC=http://marketing.api/hc
|
||||||
|
- PaymentUrlHC=http://payment.api/hc
|
||||||
- UseCustomizationData=True
|
- UseCustomizationData=True
|
||||||
|
- ApplicationInsights__InstrumentationKey=${INSTRUMENTATION_KEY}
|
||||||
|
- OrchestratorType=${ORCHESTRATOR_TYPE}
|
||||||
ports:
|
ports:
|
||||||
- "5104:80"
|
- "5104:80"
|
||||||
|
|
||||||
webmvc:
|
webmvc:
|
||||||
environment:
|
environment:
|
||||||
- ASPNETCORE_ENVIRONMENT=Production
|
- ASPNETCORE_ENVIRONMENT=Development
|
||||||
- ASPNETCORE_URLS=http://0.0.0.0:80
|
- ASPNETCORE_URLS=http://0.0.0.0:80
|
||||||
- CatalogUrl=http://catalog.api
|
- CatalogUrl=http://catalog.api
|
||||||
- OrderingUrl=http://ordering.api
|
- OrderingUrl=http://ordering.api
|
||||||
- BasketUrl=http://basket.api
|
- BasketUrl=http://basket.api
|
||||||
- IdentityUrl=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5105 #Local: Use ${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}, if using external IP or DNS name from browser.
|
- LocationsUrl=http://locations.api
|
||||||
- MarketingUrl=http://marketing.api #Local: Use 10.0.75.1 in a "Docker for Windows" environment, if using "localhost" from browser.
|
- IdentityUrl=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5105 #Local: Use 10.0.75.1 in a "Docker for Windows" environment, if using "localhost" from browser. #Remote: Use ${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP} if using external IP or DNS name from browser.
|
||||||
#Remote: Use ${ESHOP_EXTERNAL_DNS_NAME_OR_IP} if using external IP or DNS name from browser.
|
- MarketingUrl=http://marketing.api
|
||||||
|
- CatalogUrlHC=http://catalog.api/hc
|
||||||
|
- OrderingUrlHC=http://ordering.api/hc
|
||||||
|
- IdentityUrlHC=http://identity.api/hc
|
||||||
|
- BasketUrlHC=http://basket.api/hc
|
||||||
|
- MarketingUrlHC=http://marketing.api/hc
|
||||||
|
- PaymentUrlHC=http://payment.api/hc
|
||||||
- UseCustomizationData=True
|
- UseCustomizationData=True
|
||||||
|
- ApplicationInsights__InstrumentationKey=${INSTRUMENTATION_KEY}
|
||||||
|
- OrchestratorType=${ORCHESTRATOR_TYPE}
|
||||||
|
- UseLoadTest=${USE_LOADTEST:-False}
|
||||||
ports:
|
ports:
|
||||||
- "5100:80"
|
- "5100:80"
|
||||||
|
|
||||||
|
webstatus:
|
||||||
|
environment:
|
||||||
|
- ASPNETCORE_ENVIRONMENT=Development
|
||||||
|
- ASPNETCORE_URLS=http://0.0.0.0:80
|
||||||
|
- CatalogUrl=http://catalog.api/hc
|
||||||
|
- OrderingUrl=http://ordering.api/hc
|
||||||
|
- BasketUrl=http://basket.api/hc
|
||||||
|
- IdentityUrl=http://identity.api/hc
|
||||||
|
- LocationsUrl=http://locations.api/hc
|
||||||
|
- MarketingUrl=http://marketing.api/hc
|
||||||
|
- PaymentUrl=http://payment.api/hc
|
||||||
|
- mvc=http://webmvc/hc
|
||||||
|
- spa=http://webspa/hc
|
||||||
|
- ApplicationInsights__InstrumentationKey=${INSTRUMENTATION_KEY}
|
||||||
|
- OrchestratorType=${ORCHESTRATOR_TYPE}
|
||||||
|
ports:
|
||||||
|
- "5107:80"
|
||||||
|
|
||||||
|
payment.api:
|
||||||
|
environment:
|
||||||
|
- ASPNETCORE_ENVIRONMENT=Development
|
||||||
|
- ASPNETCORE_URLS=http://0.0.0.0:80
|
||||||
|
- EventBusConnection=${ESHOP_AZURE_SERVICE_BUS:-rabbitmq}
|
||||||
|
- EventBusUserName=${ESHOP_SERVICE_BUS_USERNAME}
|
||||||
|
- EventBusPassword=${ESHOP_SERVICE_BUS_PASSWORD}
|
||||||
|
- AzureServiceBusEnabled=False
|
||||||
|
- ApplicationInsights__InstrumentationKey=${INSTRUMENTATION_KEY}
|
||||||
|
- OrchestratorType=${ORCHESTRATOR_TYPE}
|
||||||
|
ports:
|
||||||
|
- "5108:80"
|
||||||
|
|
||||||
|
locations.api:
|
||||||
|
environment:
|
||||||
|
- ASPNETCORE_ENVIRONMENT=Development
|
||||||
|
- ASPNETCORE_URLS=http://0.0.0.0:80
|
||||||
|
- ConnectionString=${ESHOP_AZURE_COSMOSDB:-mongodb://nosql.data}
|
||||||
|
- Database=LocationsDb
|
||||||
|
- identityUrl=http://identity.api #Local: You need to open your local dev-machine firewall at range 5100-5110.
|
||||||
|
- IdentityUrlExternal=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5105
|
||||||
|
- EventBusConnection=${ESHOP_AZURE_SERVICE_BUS:-rabbitmq}
|
||||||
|
- EventBusUserName=${ESHOP_SERVICE_BUS_USERNAME}
|
||||||
|
- EventBusPassword=${ESHOP_SERVICE_BUS_PASSWORD}
|
||||||
|
- AzureServiceBusEnabled=False
|
||||||
|
- ApplicationInsights__InstrumentationKey=${INSTRUMENTATION_KEY}
|
||||||
|
- OrchestratorType=${ORCHESTRATOR_TYPE}
|
||||||
|
- UseLoadTest=${USE_LOADTEST:-False}
|
||||||
|
ports:
|
||||||
|
- "5109:80"
|
||||||
|
|
||||||
sql.data:
|
sql.data:
|
||||||
environment:
|
environment:
|
||||||
- MSSQL_SA_PASSWORD=Pass@word
|
- MSSQL_SA_PASSWORD=Pass@word
|
||||||
@ -134,40 +238,11 @@ services:
|
|||||||
ports:
|
ports:
|
||||||
- "27017:27017"
|
- "27017:27017"
|
||||||
|
|
||||||
webstatus:
|
basket.data:
|
||||||
environment:
|
|
||||||
- ASPNETCORE_ENVIRONMENT=Production
|
|
||||||
- ASPNETCORE_URLS=http://0.0.0.0:80
|
|
||||||
- CatalogUrl=http://catalog.api/hc
|
|
||||||
- OrderingUrl=http://ordering.api/hc
|
|
||||||
- BasketUrl=http://basket.api/hc
|
|
||||||
- IdentityUrl=http://identity.api/hc
|
|
||||||
- LocationsUrl=http://locations.api/hc
|
|
||||||
- MarketingUrl=http://marketing.api/hc
|
|
||||||
- mvc=http://webmvc/hc
|
|
||||||
- spa=http://webspa/hc
|
|
||||||
|
|
||||||
ports:
|
ports:
|
||||||
- "5107:80"
|
- "6379:6379"
|
||||||
|
|
||||||
payment.api:
|
rabbitmq:
|
||||||
environment:
|
|
||||||
- ASPNETCORE_ENVIRONMENT=Production
|
|
||||||
- ASPNETCORE_URLS=http://0.0.0.0:5108
|
|
||||||
- EventBusConnection=${ESHOP_AZURE_SERVICE_BUS:-rabbitmq}
|
|
||||||
- AzureServiceBusEnabled=False
|
|
||||||
ports:
|
ports:
|
||||||
- "5108:80"
|
- "15672:15672"
|
||||||
|
- "5672:5672"
|
||||||
locations.api:
|
|
||||||
environment:
|
|
||||||
- ASPNETCORE_ENVIRONMENT=Production
|
|
||||||
- ASPNETCORE_URLS=http://0.0.0.0:80
|
|
||||||
- ConnectionString=${ESHOP_AZURE_COSMOSDB:-mongodb://nosql.data}
|
|
||||||
- Database=LocationsDb
|
|
||||||
- identityUrl=http://identity.api #Local: You need to open your local dev-machine firewall at range 5100-5110.
|
|
||||||
- IdentityUrlExternal=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5105
|
|
||||||
- EventBusConnection=${ESHOP_AZURE_SERVICE_BUS:-rabbitmq}
|
|
||||||
- AzureServiceBusEnabled=False
|
|
||||||
ports:
|
|
||||||
- "5109:80"
|
|
@ -1,12 +1,12 @@
|
|||||||
version: '3'
|
version: '3.4'
|
||||||
|
|
||||||
services:
|
services:
|
||||||
|
|
||||||
basket.api:
|
basket.api:
|
||||||
image: eshop/basket.api:${TAG:-latest}
|
image: eshop/basket.api:${TAG:-latest}
|
||||||
build:
|
build:
|
||||||
context: ./src/Services/Basket/Basket.API
|
context: .
|
||||||
dockerfile: Dockerfile
|
dockerfile: src/Services/Basket/Basket.API/Dockerfile
|
||||||
depends_on:
|
depends_on:
|
||||||
- basket.data
|
- basket.data
|
||||||
- identity.api
|
- identity.api
|
||||||
@ -15,8 +15,8 @@ services:
|
|||||||
catalog.api:
|
catalog.api:
|
||||||
image: eshop/catalog.api:${TAG:-latest}
|
image: eshop/catalog.api:${TAG:-latest}
|
||||||
build:
|
build:
|
||||||
context: ./src/Services/Catalog/Catalog.API
|
context: .
|
||||||
dockerfile: Dockerfile
|
dockerfile: src/Services/Catalog/Catalog.API/Dockerfile
|
||||||
depends_on:
|
depends_on:
|
||||||
- sql.data
|
- sql.data
|
||||||
- rabbitmq
|
- rabbitmq
|
||||||
@ -24,16 +24,25 @@ services:
|
|||||||
identity.api:
|
identity.api:
|
||||||
image: eshop/identity.api:${TAG:-latest}
|
image: eshop/identity.api:${TAG:-latest}
|
||||||
build:
|
build:
|
||||||
context: ./src/Services/Identity/Identity.API
|
context: .
|
||||||
dockerfile: Dockerfile
|
dockerfile: src/Services/Identity/Identity.API/Dockerfile
|
||||||
depends_on:
|
depends_on:
|
||||||
- sql.data
|
- sql.data
|
||||||
|
|
||||||
ordering.api:
|
ordering.api:
|
||||||
image: eshop/ordering.api:${TAG:-latest}
|
image: eshop/ordering.api:${TAG:-latest}
|
||||||
build:
|
build:
|
||||||
context: ./src/Services/Ordering/Ordering.API
|
context: .
|
||||||
dockerfile: Dockerfile
|
dockerfile: src/Services/Ordering/Ordering.API/Dockerfile
|
||||||
|
depends_on:
|
||||||
|
- sql.data
|
||||||
|
- rabbitmq
|
||||||
|
|
||||||
|
ordering.backgroundtasks:
|
||||||
|
image: eshop/ordering.backgroundtasks:${TAG:-latest}
|
||||||
|
build:
|
||||||
|
context: .
|
||||||
|
dockerfile: src/Services/Ordering/Ordering.BackgroundTasks/Dockerfile
|
||||||
depends_on:
|
depends_on:
|
||||||
- sql.data
|
- sql.data
|
||||||
- rabbitmq
|
- rabbitmq
|
||||||
@ -41,8 +50,8 @@ services:
|
|||||||
marketing.api:
|
marketing.api:
|
||||||
image: eshop/marketing.api:${TAG:-latest}
|
image: eshop/marketing.api:${TAG:-latest}
|
||||||
build:
|
build:
|
||||||
context: ./src/Services/Marketing/Marketing.API
|
context: .
|
||||||
dockerfile: Dockerfile
|
dockerfile: src/Services/Marketing/Marketing.API/Dockerfile
|
||||||
depends_on:
|
depends_on:
|
||||||
- sql.data
|
- sql.data
|
||||||
- nosql.data
|
- nosql.data
|
||||||
@ -52,8 +61,8 @@ services:
|
|||||||
webspa:
|
webspa:
|
||||||
image: eshop/webspa:${TAG:-latest}
|
image: eshop/webspa:${TAG:-latest}
|
||||||
build:
|
build:
|
||||||
context: ./src/Web/WebSPA
|
context: .
|
||||||
dockerfile: Dockerfile
|
dockerfile: src/Web/WebSPA/Dockerfile
|
||||||
depends_on:
|
depends_on:
|
||||||
- catalog.api
|
- catalog.api
|
||||||
- ordering.api
|
- ordering.api
|
||||||
@ -64,8 +73,8 @@ services:
|
|||||||
webmvc:
|
webmvc:
|
||||||
image: eshop/webmvc:${TAG:-latest}
|
image: eshop/webmvc:${TAG:-latest}
|
||||||
build:
|
build:
|
||||||
context: ./src/Web/WebMVC
|
context: .
|
||||||
dockerfile: Dockerfile
|
dockerfile: src/Web/WebMVC/Dockerfile
|
||||||
depends_on:
|
depends_on:
|
||||||
- catalog.api
|
- catalog.api
|
||||||
- ordering.api
|
- ordering.api
|
||||||
@ -76,22 +85,22 @@ services:
|
|||||||
webstatus:
|
webstatus:
|
||||||
image: eshop/webstatus:${TAG:-latest}
|
image: eshop/webstatus:${TAG:-latest}
|
||||||
build:
|
build:
|
||||||
context: ./src/Web/WebStatus
|
context: .
|
||||||
dockerfile: Dockerfile
|
dockerfile: src/Web/WebStatus/Dockerfile
|
||||||
|
|
||||||
payment.api:
|
payment.api:
|
||||||
image: eshop/payment.api:${TAG:-latest}
|
image: eshop/payment.api:${TAG:-latest}
|
||||||
build:
|
build:
|
||||||
context: ./src/Services/Payment/Payment.API
|
context: .
|
||||||
dockerfile: Dockerfile
|
dockerfile: src/Services/Payment/Payment.API/Dockerfile
|
||||||
depends_on:
|
depends_on:
|
||||||
- rabbitmq
|
- rabbitmq
|
||||||
|
|
||||||
locations.api:
|
locations.api:
|
||||||
image: eshop/locations.api:${TAG:-latest}
|
image: eshop/locations.api:${TAG:-latest}
|
||||||
build:
|
build:
|
||||||
context: ./src/Services/Location/Locations.API
|
context: .
|
||||||
dockerfile: Dockerfile
|
dockerfile: src/Services/Location/Locations.API/Dockerfile
|
||||||
depends_on:
|
depends_on:
|
||||||
- nosql.data
|
- nosql.data
|
||||||
- rabbitmq
|
- rabbitmq
|
||||||
@ -103,12 +112,7 @@ services:
|
|||||||
image: mongo
|
image: mongo
|
||||||
|
|
||||||
basket.data:
|
basket.data:
|
||||||
image: redis
|
image: redis:alpine
|
||||||
ports:
|
|
||||||
- "6379:6379"
|
|
||||||
|
|
||||||
rabbitmq:
|
rabbitmq:
|
||||||
image: rabbitmq:3-management
|
image: rabbitmq:3-management-alpine
|
||||||
ports:
|
|
||||||
- "15672:15672"
|
|
||||||
- "5672:5672"
|
|
204
eShopOnContainers-MobileApps.sln
Executable file → Normal file
@ -16,8 +16,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Mobile Apps", "Mobile Apps"
|
|||||||
EndProject
|
EndProject
|
||||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{A857AD10-40FF-4303-BEC2-FF1C58D5735E}"
|
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{A857AD10-40FF-4303-BEC2-FF1C58D5735E}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "eShopOnContainers.Core", "src\Mobile\eShopOnContainers\eShopOnContainers.Core\eShopOnContainers.Core.csproj", "{BA96A12C-4EE3-46C4-BB3F-F811B554CD01}"
|
|
||||||
EndProject
|
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "eShopOnContainers.Droid", "src\Mobile\eShopOnContainers\eShopOnContainers.Droid\eShopOnContainers.Droid.csproj", "{62DBB163-9CA9-4818-B48B-13233DF37C24}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "eShopOnContainers.Droid", "src\Mobile\eShopOnContainers\eShopOnContainers.Droid\eShopOnContainers.Droid.csproj", "{62DBB163-9CA9-4818-B48B-13233DF37C24}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "eShopOnContainers.iOS", "src\Mobile\eShopOnContainers\eShopOnContainers.iOS\eShopOnContainers.iOS.csproj", "{6EEB23DC-7063-4444-9AF8-90DF24F549C0}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "eShopOnContainers.iOS", "src\Mobile\eShopOnContainers\eShopOnContainers.iOS\eShopOnContainers.iOS.csproj", "{6EEB23DC-7063-4444-9AF8-90DF24F549C0}"
|
||||||
@ -30,14 +28,16 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Targets", "Targets", "{9CC7
|
|||||||
EndProject
|
EndProject
|
||||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Mobile Apps", "Mobile Apps", "{B7B1D395-4E06-4036-BE86-C216756B9367}"
|
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Mobile Apps", "Mobile Apps", "{B7B1D395-4E06-4036-BE86-C216756B9367}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "eShopOnContainers.UnitTests", "src\Mobile\eShopOnContainers\eShopOnContainers.UnitTests\eShopOnContainers.UnitTests.csproj", "{6E4285E7-7611-4440-A1B5-3513EBB13807}"
|
|
||||||
EndProject
|
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "eShopOnContainers.TestRunner.Droid", "src\Mobile\eShopOnContainers\eShopOnContainers.TestRunner.Droid\eShopOnContainers.TestRunner.Droid.csproj", "{A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "eShopOnContainers.TestRunner.Droid", "src\Mobile\eShopOnContainers\eShopOnContainers.TestRunner.Droid\eShopOnContainers.TestRunner.Droid.csproj", "{A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "eShopOnContainers.TestRunner.iOS", "src\Mobile\eShopOnContainers\eShopOnContainers.TestRunner.iOS\eShopOnContainers.TestRunner.iOS.csproj", "{B68C2B56-7581-46AE-B55D-D25DDFD3BFE3}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "eShopOnContainers.TestRunner.iOS", "src\Mobile\eShopOnContainers\eShopOnContainers.TestRunner.iOS\eShopOnContainers.TestRunner.iOS.csproj", "{B68C2B56-7581-46AE-B55D-D25DDFD3BFE3}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "eShopOnContainers.TestRunner.Windows", "src\Mobile\eShopOnContainers\eShopOnContainers.TestRunner.Windows\eShopOnContainers.TestRunner.Windows.csproj", "{A7337243-33B8-463A-87AD-944B75EFD820}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "eShopOnContainers.TestRunner.Windows", "src\Mobile\eShopOnContainers\eShopOnContainers.TestRunner.Windows\eShopOnContainers.TestRunner.Windows.csproj", "{A7337243-33B8-463A-87AD-944B75EFD820}"
|
||||||
EndProject
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "eShopOnContainers.UnitTests", "src\Mobile\eShopOnContainers\eShopOnContainers.UnitTests\eShopOnContainers.UnitTests.csproj", "{FDD910BC-DF0F-483D-B7D5-C7D831855172}"
|
||||||
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "eShopOnContainers.Core", "src\Mobile\eShopOnContainers\eShopOnContainers.Core\eShopOnContainers.Core.csproj", "{76C5F2A7-6CD5-49EA-9F33-EC44DE6539C7}"
|
||||||
|
EndProject
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
Ad-Hoc|Any CPU = Ad-Hoc|Any CPU
|
Ad-Hoc|Any CPU = Ad-Hoc|Any CPU
|
||||||
@ -66,54 +66,6 @@ Global
|
|||||||
Release|x86 = Release|x86
|
Release|x86 = Release|x86
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||||
{BA96A12C-4EE3-46C4-BB3F-F811B554CD01}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{BA96A12C-4EE3-46C4-BB3F-F811B554CD01}.Ad-Hoc|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{BA96A12C-4EE3-46C4-BB3F-F811B554CD01}.Ad-Hoc|ARM.ActiveCfg = Release|Any CPU
|
|
||||||
{BA96A12C-4EE3-46C4-BB3F-F811B554CD01}.Ad-Hoc|ARM.Build.0 = Release|Any CPU
|
|
||||||
{BA96A12C-4EE3-46C4-BB3F-F811B554CD01}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU
|
|
||||||
{BA96A12C-4EE3-46C4-BB3F-F811B554CD01}.Ad-Hoc|iPhone.Build.0 = Release|Any CPU
|
|
||||||
{BA96A12C-4EE3-46C4-BB3F-F811B554CD01}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|Any CPU
|
|
||||||
{BA96A12C-4EE3-46C4-BB3F-F811B554CD01}.Ad-Hoc|iPhoneSimulator.Build.0 = Release|Any CPU
|
|
||||||
{BA96A12C-4EE3-46C4-BB3F-F811B554CD01}.Ad-Hoc|x64.ActiveCfg = Release|Any CPU
|
|
||||||
{BA96A12C-4EE3-46C4-BB3F-F811B554CD01}.Ad-Hoc|x64.Build.0 = Release|Any CPU
|
|
||||||
{BA96A12C-4EE3-46C4-BB3F-F811B554CD01}.Ad-Hoc|x86.ActiveCfg = Release|Any CPU
|
|
||||||
{BA96A12C-4EE3-46C4-BB3F-F811B554CD01}.Ad-Hoc|x86.Build.0 = Release|Any CPU
|
|
||||||
{BA96A12C-4EE3-46C4-BB3F-F811B554CD01}.AppStore|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{BA96A12C-4EE3-46C4-BB3F-F811B554CD01}.AppStore|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{BA96A12C-4EE3-46C4-BB3F-F811B554CD01}.AppStore|ARM.ActiveCfg = Release|Any CPU
|
|
||||||
{BA96A12C-4EE3-46C4-BB3F-F811B554CD01}.AppStore|ARM.Build.0 = Release|Any CPU
|
|
||||||
{BA96A12C-4EE3-46C4-BB3F-F811B554CD01}.AppStore|iPhone.ActiveCfg = Release|Any CPU
|
|
||||||
{BA96A12C-4EE3-46C4-BB3F-F811B554CD01}.AppStore|iPhone.Build.0 = Release|Any CPU
|
|
||||||
{BA96A12C-4EE3-46C4-BB3F-F811B554CD01}.AppStore|iPhoneSimulator.ActiveCfg = Release|Any CPU
|
|
||||||
{BA96A12C-4EE3-46C4-BB3F-F811B554CD01}.AppStore|iPhoneSimulator.Build.0 = Release|Any CPU
|
|
||||||
{BA96A12C-4EE3-46C4-BB3F-F811B554CD01}.AppStore|x64.ActiveCfg = Release|Any CPU
|
|
||||||
{BA96A12C-4EE3-46C4-BB3F-F811B554CD01}.AppStore|x64.Build.0 = Release|Any CPU
|
|
||||||
{BA96A12C-4EE3-46C4-BB3F-F811B554CD01}.AppStore|x86.ActiveCfg = Release|Any CPU
|
|
||||||
{BA96A12C-4EE3-46C4-BB3F-F811B554CD01}.AppStore|x86.Build.0 = Release|Any CPU
|
|
||||||
{BA96A12C-4EE3-46C4-BB3F-F811B554CD01}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{BA96A12C-4EE3-46C4-BB3F-F811B554CD01}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{BA96A12C-4EE3-46C4-BB3F-F811B554CD01}.Debug|ARM.ActiveCfg = Debug|Any CPU
|
|
||||||
{BA96A12C-4EE3-46C4-BB3F-F811B554CD01}.Debug|ARM.Build.0 = Debug|Any CPU
|
|
||||||
{BA96A12C-4EE3-46C4-BB3F-F811B554CD01}.Debug|iPhone.ActiveCfg = Debug|Any CPU
|
|
||||||
{BA96A12C-4EE3-46C4-BB3F-F811B554CD01}.Debug|iPhone.Build.0 = Debug|Any CPU
|
|
||||||
{BA96A12C-4EE3-46C4-BB3F-F811B554CD01}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
|
|
||||||
{BA96A12C-4EE3-46C4-BB3F-F811B554CD01}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
|
|
||||||
{BA96A12C-4EE3-46C4-BB3F-F811B554CD01}.Debug|x64.ActiveCfg = Debug|Any CPU
|
|
||||||
{BA96A12C-4EE3-46C4-BB3F-F811B554CD01}.Debug|x64.Build.0 = Debug|Any CPU
|
|
||||||
{BA96A12C-4EE3-46C4-BB3F-F811B554CD01}.Debug|x86.ActiveCfg = Debug|Any CPU
|
|
||||||
{BA96A12C-4EE3-46C4-BB3F-F811B554CD01}.Debug|x86.Build.0 = Debug|Any CPU
|
|
||||||
{BA96A12C-4EE3-46C4-BB3F-F811B554CD01}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{BA96A12C-4EE3-46C4-BB3F-F811B554CD01}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{BA96A12C-4EE3-46C4-BB3F-F811B554CD01}.Release|ARM.ActiveCfg = Release|Any CPU
|
|
||||||
{BA96A12C-4EE3-46C4-BB3F-F811B554CD01}.Release|ARM.Build.0 = Release|Any CPU
|
|
||||||
{BA96A12C-4EE3-46C4-BB3F-F811B554CD01}.Release|iPhone.ActiveCfg = Release|Any CPU
|
|
||||||
{BA96A12C-4EE3-46C4-BB3F-F811B554CD01}.Release|iPhone.Build.0 = Release|Any CPU
|
|
||||||
{BA96A12C-4EE3-46C4-BB3F-F811B554CD01}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
|
|
||||||
{BA96A12C-4EE3-46C4-BB3F-F811B554CD01}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
|
|
||||||
{BA96A12C-4EE3-46C4-BB3F-F811B554CD01}.Release|x64.ActiveCfg = Release|Any CPU
|
|
||||||
{BA96A12C-4EE3-46C4-BB3F-F811B554CD01}.Release|x64.Build.0 = Release|Any CPU
|
|
||||||
{BA96A12C-4EE3-46C4-BB3F-F811B554CD01}.Release|x86.ActiveCfg = Release|Any CPU
|
|
||||||
{BA96A12C-4EE3-46C4-BB3F-F811B554CD01}.Release|x86.Build.0 = Release|Any CPU
|
|
||||||
{62DBB163-9CA9-4818-B48B-13233DF37C24}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU
|
{62DBB163-9CA9-4818-B48B-13233DF37C24}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{62DBB163-9CA9-4818-B48B-13233DF37C24}.Ad-Hoc|Any CPU.Build.0 = Release|Any CPU
|
{62DBB163-9CA9-4818-B48B-13233DF37C24}.Ad-Hoc|Any CPU.Build.0 = Release|Any CPU
|
||||||
{62DBB163-9CA9-4818-B48B-13233DF37C24}.Ad-Hoc|Any CPU.Deploy.0 = Release|Any CPU
|
{62DBB163-9CA9-4818-B48B-13233DF37C24}.Ad-Hoc|Any CPU.Deploy.0 = Release|Any CPU
|
||||||
@ -283,54 +235,6 @@ Global
|
|||||||
{C3C1E2CF-B1F7-4654-BBDC-50143DB22E0B}.Release|x86.ActiveCfg = Release|x86
|
{C3C1E2CF-B1F7-4654-BBDC-50143DB22E0B}.Release|x86.ActiveCfg = Release|x86
|
||||||
{C3C1E2CF-B1F7-4654-BBDC-50143DB22E0B}.Release|x86.Build.0 = Release|x86
|
{C3C1E2CF-B1F7-4654-BBDC-50143DB22E0B}.Release|x86.Build.0 = Release|x86
|
||||||
{C3C1E2CF-B1F7-4654-BBDC-50143DB22E0B}.Release|x86.Deploy.0 = Release|x86
|
{C3C1E2CF-B1F7-4654-BBDC-50143DB22E0B}.Release|x86.Deploy.0 = Release|x86
|
||||||
{6E4285E7-7611-4440-A1B5-3513EBB13807}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{6E4285E7-7611-4440-A1B5-3513EBB13807}.Ad-Hoc|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{6E4285E7-7611-4440-A1B5-3513EBB13807}.Ad-Hoc|ARM.ActiveCfg = Release|Any CPU
|
|
||||||
{6E4285E7-7611-4440-A1B5-3513EBB13807}.Ad-Hoc|ARM.Build.0 = Release|Any CPU
|
|
||||||
{6E4285E7-7611-4440-A1B5-3513EBB13807}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU
|
|
||||||
{6E4285E7-7611-4440-A1B5-3513EBB13807}.Ad-Hoc|iPhone.Build.0 = Release|Any CPU
|
|
||||||
{6E4285E7-7611-4440-A1B5-3513EBB13807}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|Any CPU
|
|
||||||
{6E4285E7-7611-4440-A1B5-3513EBB13807}.Ad-Hoc|iPhoneSimulator.Build.0 = Release|Any CPU
|
|
||||||
{6E4285E7-7611-4440-A1B5-3513EBB13807}.Ad-Hoc|x64.ActiveCfg = Release|Any CPU
|
|
||||||
{6E4285E7-7611-4440-A1B5-3513EBB13807}.Ad-Hoc|x64.Build.0 = Release|Any CPU
|
|
||||||
{6E4285E7-7611-4440-A1B5-3513EBB13807}.Ad-Hoc|x86.ActiveCfg = Release|Any CPU
|
|
||||||
{6E4285E7-7611-4440-A1B5-3513EBB13807}.Ad-Hoc|x86.Build.0 = Release|Any CPU
|
|
||||||
{6E4285E7-7611-4440-A1B5-3513EBB13807}.AppStore|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{6E4285E7-7611-4440-A1B5-3513EBB13807}.AppStore|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{6E4285E7-7611-4440-A1B5-3513EBB13807}.AppStore|ARM.ActiveCfg = Release|Any CPU
|
|
||||||
{6E4285E7-7611-4440-A1B5-3513EBB13807}.AppStore|ARM.Build.0 = Release|Any CPU
|
|
||||||
{6E4285E7-7611-4440-A1B5-3513EBB13807}.AppStore|iPhone.ActiveCfg = Release|Any CPU
|
|
||||||
{6E4285E7-7611-4440-A1B5-3513EBB13807}.AppStore|iPhone.Build.0 = Release|Any CPU
|
|
||||||
{6E4285E7-7611-4440-A1B5-3513EBB13807}.AppStore|iPhoneSimulator.ActiveCfg = Release|Any CPU
|
|
||||||
{6E4285E7-7611-4440-A1B5-3513EBB13807}.AppStore|iPhoneSimulator.Build.0 = Release|Any CPU
|
|
||||||
{6E4285E7-7611-4440-A1B5-3513EBB13807}.AppStore|x64.ActiveCfg = Release|Any CPU
|
|
||||||
{6E4285E7-7611-4440-A1B5-3513EBB13807}.AppStore|x64.Build.0 = Release|Any CPU
|
|
||||||
{6E4285E7-7611-4440-A1B5-3513EBB13807}.AppStore|x86.ActiveCfg = Release|Any CPU
|
|
||||||
{6E4285E7-7611-4440-A1B5-3513EBB13807}.AppStore|x86.Build.0 = Release|Any CPU
|
|
||||||
{6E4285E7-7611-4440-A1B5-3513EBB13807}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{6E4285E7-7611-4440-A1B5-3513EBB13807}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{6E4285E7-7611-4440-A1B5-3513EBB13807}.Debug|ARM.ActiveCfg = Debug|Any CPU
|
|
||||||
{6E4285E7-7611-4440-A1B5-3513EBB13807}.Debug|ARM.Build.0 = Debug|Any CPU
|
|
||||||
{6E4285E7-7611-4440-A1B5-3513EBB13807}.Debug|iPhone.ActiveCfg = Debug|Any CPU
|
|
||||||
{6E4285E7-7611-4440-A1B5-3513EBB13807}.Debug|iPhone.Build.0 = Debug|Any CPU
|
|
||||||
{6E4285E7-7611-4440-A1B5-3513EBB13807}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
|
|
||||||
{6E4285E7-7611-4440-A1B5-3513EBB13807}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
|
|
||||||
{6E4285E7-7611-4440-A1B5-3513EBB13807}.Debug|x64.ActiveCfg = Debug|Any CPU
|
|
||||||
{6E4285E7-7611-4440-A1B5-3513EBB13807}.Debug|x64.Build.0 = Debug|Any CPU
|
|
||||||
{6E4285E7-7611-4440-A1B5-3513EBB13807}.Debug|x86.ActiveCfg = Debug|Any CPU
|
|
||||||
{6E4285E7-7611-4440-A1B5-3513EBB13807}.Debug|x86.Build.0 = Debug|Any CPU
|
|
||||||
{6E4285E7-7611-4440-A1B5-3513EBB13807}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{6E4285E7-7611-4440-A1B5-3513EBB13807}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{6E4285E7-7611-4440-A1B5-3513EBB13807}.Release|ARM.ActiveCfg = Release|Any CPU
|
|
||||||
{6E4285E7-7611-4440-A1B5-3513EBB13807}.Release|ARM.Build.0 = Release|Any CPU
|
|
||||||
{6E4285E7-7611-4440-A1B5-3513EBB13807}.Release|iPhone.ActiveCfg = Release|Any CPU
|
|
||||||
{6E4285E7-7611-4440-A1B5-3513EBB13807}.Release|iPhone.Build.0 = Release|Any CPU
|
|
||||||
{6E4285E7-7611-4440-A1B5-3513EBB13807}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
|
|
||||||
{6E4285E7-7611-4440-A1B5-3513EBB13807}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
|
|
||||||
{6E4285E7-7611-4440-A1B5-3513EBB13807}.Release|x64.ActiveCfg = Release|Any CPU
|
|
||||||
{6E4285E7-7611-4440-A1B5-3513EBB13807}.Release|x64.Build.0 = Release|Any CPU
|
|
||||||
{6E4285E7-7611-4440-A1B5-3513EBB13807}.Release|x86.ActiveCfg = Release|Any CPU
|
|
||||||
{6E4285E7-7611-4440-A1B5-3513EBB13807}.Release|x86.Build.0 = Release|Any CPU
|
|
||||||
{A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU
|
{A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Ad-Hoc|Any CPU.Build.0 = Release|Any CPU
|
{A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Ad-Hoc|Any CPU.Build.0 = Release|Any CPU
|
||||||
{A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Ad-Hoc|Any CPU.Deploy.0 = Release|Any CPU
|
{A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Ad-Hoc|Any CPU.Deploy.0 = Release|Any CPU
|
||||||
@ -500,23 +404,119 @@ Global
|
|||||||
{A7337243-33B8-463A-87AD-944B75EFD820}.Release|x86.ActiveCfg = Release|x86
|
{A7337243-33B8-463A-87AD-944B75EFD820}.Release|x86.ActiveCfg = Release|x86
|
||||||
{A7337243-33B8-463A-87AD-944B75EFD820}.Release|x86.Build.0 = Release|x86
|
{A7337243-33B8-463A-87AD-944B75EFD820}.Release|x86.Build.0 = Release|x86
|
||||||
{A7337243-33B8-463A-87AD-944B75EFD820}.Release|x86.Deploy.0 = Release|x86
|
{A7337243-33B8-463A-87AD-944B75EFD820}.Release|x86.Deploy.0 = Release|x86
|
||||||
|
{FDD910BC-DF0F-483D-B7D5-C7D831855172}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{FDD910BC-DF0F-483D-B7D5-C7D831855172}.Ad-Hoc|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{FDD910BC-DF0F-483D-B7D5-C7D831855172}.Ad-Hoc|ARM.ActiveCfg = Release|Any CPU
|
||||||
|
{FDD910BC-DF0F-483D-B7D5-C7D831855172}.Ad-Hoc|ARM.Build.0 = Release|Any CPU
|
||||||
|
{FDD910BC-DF0F-483D-B7D5-C7D831855172}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU
|
||||||
|
{FDD910BC-DF0F-483D-B7D5-C7D831855172}.Ad-Hoc|iPhone.Build.0 = Release|Any CPU
|
||||||
|
{FDD910BC-DF0F-483D-B7D5-C7D831855172}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|Any CPU
|
||||||
|
{FDD910BC-DF0F-483D-B7D5-C7D831855172}.Ad-Hoc|iPhoneSimulator.Build.0 = Release|Any CPU
|
||||||
|
{FDD910BC-DF0F-483D-B7D5-C7D831855172}.Ad-Hoc|x64.ActiveCfg = Release|Any CPU
|
||||||
|
{FDD910BC-DF0F-483D-B7D5-C7D831855172}.Ad-Hoc|x64.Build.0 = Release|Any CPU
|
||||||
|
{FDD910BC-DF0F-483D-B7D5-C7D831855172}.Ad-Hoc|x86.ActiveCfg = Release|Any CPU
|
||||||
|
{FDD910BC-DF0F-483D-B7D5-C7D831855172}.Ad-Hoc|x86.Build.0 = Release|Any CPU
|
||||||
|
{FDD910BC-DF0F-483D-B7D5-C7D831855172}.AppStore|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{FDD910BC-DF0F-483D-B7D5-C7D831855172}.AppStore|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{FDD910BC-DF0F-483D-B7D5-C7D831855172}.AppStore|ARM.ActiveCfg = Release|Any CPU
|
||||||
|
{FDD910BC-DF0F-483D-B7D5-C7D831855172}.AppStore|ARM.Build.0 = Release|Any CPU
|
||||||
|
{FDD910BC-DF0F-483D-B7D5-C7D831855172}.AppStore|iPhone.ActiveCfg = Release|Any CPU
|
||||||
|
{FDD910BC-DF0F-483D-B7D5-C7D831855172}.AppStore|iPhone.Build.0 = Release|Any CPU
|
||||||
|
{FDD910BC-DF0F-483D-B7D5-C7D831855172}.AppStore|iPhoneSimulator.ActiveCfg = Release|Any CPU
|
||||||
|
{FDD910BC-DF0F-483D-B7D5-C7D831855172}.AppStore|iPhoneSimulator.Build.0 = Release|Any CPU
|
||||||
|
{FDD910BC-DF0F-483D-B7D5-C7D831855172}.AppStore|x64.ActiveCfg = Release|Any CPU
|
||||||
|
{FDD910BC-DF0F-483D-B7D5-C7D831855172}.AppStore|x64.Build.0 = Release|Any CPU
|
||||||
|
{FDD910BC-DF0F-483D-B7D5-C7D831855172}.AppStore|x86.ActiveCfg = Release|Any CPU
|
||||||
|
{FDD910BC-DF0F-483D-B7D5-C7D831855172}.AppStore|x86.Build.0 = Release|Any CPU
|
||||||
|
{FDD910BC-DF0F-483D-B7D5-C7D831855172}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{FDD910BC-DF0F-483D-B7D5-C7D831855172}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{FDD910BC-DF0F-483D-B7D5-C7D831855172}.Debug|ARM.ActiveCfg = Debug|Any CPU
|
||||||
|
{FDD910BC-DF0F-483D-B7D5-C7D831855172}.Debug|ARM.Build.0 = Debug|Any CPU
|
||||||
|
{FDD910BC-DF0F-483D-B7D5-C7D831855172}.Debug|iPhone.ActiveCfg = Debug|Any CPU
|
||||||
|
{FDD910BC-DF0F-483D-B7D5-C7D831855172}.Debug|iPhone.Build.0 = Debug|Any CPU
|
||||||
|
{FDD910BC-DF0F-483D-B7D5-C7D831855172}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
|
||||||
|
{FDD910BC-DF0F-483D-B7D5-C7D831855172}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
|
||||||
|
{FDD910BC-DF0F-483D-B7D5-C7D831855172}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||||
|
{FDD910BC-DF0F-483D-B7D5-C7D831855172}.Debug|x64.Build.0 = Debug|Any CPU
|
||||||
|
{FDD910BC-DF0F-483D-B7D5-C7D831855172}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||||
|
{FDD910BC-DF0F-483D-B7D5-C7D831855172}.Debug|x86.Build.0 = Debug|Any CPU
|
||||||
|
{FDD910BC-DF0F-483D-B7D5-C7D831855172}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{FDD910BC-DF0F-483D-B7D5-C7D831855172}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{FDD910BC-DF0F-483D-B7D5-C7D831855172}.Release|ARM.ActiveCfg = Release|Any CPU
|
||||||
|
{FDD910BC-DF0F-483D-B7D5-C7D831855172}.Release|ARM.Build.0 = Release|Any CPU
|
||||||
|
{FDD910BC-DF0F-483D-B7D5-C7D831855172}.Release|iPhone.ActiveCfg = Release|Any CPU
|
||||||
|
{FDD910BC-DF0F-483D-B7D5-C7D831855172}.Release|iPhone.Build.0 = Release|Any CPU
|
||||||
|
{FDD910BC-DF0F-483D-B7D5-C7D831855172}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
|
||||||
|
{FDD910BC-DF0F-483D-B7D5-C7D831855172}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
|
||||||
|
{FDD910BC-DF0F-483D-B7D5-C7D831855172}.Release|x64.ActiveCfg = Release|Any CPU
|
||||||
|
{FDD910BC-DF0F-483D-B7D5-C7D831855172}.Release|x64.Build.0 = Release|Any CPU
|
||||||
|
{FDD910BC-DF0F-483D-B7D5-C7D831855172}.Release|x86.ActiveCfg = Release|Any CPU
|
||||||
|
{FDD910BC-DF0F-483D-B7D5-C7D831855172}.Release|x86.Build.0 = Release|Any CPU
|
||||||
|
{76C5F2A7-6CD5-49EA-9F33-EC44DE6539C7}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{76C5F2A7-6CD5-49EA-9F33-EC44DE6539C7}.Ad-Hoc|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{76C5F2A7-6CD5-49EA-9F33-EC44DE6539C7}.Ad-Hoc|ARM.ActiveCfg = Release|Any CPU
|
||||||
|
{76C5F2A7-6CD5-49EA-9F33-EC44DE6539C7}.Ad-Hoc|ARM.Build.0 = Release|Any CPU
|
||||||
|
{76C5F2A7-6CD5-49EA-9F33-EC44DE6539C7}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU
|
||||||
|
{76C5F2A7-6CD5-49EA-9F33-EC44DE6539C7}.Ad-Hoc|iPhone.Build.0 = Release|Any CPU
|
||||||
|
{76C5F2A7-6CD5-49EA-9F33-EC44DE6539C7}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|Any CPU
|
||||||
|
{76C5F2A7-6CD5-49EA-9F33-EC44DE6539C7}.Ad-Hoc|iPhoneSimulator.Build.0 = Release|Any CPU
|
||||||
|
{76C5F2A7-6CD5-49EA-9F33-EC44DE6539C7}.Ad-Hoc|x64.ActiveCfg = Release|Any CPU
|
||||||
|
{76C5F2A7-6CD5-49EA-9F33-EC44DE6539C7}.Ad-Hoc|x64.Build.0 = Release|Any CPU
|
||||||
|
{76C5F2A7-6CD5-49EA-9F33-EC44DE6539C7}.Ad-Hoc|x86.ActiveCfg = Release|Any CPU
|
||||||
|
{76C5F2A7-6CD5-49EA-9F33-EC44DE6539C7}.Ad-Hoc|x86.Build.0 = Release|Any CPU
|
||||||
|
{76C5F2A7-6CD5-49EA-9F33-EC44DE6539C7}.AppStore|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{76C5F2A7-6CD5-49EA-9F33-EC44DE6539C7}.AppStore|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{76C5F2A7-6CD5-49EA-9F33-EC44DE6539C7}.AppStore|ARM.ActiveCfg = Release|Any CPU
|
||||||
|
{76C5F2A7-6CD5-49EA-9F33-EC44DE6539C7}.AppStore|ARM.Build.0 = Release|Any CPU
|
||||||
|
{76C5F2A7-6CD5-49EA-9F33-EC44DE6539C7}.AppStore|iPhone.ActiveCfg = Release|Any CPU
|
||||||
|
{76C5F2A7-6CD5-49EA-9F33-EC44DE6539C7}.AppStore|iPhone.Build.0 = Release|Any CPU
|
||||||
|
{76C5F2A7-6CD5-49EA-9F33-EC44DE6539C7}.AppStore|iPhoneSimulator.ActiveCfg = Release|Any CPU
|
||||||
|
{76C5F2A7-6CD5-49EA-9F33-EC44DE6539C7}.AppStore|iPhoneSimulator.Build.0 = Release|Any CPU
|
||||||
|
{76C5F2A7-6CD5-49EA-9F33-EC44DE6539C7}.AppStore|x64.ActiveCfg = Release|Any CPU
|
||||||
|
{76C5F2A7-6CD5-49EA-9F33-EC44DE6539C7}.AppStore|x64.Build.0 = Release|Any CPU
|
||||||
|
{76C5F2A7-6CD5-49EA-9F33-EC44DE6539C7}.AppStore|x86.ActiveCfg = Release|Any CPU
|
||||||
|
{76C5F2A7-6CD5-49EA-9F33-EC44DE6539C7}.AppStore|x86.Build.0 = Release|Any CPU
|
||||||
|
{76C5F2A7-6CD5-49EA-9F33-EC44DE6539C7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{76C5F2A7-6CD5-49EA-9F33-EC44DE6539C7}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{76C5F2A7-6CD5-49EA-9F33-EC44DE6539C7}.Debug|ARM.ActiveCfg = Debug|Any CPU
|
||||||
|
{76C5F2A7-6CD5-49EA-9F33-EC44DE6539C7}.Debug|ARM.Build.0 = Debug|Any CPU
|
||||||
|
{76C5F2A7-6CD5-49EA-9F33-EC44DE6539C7}.Debug|iPhone.ActiveCfg = Debug|Any CPU
|
||||||
|
{76C5F2A7-6CD5-49EA-9F33-EC44DE6539C7}.Debug|iPhone.Build.0 = Debug|Any CPU
|
||||||
|
{76C5F2A7-6CD5-49EA-9F33-EC44DE6539C7}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
|
||||||
|
{76C5F2A7-6CD5-49EA-9F33-EC44DE6539C7}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
|
||||||
|
{76C5F2A7-6CD5-49EA-9F33-EC44DE6539C7}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||||
|
{76C5F2A7-6CD5-49EA-9F33-EC44DE6539C7}.Debug|x64.Build.0 = Debug|Any CPU
|
||||||
|
{76C5F2A7-6CD5-49EA-9F33-EC44DE6539C7}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||||
|
{76C5F2A7-6CD5-49EA-9F33-EC44DE6539C7}.Debug|x86.Build.0 = Debug|Any CPU
|
||||||
|
{76C5F2A7-6CD5-49EA-9F33-EC44DE6539C7}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{76C5F2A7-6CD5-49EA-9F33-EC44DE6539C7}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{76C5F2A7-6CD5-49EA-9F33-EC44DE6539C7}.Release|ARM.ActiveCfg = Release|Any CPU
|
||||||
|
{76C5F2A7-6CD5-49EA-9F33-EC44DE6539C7}.Release|ARM.Build.0 = Release|Any CPU
|
||||||
|
{76C5F2A7-6CD5-49EA-9F33-EC44DE6539C7}.Release|iPhone.ActiveCfg = Release|Any CPU
|
||||||
|
{76C5F2A7-6CD5-49EA-9F33-EC44DE6539C7}.Release|iPhone.Build.0 = Release|Any CPU
|
||||||
|
{76C5F2A7-6CD5-49EA-9F33-EC44DE6539C7}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
|
||||||
|
{76C5F2A7-6CD5-49EA-9F33-EC44DE6539C7}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
|
||||||
|
{76C5F2A7-6CD5-49EA-9F33-EC44DE6539C7}.Release|x64.ActiveCfg = Release|Any CPU
|
||||||
|
{76C5F2A7-6CD5-49EA-9F33-EC44DE6539C7}.Release|x64.Build.0 = Release|Any CPU
|
||||||
|
{76C5F2A7-6CD5-49EA-9F33-EC44DE6539C7}.Release|x86.ActiveCfg = Release|Any CPU
|
||||||
|
{76C5F2A7-6CD5-49EA-9F33-EC44DE6539C7}.Release|x86.Build.0 = Release|Any CPU
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
HideSolutionNode = FALSE
|
HideSolutionNode = FALSE
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(NestedProjects) = preSolution
|
GlobalSection(NestedProjects) = preSolution
|
||||||
{F61357CE-1CC2-410E-8776-B16EEBC98EB8} = {932D8224-11F6-4D07-B109-DA28AD288A63}
|
{F61357CE-1CC2-410E-8776-B16EEBC98EB8} = {932D8224-11F6-4D07-B109-DA28AD288A63}
|
||||||
{BA96A12C-4EE3-46C4-BB3F-F811B554CD01} = {778289CA-31F7-4464-8C2A-612EE846F8A7}
|
|
||||||
{62DBB163-9CA9-4818-B48B-13233DF37C24} = {9CC7814B-72A6-465B-A61C-57B512DEE303}
|
{62DBB163-9CA9-4818-B48B-13233DF37C24} = {9CC7814B-72A6-465B-A61C-57B512DEE303}
|
||||||
{6EEB23DC-7063-4444-9AF8-90DF24F549C0} = {9CC7814B-72A6-465B-A61C-57B512DEE303}
|
{6EEB23DC-7063-4444-9AF8-90DF24F549C0} = {9CC7814B-72A6-465B-A61C-57B512DEE303}
|
||||||
{C3C1E2CF-B1F7-4654-BBDC-50143DB22E0B} = {9CC7814B-72A6-465B-A61C-57B512DEE303}
|
{C3C1E2CF-B1F7-4654-BBDC-50143DB22E0B} = {9CC7814B-72A6-465B-A61C-57B512DEE303}
|
||||||
{778289CA-31F7-4464-8C2A-612EE846F8A7} = {F61357CE-1CC2-410E-8776-B16EEBC98EB8}
|
{778289CA-31F7-4464-8C2A-612EE846F8A7} = {F61357CE-1CC2-410E-8776-B16EEBC98EB8}
|
||||||
{9CC7814B-72A6-465B-A61C-57B512DEE303} = {F61357CE-1CC2-410E-8776-B16EEBC98EB8}
|
{9CC7814B-72A6-465B-A61C-57B512DEE303} = {F61357CE-1CC2-410E-8776-B16EEBC98EB8}
|
||||||
{B7B1D395-4E06-4036-BE86-C216756B9367} = {A857AD10-40FF-4303-BEC2-FF1C58D5735E}
|
{B7B1D395-4E06-4036-BE86-C216756B9367} = {A857AD10-40FF-4303-BEC2-FF1C58D5735E}
|
||||||
{6E4285E7-7611-4440-A1B5-3513EBB13807} = {B7B1D395-4E06-4036-BE86-C216756B9367}
|
|
||||||
{A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1} = {B7B1D395-4E06-4036-BE86-C216756B9367}
|
{A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1} = {B7B1D395-4E06-4036-BE86-C216756B9367}
|
||||||
{B68C2B56-7581-46AE-B55D-D25DDFD3BFE3} = {B7B1D395-4E06-4036-BE86-C216756B9367}
|
{B68C2B56-7581-46AE-B55D-D25DDFD3BFE3} = {B7B1D395-4E06-4036-BE86-C216756B9367}
|
||||||
{A7337243-33B8-463A-87AD-944B75EFD820} = {B7B1D395-4E06-4036-BE86-C216756B9367}
|
{A7337243-33B8-463A-87AD-944B75EFD820} = {B7B1D395-4E06-4036-BE86-C216756B9367}
|
||||||
|
{FDD910BC-DF0F-483D-B7D5-C7D831855172} = {B7B1D395-4E06-4036-BE86-C216756B9367}
|
||||||
|
{76C5F2A7-6CD5-49EA-9F33-EC44DE6539C7} = {778289CA-31F7-4464-8C2A-612EE846F8A7}
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||||
SolutionGuid = {8A9E878A-C296-4615-97AB-7A4505148872}
|
SolutionGuid = {8A9E878A-C296-4615-97AB-7A4505148872}
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||||
# Visual Studio 15
|
# Visual Studio 15
|
||||||
VisualStudioVersion = 15.0.27004.2002
|
VisualStudioVersion = 15.0.27130.2024
|
||||||
MinimumVisualStudioVersion = 10.0.40219.1
|
MinimumVisualStudioVersion = 10.0.40219.1
|
||||||
Project("{E53339B2-1760-4266-BCC7-CA923CBCF16C}") = "docker-compose", "docker-compose.dcproj", "{FEA0C318-FFED-4D39-8781-265718CA43DD}"
|
Project("{E53339B2-1760-4266-BCC7-CA923CBCF16C}") = "docker-compose", "docker-compose.dcproj", "{FEA0C318-FFED-4D39-8781-265718CA43DD}"
|
||||||
EndProject
|
EndProject
|
||||||
@ -83,10 +83,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Location", "Location", "{41
|
|||||||
EndProject
|
EndProject
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Locations.API", "src\Services\Location\Locations.API\Locations.API.csproj", "{E7581357-FC34-474C-B8F5-307EE3CE05EF}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Locations.API", "src\Services\Location\Locations.API\Locations.API.csproj", "{E7581357-FC34-474C-B8F5-307EE3CE05EF}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "DataProtection", "DataProtection", "{88B22DBB-AA8F-4290-A454-2C109352C345}"
|
|
||||||
EndProject
|
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DataProtection", "src\BuildingBlocks\DataProtection\DataProtection\DataProtection.csproj", "{23A33F9B-7672-426D-ACF9-FF8436ADC81A}"
|
|
||||||
EndProject
|
|
||||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Marketing", "Marketing", "{A5260DE0-1FDD-467E-9CC1-A028AB081CEE}"
|
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Marketing", "Marketing", "{A5260DE0-1FDD-467E-9CC1-A028AB081CEE}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Marketing.API", "src\Services\Marketing\Marketing.API\Marketing.API.csproj", "{DF395F85-B010-465D-857A-7EBCC512C0C2}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Marketing.API", "src\Services\Marketing\Marketing.API\Marketing.API.csproj", "{DF395F85-B010-465D-857A-7EBCC512C0C2}"
|
||||||
@ -101,6 +97,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "WebHost", "WebHost", "{1815
|
|||||||
EndProject
|
EndProject
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WebHost.Customization", "src\BuildingBlocks\WebHostCustomization\WebHost.Customization\WebHost.Customization.csproj", "{15F4B3AA-89B6-4A0D-9051-414305974781}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WebHost.Customization", "src\BuildingBlocks\WebHostCustomization\WebHost.Customization\WebHost.Customization.csproj", "{15F4B3AA-89B6-4A0D-9051-414305974781}"
|
||||||
EndProject
|
EndProject
|
||||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ordering.BackgroundTasks", "src\Services\Ordering\Ordering.BackgroundTasks\Ordering.BackgroundTasks.csproj", "{2FF56999-0266-48B2-ACC1-FEBC482A5105}"
|
||||||
|
EndProject
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
Ad-Hoc|Any CPU = Ad-Hoc|Any CPU
|
Ad-Hoc|Any CPU = Ad-Hoc|Any CPU
|
||||||
@ -1075,54 +1073,6 @@ Global
|
|||||||
{E7581357-FC34-474C-B8F5-307EE3CE05EF}.Release|x64.Build.0 = Release|Any CPU
|
{E7581357-FC34-474C-B8F5-307EE3CE05EF}.Release|x64.Build.0 = Release|Any CPU
|
||||||
{E7581357-FC34-474C-B8F5-307EE3CE05EF}.Release|x86.ActiveCfg = Release|Any CPU
|
{E7581357-FC34-474C-B8F5-307EE3CE05EF}.Release|x86.ActiveCfg = Release|Any CPU
|
||||||
{E7581357-FC34-474C-B8F5-307EE3CE05EF}.Release|x86.Build.0 = Release|Any CPU
|
{E7581357-FC34-474C-B8F5-307EE3CE05EF}.Release|x86.Build.0 = Release|Any CPU
|
||||||
{23A33F9B-7672-426D-ACF9-FF8436ADC81A}.Ad-Hoc|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{23A33F9B-7672-426D-ACF9-FF8436ADC81A}.Ad-Hoc|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{23A33F9B-7672-426D-ACF9-FF8436ADC81A}.Ad-Hoc|ARM.ActiveCfg = Debug|Any CPU
|
|
||||||
{23A33F9B-7672-426D-ACF9-FF8436ADC81A}.Ad-Hoc|ARM.Build.0 = Debug|Any CPU
|
|
||||||
{23A33F9B-7672-426D-ACF9-FF8436ADC81A}.Ad-Hoc|iPhone.ActiveCfg = Debug|Any CPU
|
|
||||||
{23A33F9B-7672-426D-ACF9-FF8436ADC81A}.Ad-Hoc|iPhone.Build.0 = Debug|Any CPU
|
|
||||||
{23A33F9B-7672-426D-ACF9-FF8436ADC81A}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Debug|Any CPU
|
|
||||||
{23A33F9B-7672-426D-ACF9-FF8436ADC81A}.Ad-Hoc|iPhoneSimulator.Build.0 = Debug|Any CPU
|
|
||||||
{23A33F9B-7672-426D-ACF9-FF8436ADC81A}.Ad-Hoc|x64.ActiveCfg = Debug|Any CPU
|
|
||||||
{23A33F9B-7672-426D-ACF9-FF8436ADC81A}.Ad-Hoc|x64.Build.0 = Debug|Any CPU
|
|
||||||
{23A33F9B-7672-426D-ACF9-FF8436ADC81A}.Ad-Hoc|x86.ActiveCfg = Debug|Any CPU
|
|
||||||
{23A33F9B-7672-426D-ACF9-FF8436ADC81A}.Ad-Hoc|x86.Build.0 = Debug|Any CPU
|
|
||||||
{23A33F9B-7672-426D-ACF9-FF8436ADC81A}.AppStore|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{23A33F9B-7672-426D-ACF9-FF8436ADC81A}.AppStore|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{23A33F9B-7672-426D-ACF9-FF8436ADC81A}.AppStore|ARM.ActiveCfg = Debug|Any CPU
|
|
||||||
{23A33F9B-7672-426D-ACF9-FF8436ADC81A}.AppStore|ARM.Build.0 = Debug|Any CPU
|
|
||||||
{23A33F9B-7672-426D-ACF9-FF8436ADC81A}.AppStore|iPhone.ActiveCfg = Debug|Any CPU
|
|
||||||
{23A33F9B-7672-426D-ACF9-FF8436ADC81A}.AppStore|iPhone.Build.0 = Debug|Any CPU
|
|
||||||
{23A33F9B-7672-426D-ACF9-FF8436ADC81A}.AppStore|iPhoneSimulator.ActiveCfg = Debug|Any CPU
|
|
||||||
{23A33F9B-7672-426D-ACF9-FF8436ADC81A}.AppStore|iPhoneSimulator.Build.0 = Debug|Any CPU
|
|
||||||
{23A33F9B-7672-426D-ACF9-FF8436ADC81A}.AppStore|x64.ActiveCfg = Debug|Any CPU
|
|
||||||
{23A33F9B-7672-426D-ACF9-FF8436ADC81A}.AppStore|x64.Build.0 = Debug|Any CPU
|
|
||||||
{23A33F9B-7672-426D-ACF9-FF8436ADC81A}.AppStore|x86.ActiveCfg = Debug|Any CPU
|
|
||||||
{23A33F9B-7672-426D-ACF9-FF8436ADC81A}.AppStore|x86.Build.0 = Debug|Any CPU
|
|
||||||
{23A33F9B-7672-426D-ACF9-FF8436ADC81A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{23A33F9B-7672-426D-ACF9-FF8436ADC81A}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{23A33F9B-7672-426D-ACF9-FF8436ADC81A}.Debug|ARM.ActiveCfg = Debug|Any CPU
|
|
||||||
{23A33F9B-7672-426D-ACF9-FF8436ADC81A}.Debug|ARM.Build.0 = Debug|Any CPU
|
|
||||||
{23A33F9B-7672-426D-ACF9-FF8436ADC81A}.Debug|iPhone.ActiveCfg = Debug|Any CPU
|
|
||||||
{23A33F9B-7672-426D-ACF9-FF8436ADC81A}.Debug|iPhone.Build.0 = Debug|Any CPU
|
|
||||||
{23A33F9B-7672-426D-ACF9-FF8436ADC81A}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
|
|
||||||
{23A33F9B-7672-426D-ACF9-FF8436ADC81A}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
|
|
||||||
{23A33F9B-7672-426D-ACF9-FF8436ADC81A}.Debug|x64.ActiveCfg = Debug|Any CPU
|
|
||||||
{23A33F9B-7672-426D-ACF9-FF8436ADC81A}.Debug|x64.Build.0 = Debug|Any CPU
|
|
||||||
{23A33F9B-7672-426D-ACF9-FF8436ADC81A}.Debug|x86.ActiveCfg = Debug|Any CPU
|
|
||||||
{23A33F9B-7672-426D-ACF9-FF8436ADC81A}.Debug|x86.Build.0 = Debug|Any CPU
|
|
||||||
{23A33F9B-7672-426D-ACF9-FF8436ADC81A}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{23A33F9B-7672-426D-ACF9-FF8436ADC81A}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{23A33F9B-7672-426D-ACF9-FF8436ADC81A}.Release|ARM.ActiveCfg = Release|Any CPU
|
|
||||||
{23A33F9B-7672-426D-ACF9-FF8436ADC81A}.Release|ARM.Build.0 = Release|Any CPU
|
|
||||||
{23A33F9B-7672-426D-ACF9-FF8436ADC81A}.Release|iPhone.ActiveCfg = Release|Any CPU
|
|
||||||
{23A33F9B-7672-426D-ACF9-FF8436ADC81A}.Release|iPhone.Build.0 = Release|Any CPU
|
|
||||||
{23A33F9B-7672-426D-ACF9-FF8436ADC81A}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
|
|
||||||
{23A33F9B-7672-426D-ACF9-FF8436ADC81A}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
|
|
||||||
{23A33F9B-7672-426D-ACF9-FF8436ADC81A}.Release|x64.ActiveCfg = Release|Any CPU
|
|
||||||
{23A33F9B-7672-426D-ACF9-FF8436ADC81A}.Release|x64.Build.0 = Release|Any CPU
|
|
||||||
{23A33F9B-7672-426D-ACF9-FF8436ADC81A}.Release|x86.ActiveCfg = Release|Any CPU
|
|
||||||
{23A33F9B-7672-426D-ACF9-FF8436ADC81A}.Release|x86.Build.0 = Release|Any CPU
|
|
||||||
{DF395F85-B010-465D-857A-7EBCC512C0C2}.Ad-Hoc|Any CPU.ActiveCfg = Debug|Any CPU
|
{DF395F85-B010-465D-857A-7EBCC512C0C2}.Ad-Hoc|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{DF395F85-B010-465D-857A-7EBCC512C0C2}.Ad-Hoc|Any CPU.Build.0 = Debug|Any CPU
|
{DF395F85-B010-465D-857A-7EBCC512C0C2}.Ad-Hoc|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{DF395F85-B010-465D-857A-7EBCC512C0C2}.Ad-Hoc|ARM.ActiveCfg = Debug|Any CPU
|
{DF395F85-B010-465D-857A-7EBCC512C0C2}.Ad-Hoc|ARM.ActiveCfg = Debug|Any CPU
|
||||||
@ -1363,6 +1313,54 @@ Global
|
|||||||
{15F4B3AA-89B6-4A0D-9051-414305974781}.Release|x64.Build.0 = Release|Any CPU
|
{15F4B3AA-89B6-4A0D-9051-414305974781}.Release|x64.Build.0 = Release|Any CPU
|
||||||
{15F4B3AA-89B6-4A0D-9051-414305974781}.Release|x86.ActiveCfg = Release|Any CPU
|
{15F4B3AA-89B6-4A0D-9051-414305974781}.Release|x86.ActiveCfg = Release|Any CPU
|
||||||
{15F4B3AA-89B6-4A0D-9051-414305974781}.Release|x86.Build.0 = Release|Any CPU
|
{15F4B3AA-89B6-4A0D-9051-414305974781}.Release|x86.Build.0 = Release|Any CPU
|
||||||
|
{2FF56999-0266-48B2-ACC1-FEBC482A5105}.Ad-Hoc|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{2FF56999-0266-48B2-ACC1-FEBC482A5105}.Ad-Hoc|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{2FF56999-0266-48B2-ACC1-FEBC482A5105}.Ad-Hoc|ARM.ActiveCfg = Debug|Any CPU
|
||||||
|
{2FF56999-0266-48B2-ACC1-FEBC482A5105}.Ad-Hoc|ARM.Build.0 = Debug|Any CPU
|
||||||
|
{2FF56999-0266-48B2-ACC1-FEBC482A5105}.Ad-Hoc|iPhone.ActiveCfg = Debug|Any CPU
|
||||||
|
{2FF56999-0266-48B2-ACC1-FEBC482A5105}.Ad-Hoc|iPhone.Build.0 = Debug|Any CPU
|
||||||
|
{2FF56999-0266-48B2-ACC1-FEBC482A5105}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Debug|Any CPU
|
||||||
|
{2FF56999-0266-48B2-ACC1-FEBC482A5105}.Ad-Hoc|iPhoneSimulator.Build.0 = Debug|Any CPU
|
||||||
|
{2FF56999-0266-48B2-ACC1-FEBC482A5105}.Ad-Hoc|x64.ActiveCfg = Debug|Any CPU
|
||||||
|
{2FF56999-0266-48B2-ACC1-FEBC482A5105}.Ad-Hoc|x64.Build.0 = Debug|Any CPU
|
||||||
|
{2FF56999-0266-48B2-ACC1-FEBC482A5105}.Ad-Hoc|x86.ActiveCfg = Debug|Any CPU
|
||||||
|
{2FF56999-0266-48B2-ACC1-FEBC482A5105}.Ad-Hoc|x86.Build.0 = Debug|Any CPU
|
||||||
|
{2FF56999-0266-48B2-ACC1-FEBC482A5105}.AppStore|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{2FF56999-0266-48B2-ACC1-FEBC482A5105}.AppStore|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{2FF56999-0266-48B2-ACC1-FEBC482A5105}.AppStore|ARM.ActiveCfg = Debug|Any CPU
|
||||||
|
{2FF56999-0266-48B2-ACC1-FEBC482A5105}.AppStore|ARM.Build.0 = Debug|Any CPU
|
||||||
|
{2FF56999-0266-48B2-ACC1-FEBC482A5105}.AppStore|iPhone.ActiveCfg = Debug|Any CPU
|
||||||
|
{2FF56999-0266-48B2-ACC1-FEBC482A5105}.AppStore|iPhone.Build.0 = Debug|Any CPU
|
||||||
|
{2FF56999-0266-48B2-ACC1-FEBC482A5105}.AppStore|iPhoneSimulator.ActiveCfg = Debug|Any CPU
|
||||||
|
{2FF56999-0266-48B2-ACC1-FEBC482A5105}.AppStore|iPhoneSimulator.Build.0 = Debug|Any CPU
|
||||||
|
{2FF56999-0266-48B2-ACC1-FEBC482A5105}.AppStore|x64.ActiveCfg = Debug|Any CPU
|
||||||
|
{2FF56999-0266-48B2-ACC1-FEBC482A5105}.AppStore|x64.Build.0 = Debug|Any CPU
|
||||||
|
{2FF56999-0266-48B2-ACC1-FEBC482A5105}.AppStore|x86.ActiveCfg = Debug|Any CPU
|
||||||
|
{2FF56999-0266-48B2-ACC1-FEBC482A5105}.AppStore|x86.Build.0 = Debug|Any CPU
|
||||||
|
{2FF56999-0266-48B2-ACC1-FEBC482A5105}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{2FF56999-0266-48B2-ACC1-FEBC482A5105}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{2FF56999-0266-48B2-ACC1-FEBC482A5105}.Debug|ARM.ActiveCfg = Debug|Any CPU
|
||||||
|
{2FF56999-0266-48B2-ACC1-FEBC482A5105}.Debug|ARM.Build.0 = Debug|Any CPU
|
||||||
|
{2FF56999-0266-48B2-ACC1-FEBC482A5105}.Debug|iPhone.ActiveCfg = Debug|Any CPU
|
||||||
|
{2FF56999-0266-48B2-ACC1-FEBC482A5105}.Debug|iPhone.Build.0 = Debug|Any CPU
|
||||||
|
{2FF56999-0266-48B2-ACC1-FEBC482A5105}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
|
||||||
|
{2FF56999-0266-48B2-ACC1-FEBC482A5105}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
|
||||||
|
{2FF56999-0266-48B2-ACC1-FEBC482A5105}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||||
|
{2FF56999-0266-48B2-ACC1-FEBC482A5105}.Debug|x64.Build.0 = Debug|Any CPU
|
||||||
|
{2FF56999-0266-48B2-ACC1-FEBC482A5105}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||||
|
{2FF56999-0266-48B2-ACC1-FEBC482A5105}.Debug|x86.Build.0 = Debug|Any CPU
|
||||||
|
{2FF56999-0266-48B2-ACC1-FEBC482A5105}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{2FF56999-0266-48B2-ACC1-FEBC482A5105}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{2FF56999-0266-48B2-ACC1-FEBC482A5105}.Release|ARM.ActiveCfg = Release|Any CPU
|
||||||
|
{2FF56999-0266-48B2-ACC1-FEBC482A5105}.Release|ARM.Build.0 = Release|Any CPU
|
||||||
|
{2FF56999-0266-48B2-ACC1-FEBC482A5105}.Release|iPhone.ActiveCfg = Release|Any CPU
|
||||||
|
{2FF56999-0266-48B2-ACC1-FEBC482A5105}.Release|iPhone.Build.0 = Release|Any CPU
|
||||||
|
{2FF56999-0266-48B2-ACC1-FEBC482A5105}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
|
||||||
|
{2FF56999-0266-48B2-ACC1-FEBC482A5105}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
|
||||||
|
{2FF56999-0266-48B2-ACC1-FEBC482A5105}.Release|x64.ActiveCfg = Release|Any CPU
|
||||||
|
{2FF56999-0266-48B2-ACC1-FEBC482A5105}.Release|x64.Build.0 = Release|Any CPU
|
||||||
|
{2FF56999-0266-48B2-ACC1-FEBC482A5105}.Release|x86.ActiveCfg = Release|Any CPU
|
||||||
|
{2FF56999-0266-48B2-ACC1-FEBC482A5105}.Release|x86.Build.0 = Release|Any CPU
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
HideSolutionNode = FALSE
|
HideSolutionNode = FALSE
|
||||||
@ -1402,8 +1400,6 @@ Global
|
|||||||
{4BD76717-3102-4969-8C2C-BAAA3F0263B6} = {A81ECBC2-6B00-4DCD-8388-469174033379}
|
{4BD76717-3102-4969-8C2C-BAAA3F0263B6} = {A81ECBC2-6B00-4DCD-8388-469174033379}
|
||||||
{41139F64-4046-4F16-96B7-D941D96FA9C6} = {91CF7717-08AB-4E65-B10E-0B426F01E2E8}
|
{41139F64-4046-4F16-96B7-D941D96FA9C6} = {91CF7717-08AB-4E65-B10E-0B426F01E2E8}
|
||||||
{E7581357-FC34-474C-B8F5-307EE3CE05EF} = {41139F64-4046-4F16-96B7-D941D96FA9C6}
|
{E7581357-FC34-474C-B8F5-307EE3CE05EF} = {41139F64-4046-4F16-96B7-D941D96FA9C6}
|
||||||
{88B22DBB-AA8F-4290-A454-2C109352C345} = {DB0EFB20-B024-4E5E-A75C-52143C131D25}
|
|
||||||
{23A33F9B-7672-426D-ACF9-FF8436ADC81A} = {88B22DBB-AA8F-4290-A454-2C109352C345}
|
|
||||||
{A5260DE0-1FDD-467E-9CC1-A028AB081CEE} = {91CF7717-08AB-4E65-B10E-0B426F01E2E8}
|
{A5260DE0-1FDD-467E-9CC1-A028AB081CEE} = {91CF7717-08AB-4E65-B10E-0B426F01E2E8}
|
||||||
{DF395F85-B010-465D-857A-7EBCC512C0C2} = {A5260DE0-1FDD-467E-9CC1-A028AB081CEE}
|
{DF395F85-B010-465D-857A-7EBCC512C0C2} = {A5260DE0-1FDD-467E-9CC1-A028AB081CEE}
|
||||||
{69AF10D3-AA76-4FF7-B187-EC7E8CC5F5B8} = {807BB76E-B2BB-47A2-A57B-3D1B20FF5E7F}
|
{69AF10D3-AA76-4FF7-B187-EC7E8CC5F5B8} = {807BB76E-B2BB-47A2-A57B-3D1B20FF5E7F}
|
||||||
@ -1411,6 +1407,7 @@ Global
|
|||||||
{969E793C-C413-490E-9C9D-B2B46DA5AF32} = {EF0337F2-ED00-4643-89FD-EE10863F1870}
|
{969E793C-C413-490E-9C9D-B2B46DA5AF32} = {EF0337F2-ED00-4643-89FD-EE10863F1870}
|
||||||
{1815B651-941C-466B-AE33-D1D7EEB8F77F} = {DB0EFB20-B024-4E5E-A75C-52143C131D25}
|
{1815B651-941C-466B-AE33-D1D7EEB8F77F} = {DB0EFB20-B024-4E5E-A75C-52143C131D25}
|
||||||
{15F4B3AA-89B6-4A0D-9051-414305974781} = {1815B651-941C-466B-AE33-D1D7EEB8F77F}
|
{15F4B3AA-89B6-4A0D-9051-414305974781} = {1815B651-941C-466B-AE33-D1D7EEB8F77F}
|
||||||
|
{2FF56999-0266-48B2-ACC1-FEBC482A5105} = {0BD0DB92-2D98-44D9-9AC0-C59186D59B0B}
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||||
SolutionGuid = {25728519-5F0F-4973-8A64-0A81EB4EA8D9}
|
SolutionGuid = {25728519-5F0F-4973-8A64-0A81EB4EA8D9}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"sdk": {
|
"sdk": {
|
||||||
"version":"2.0.2"
|
"version":"2.1.2"
|
||||||
}
|
}
|
||||||
}
|
}
|
BIN
img/appinsights/appinsights-loggerfactory.PNG
Normal file
After Width: | Height: | Size: 28 KiB |
BIN
img/appinsights/appinsights-register.PNG
Normal file
After Width: | Height: | Size: 26 KiB |
BIN
img/appinsights/appinsights-screenshot.PNG
Normal file
After Width: | Height: | Size: 112 KiB |
BIN
img/appinsights/useappinsights-program.PNG
Normal file
After Width: | Height: | Size: 28 KiB |
BIN
img/eShopOnContainers_Architecture_Diagram - Old3.png
Normal file
After Width: | Height: | Size: 358 KiB |
Before Width: | Height: | Size: 358 KiB After Width: | Height: | Size: 460 KiB |
Before Width: | Height: | Size: 35 KiB After Width: | Height: | Size: 41 KiB |
BIN
img/ebook_arch_dev_microservices_containers_cover_V1.png
Normal file
After Width: | Height: | Size: 35 KiB |
Before Width: | Height: | Size: 211 KiB After Width: | Height: | Size: 230 KiB |
BIN
img/loadtests/k8ssettings.PNG
Normal file
After Width: | Height: | Size: 66 KiB |
BIN
img/loadtests/loadtestproj_dir.PNG
Normal file
After Width: | Height: | Size: 9.0 KiB |
BIN
img/loadtests/runloadtest.PNG
Normal file
After Width: | Height: | Size: 10 KiB |
BIN
img/loadtests/sfmanifestsettings.PNG
Normal file
After Width: | Height: | Size: 66 KiB |
@ -4,14 +4,18 @@ For k8s CI/CD pipeline delivery a series of tasks must be created in VSTS to dep
|
|||||||
## Prerequisites
|
## Prerequisites
|
||||||
* A Kubernetes cluster. Follow Azure Container Service's [walkthrough](https://docs.microsoft.com/en-us/azure/container-service/container-service-kubernetes-walkthrough) to create one.
|
* A Kubernetes cluster. Follow Azure Container Service's [walkthrough](https://docs.microsoft.com/en-us/azure/container-service/container-service-kubernetes-walkthrough) to create one.
|
||||||
* A private Docker registry. Follow Azure Container Registry's [guide](https://docs.microsoft.com/en-us/azure/container-registry/container-registry-get-started-portal) to create one.
|
* A private Docker registry. Follow Azure Container Registry's [guide](https://docs.microsoft.com/en-us/azure/container-registry/container-registry-get-started-portal) to create one.
|
||||||
* Optionally, previous steps can be skipped if you run gen-k8s-env.ps1 script to automatically create the azure environment needed for kubernetes deployment. Azure cli 2.0 must be previously installed [installation guide](https://docs.microsoft.com/en-us/cli/azure/install-azure-cli). For example:
|
* Optionally, previous steps can be skipped if you run gen-k8s-env.ps1 (or gen-k8s-env-aks.ps1 if you would like to use AKS instead of ACS) script to automatically create the azure environment needed for kubernetes deployment. Azure cli 2.0 must be previously installed [installation guide](https://docs.microsoft.com/en-us/cli/azure/install-azure-cli). For example:
|
||||||
|
|
||||||
>```
|
>```
|
||||||
>./gen-k8s-env -resourceGroupName k8sGroup -location westeurope -registryName k8sregistry -orchestratorName k8s-cluster -dnsName k8s-dns
|
>./gen-k8s-env -resourceGroupName k8sGroup -location westeurope -registryName k8sregistry -orchestratorName k8s-cluster -dnsName k8s-dns
|
||||||
>```
|
>```
|
||||||
|
or using AKS instead of ACS
|
||||||
|
>```
|
||||||
|
>./gen-k8s-env-aks -resourceGroupName k8sGroup -location westeurope -registryName k8sregistry -dnsName k8s-dns -serviceName k8s-cluster -createAcr true -nodeCount 3 -nodeVMSize Standard_D2_v2
|
||||||
|
>```
|
||||||
* An `Azure Blob storage`. It is needed for storing the kubernetes config file used by the hosted agent to access to Kubernetes cluster. Example:
|
* An `Azure Blob storage`. It is needed for storing the kubernetes config file used by the hosted agent to access to Kubernetes cluster. Example:
|
||||||
|
|
||||||
<img src="./img/k8s/blob_creation.png">
|
<img src="./img/blob_creation.png">
|
||||||
|
|
||||||
* Upload the `kubernetes config file` to the blob storage previously created. Execute the following command which will download the config file into the directory `c:\Users\<User>\.kube\` and then, upload it to your blob storage:
|
* Upload the `kubernetes config file` to the blob storage previously created. Execute the following command which will download the config file into the directory `c:\Users\<User>\.kube\` and then, upload it to your blob storage:
|
||||||
|
|
||||||
@ -23,7 +27,7 @@ For k8s CI/CD pipeline delivery a series of tasks must be created in VSTS to dep
|
|||||||
1. Create a `Download File` task to download the kubernetes binary `kubectl` to the hosted agent. For example:
|
1. Create a `Download File` task to download the kubernetes binary `kubectl` to the hosted agent. For example:
|
||||||
|
|
||||||
>```
|
>```
|
||||||
>https://storage.googleapis.com/kubernetes-release/release/v0.0.1.7.0-alpha.0/bin/windows/386/kubectl.exe
|
>https://storage.googleapis.com/kubernetes-release/release/v1.8.5/bin/windows/386/kubectl.exe
|
||||||
>```
|
>```
|
||||||
|
|
||||||
<img src="./img/get_kubectlbin_task.png">
|
<img src="./img/get_kubectlbin_task.png">
|
||||||
@ -33,7 +37,7 @@ For k8s CI/CD pipeline delivery a series of tasks must be created in VSTS to dep
|
|||||||
>```
|
>```
|
||||||
>https://eshopk8s.blob.core.windows.net/k8s-config/config
|
>https://eshopk8s.blob.core.windows.net/k8s-config/config
|
||||||
>```
|
>```
|
||||||
<img src="./img/k8s/get_kubectlconfig_task.png">
|
<img src="./img/get_kubectlconfig_task.png">
|
||||||
|
|
||||||
3. Create a powershell task to execute the k8s deployment script. For example:
|
3. Create a powershell task to execute the k8s deployment script. For example:
|
||||||
|
|
||||||
@ -59,4 +63,4 @@ For k8s CI/CD pipeline delivery a series of tasks must be created in VSTS to dep
|
|||||||
|
|
||||||
You can use additional parameters (i.e. pass registry and user/password to use custom registry instead of DockerHub. Plase, refer to [README.k8s.md](./README.k8s.md) for more info.
|
You can use additional parameters (i.e. pass registry and user/password to use custom registry instead of DockerHub. Plase, refer to [README.k8s.md](./README.k8s.md) for more info.
|
||||||
|
|
||||||
<img src="./img/k8s/deploy_script_task.png">
|
<img src="./img/deploy_script_task.png">
|
||||||
|
@ -4,13 +4,17 @@ The k8s directory contains Kubernetes configuration for the eShopOnContainers ap
|
|||||||
## Prerequisites
|
## Prerequisites
|
||||||
* A Kubernetes cluster. Follow Azure Container Service's [walkthrough](https://docs.microsoft.com/en-us/azure/container-service/container-service-kubernetes-walkthrough) to create one.
|
* A Kubernetes cluster. Follow Azure Container Service's [walkthrough](https://docs.microsoft.com/en-us/azure/container-service/container-service-kubernetes-walkthrough) to create one.
|
||||||
* A private Docker registry. Follow Azure Container Registry's [guide](https://docs.microsoft.com/en-us/azure/container-registry/container-registry-get-started-portal) to create one.
|
* A private Docker registry. Follow Azure Container Registry's [guide](https://docs.microsoft.com/en-us/azure/container-registry/container-registry-get-started-portal) to create one.
|
||||||
* Optionally, previous steps can be skipped if you run gen-k8s-env.ps1 script to automatically create the azure environment needed for kubernetes deployment. Azure cli 2.0 must be previously installed [installation guide](https://docs.microsoft.com/en-us/cli/azure/install-azure-cli). For example:
|
* Optionally, previous steps can be skipped if you run gen-k8s-env.ps1 (or gen-k8s-env-aks.ps1 if you would like to use AKS instead of ACS) script to automatically create the azure environment needed for kubernetes deployment. Azure cli 2.0 must be previously installed [installation guide](https://docs.microsoft.com/en-us/cli/azure/install-azure-cli). For example:
|
||||||
|
|
||||||
**Important**: Note the parameter "-createAcr true". If you are creating the K8s cluster but you want to re-use and existing ACR, say "-createAcr false".
|
**Important**: Note the parameter "-createAcr true". If you are creating the K8s cluster but you want to re-use and existing ACR, say "-createAcr false".
|
||||||
|
|
||||||
>```
|
>```
|
||||||
>./gen-k8s-env -resourceGroupName k8sGroup -location westeurope -registryName k8sregistry -createAcr true -orchestratorName k8s-cluster -dnsName k8s-dns
|
>./gen-k8s-env -resourceGroupName k8sGroup -location westeurope -registryName k8sregistry -createAcr true -orchestratorName k8s-cluster -dnsName k8s-dns
|
||||||
>```
|
>```
|
||||||
|
or using AKS instead of ACS
|
||||||
|
>```
|
||||||
|
>./gen-k8s-env-aks -resourceGroupName k8sGroup -location westeurope -registryName k8sregistry -dnsName k8s-dns -serviceName k8s-cluster -createAcr true -nodeCount 3 -nodeVMSize Standard_D2_v2
|
||||||
|
>```
|
||||||
|
|
||||||
* A Docker development environment with `docker` and `docker-compose`.
|
* A Docker development environment with `docker` and `docker-compose`.
|
||||||
* Visit [docker.com](https://docker.com) to download the tools and set up the environment. Docker's [installation guide](https://docs.docker.com/engine/getstarted/step_one/#step-3-verify-your-installation) covers verifying your Docker installation.
|
* Visit [docker.com](https://docker.com) to download the tools and set up the environment. Docker's [installation guide](https://docs.docker.com/engine/getstarted/step_one/#step-3-verify-your-installation) covers verifying your Docker installation.
|
||||||
@ -29,18 +33,18 @@ The k8s directory contains Kubernetes configuration for the eShopOnContainers ap
|
|||||||
Once the user and password are retrieved, run the following script for deployment. For example:
|
Once the user and password are retrieved, run the following script for deployment. For example:
|
||||||
|
|
||||||
>```
|
>```
|
||||||
>./deploy.ps1 -registry myregistry.azurecr.io -dockerUser User -dockerPassword SecretPassword -configFile file_with_config.json
|
>./deploy.ps1 -registry myregistry.azurecr.io -dockerUser User -dockerPassword SecretPassword -configFile file_with_config.yaml
|
||||||
>```
|
>```
|
||||||
|
|
||||||
The parameter `configFile` is important (and mandatory) because it contains the configuration used for the Pods in Kubernetes. This allow deploying Pods that use your own resources in Azure or any other cloud provider. A configuration file `local.json` is provided which configures Pods to use the infrastructure containers (that is sql server, rabbitmq, redis and mongodb must be deployed also in the k8s).
|
The parameter `configFile` is important (and mandatory) because it contains the configuration used for the Pods in Kubernetes. This allow deploying Pods that use your own resources in Azure or any other cloud provider. A configuration file `conf_local.yaml` is provided which configures Pods to use the infrastructure containers (that is sql server, rabbitmq, redis and mongodb must be deployed also in the k8s).
|
||||||
|
|
||||||
The script will build the code and corresponding Docker images, push the later to your registry, and deploy the application to your cluster. You can watch the deployment unfold from the Kubernetes web interface: run `kubectl proxy` and open a browser to [http://localhost:8001/ui](http://localhost:8001/ui)
|
The script will build the code and corresponding Docker images, push the later to your registry, and deploy the application to your cluster. You can watch the deployment unfold from the Kubernetes web interface: run `kubectl proxy` and open a browser to [http://localhost:8001/ui](http://localhost:8001/ui)
|
||||||
|
|
||||||
### Pods configuration file
|
### Pods configuration file
|
||||||
|
|
||||||
When deploying to k8s the script needs the `configFile` with the location of a JSON configuration file. This file contains the configuration of the pods. The file is a JSON file. For reference another configuration file (cloud.json) is provided but without valid values.
|
When deploying to k8s the script needs the `configFile` parameter with the location of the YAML configuration file. This file contains the configuration of the pods. The file is a .YAML file. For reference another configuration file (conf_cloud.yaml) is provided but without valid values.
|
||||||
|
|
||||||
If you deploy the infrastructure containers use `local.json` as a value for `configFile` parameter. If you don't deploy the infrastructure containers use your own configuration file with the correct values.
|
If you deploy the infrastructure containers use `conf_local.yaml` as a value for `configFile` parameter. If you don't deploy the infrastructure containers use your own configuration file with the correct values.
|
||||||
|
|
||||||
### Parameters of the deploy.ps1 script
|
### Parameters of the deploy.ps1 script
|
||||||
|
|
||||||
|
@ -6,29 +6,29 @@ metadata:
|
|||||||
app: eshop
|
app: eshop
|
||||||
data:
|
data:
|
||||||
# Basket.API entries
|
# Basket.API entries
|
||||||
BasketBus: CONNECTION_STRING (NAME OF RABBITMQ CONTAINER OR Endpoint=sb://XXXX in case of using Azure)
|
BasketBus: CONNECTION_STRING (NAME OF RABBITMQ CONTAINER OR Endpoint=sb://XXXX for topic in case of using Azure)
|
||||||
BasketRedisConStr: REDIS CONNECTION STRING FOR BASKET
|
BasketRedisConStr: REDIS CONNECTION STRING FOR BASKET
|
||||||
# Catalog.API entries
|
# Catalog.API entries
|
||||||
CatalogBus: CONNECTION_STRING (NAME OF RABBITMQ CONTAINER OR Endpoint=sb://XXXX in case of using Azure)
|
CatalogBus: CONNECTION_STRING (NAME OF RABBITMQ CONTAINER OR Endpoint=sb://XXXX for topic in case of using Azure)
|
||||||
CatalogSqlDb: Catalog SQL SERVER CONNECTION STRING (Server=xxxx;Intial Catalog=yyy;....)
|
CatalogSqlDb: Catalog SQL SERVER CONNECTION STRING (Server=xxxx;Intial Catalog=yyy;....)
|
||||||
# Identity.API entries
|
# Identity.API entries
|
||||||
IdentitySqlDb: Identity SQL SERVER CONNECTION STRING (Server=xxxx;Intial Catalog=yyy;....)
|
IdentitySqlDb: Identity SQL SERVER CONNECTION STRING (Server=xxxx;Intial Catalog=yyy;....)
|
||||||
# Locations.API entries
|
# Locations.API entries
|
||||||
LocationsBus: CONNECTION_STRING (NAME OF RABBITMQ CONTAINER OR Endpoint=sb://XXXX in case of using Azure)
|
LocationsBus: CONNECTION_STRING (NAME OF RABBITMQ CONTAINER OR Endpoint=sb://XXXX for topic in case of using Azure)
|
||||||
LocationsNoSqlDb: Locations MongoDb ConnectionString
|
LocationsNoSqlDb: Locations MongoDb ConnectionString
|
||||||
LocationsNoSqlDbName: Locations MongoDb database (LocationsDb)
|
LocationsNoSqlDbName: Locations MongoDb database (LocationsDb)
|
||||||
# Marketing.API entries
|
# Marketing.API entries
|
||||||
MarketingBus: CONNECTION_STRING (NAME OF RABBITMQ CONTAINER OR Endpoint=sb://XXXX in case of using Azure)
|
MarketingBus: CONNECTION_STRING (NAME OF RABBITMQ CONTAINER OR Endpoint=sb://XXXX for topic in case of using Azure)
|
||||||
MarketingNoSqlDb: Marketing MongoDb ConnectionString
|
MarketingNoSqlDb: Marketing MongoDb ConnectionString
|
||||||
MarketingNoSqlDbName: Marketing MongoDb database (MarketingDb)
|
MarketingNoSqlDbName: Marketing MongoDb database (MarketingDb)
|
||||||
MarketingSqlDb: Marketing SQL SERVER CONNECTION STRING (Server=xxxx;Intial Catalog=yyy;....)
|
MarketingSqlDb: Marketing SQL SERVER CONNECTION STRING (Server=xxxx;Intial Catalog=yyy;....)
|
||||||
# Ordering.API entries
|
# Ordering.API entries
|
||||||
OrderingBus: CONNECTION_STRING (NAME OF RABBITMQ CONTAINER OR Endpoint=sb://XXXX in case of using Azure)
|
OrderingBus: CONNECTION_STRING (NAME OF RABBITMQ CONTAINER OR Endpoint=sb://XXXX for topic in case of using Azure)
|
||||||
OrderingSqlDb: Ordering SQL SERVER CONNECTION STRING (Server=xxxx;Intial Catalog=yyy;....)
|
OrderingSqlDb: Ordering SQL SERVER CONNECTION STRING (Server=xxxx;Intial Catalog=yyy;....)
|
||||||
GracePeriodManager_GracePeriodTime: "1"
|
GracePeriodManager_GracePeriodTime: "1"
|
||||||
GracePeriodManager_CheckUpdateTime: "15000"
|
GracePeriodManager_CheckUpdateTime: "15000"
|
||||||
# Payment.API entries
|
# Payment.API entries
|
||||||
PaymentBus: CONNECTION_STRING (NAME OF RABBITMQ CONTAINER OR Endpoint=sb://XXXX in case of using Azure)
|
PaymentBus: CONNECTION_STRING (NAME OF RABBITMQ CONTAINER OR Endpoint=sb://XXXX for topic in case of using Azure)
|
||||||
# Global entries
|
# Global entries
|
||||||
UseAzureServiceBus: "TRUE" IF USE AZURE SB ("FALSE" FOR USING RABBITMQ)
|
UseAzureServiceBus: "TRUE" IF USE AZURE SB ("FALSE" FOR USING RABBITMQ)
|
||||||
keystore: REDIS CONNECTION STRING FOR KEYSTORE
|
keystore: REDIS CONNECTION STRING FOR KEYSTORE
|
3
k8s/deploy-ingress-azure.ps1
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
kubectl patch deployment -n ingress-nginx nginx-ingress-controller --type=json --patch="$(cat nginx-ingress\publish-service-patch.yaml)"
|
||||||
|
kubectl apply -f nginx-ingress\azure\service.yaml
|
||||||
|
kubectl apply -f nginx-ingress\patch-service-without-rbac.yaml
|
12
k8s/deploy-ingress.ps1
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
kubectl apply -f ingress.yaml
|
||||||
|
|
||||||
|
# Deploy nginx-ingress core files
|
||||||
|
kubectl apply -f nginx-ingress\namespace.yaml
|
||||||
|
kubectl apply -f nginx-ingress\default-backend.yaml
|
||||||
|
kubectl apply -f nginx-ingress\configmap.yaml
|
||||||
|
kubectl apply -f nginx-ingress\tcp-services-configmap.yaml
|
||||||
|
kubectl apply -f nginx-ingress\udp-services-configmap.yaml
|
||||||
|
kubectl apply -f nginx-ingress\without-rbac.yaml
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -6,10 +6,8 @@ Param(
|
|||||||
[parameter(Mandatory=$false)][string]$kubeconfigPath,
|
[parameter(Mandatory=$false)][string]$kubeconfigPath,
|
||||||
[parameter(Mandatory=$true)][string]$configFile,
|
[parameter(Mandatory=$true)][string]$configFile,
|
||||||
[parameter(Mandatory=$false)][string]$imageTag,
|
[parameter(Mandatory=$false)][string]$imageTag,
|
||||||
[parameter(Mandatory=$false)][string]$externalDns,
|
|
||||||
[parameter(Mandatory=$false)][bool]$deployCI=$false,
|
[parameter(Mandatory=$false)][bool]$deployCI=$false,
|
||||||
[parameter(Mandatory=$false)][bool]$buildImages=$true,
|
[parameter(Mandatory=$false)][bool]$buildImages=$true,
|
||||||
[parameter(Mandatory=$false)][bool]$buildBits=$false,
|
|
||||||
[parameter(Mandatory=$false)][bool]$deployInfrastructure=$true,
|
[parameter(Mandatory=$false)][bool]$deployInfrastructure=$true,
|
||||||
[parameter(Mandatory=$false)][string]$dockerOrg="eshop"
|
[parameter(Mandatory=$false)][string]$dockerOrg="eshop"
|
||||||
)
|
)
|
||||||
@ -30,6 +28,16 @@ function ExecKube($cmd) {
|
|||||||
$debugMode = $PSCmdlet.MyInvocation.BoundParameters["Debug"].IsPresent
|
$debugMode = $PSCmdlet.MyInvocation.BoundParameters["Debug"].IsPresent
|
||||||
$useDockerHub = [string]::IsNullOrEmpty($registry)
|
$useDockerHub = [string]::IsNullOrEmpty($registry)
|
||||||
|
|
||||||
|
$externalDns = & ExecKube -cmd 'get svc ingress-nginx -n ingress-nginx -o=jsonpath="{.status.loadBalancer.ingress[0].ip}"'
|
||||||
|
Write-Host "Ingress ip detected: $externalDns" -ForegroundColor Yellow
|
||||||
|
|
||||||
|
if (-not [bool]($externalDns -as [ipaddress])) {
|
||||||
|
Write-Host "Must install ingress first" -ForegroundColor Red
|
||||||
|
Write-Host "Run deploy-ingress.ps1 and deploy-ingress-azure.ps1" -ForegroundColor Red
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
# Check required commands (only if not in CI environment)
|
# Check required commands (only if not in CI environment)
|
||||||
if(-not $deployCI) {
|
if(-not $deployCI) {
|
||||||
$requiredCommands = ("docker", "docker-compose", "kubectl")
|
$requiredCommands = ("docker", "docker-compose", "kubectl")
|
||||||
@ -41,7 +49,6 @@ if(-not $deployCI) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$buildBits = false;
|
|
||||||
$buildImages = false; # Never build images through CI, as they previously built
|
$buildImages = false; # Never build images through CI, as they previously built
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -51,18 +58,14 @@ if ([string]::IsNullOrEmpty($imageTag)) {
|
|||||||
}
|
}
|
||||||
Write-Host "Docker image Tag: $imageTag" -ForegroundColor Yellow
|
Write-Host "Docker image Tag: $imageTag" -ForegroundColor Yellow
|
||||||
|
|
||||||
# building and publishing docker images if needed
|
# building docker images if needed
|
||||||
if($buildBits) {
|
|
||||||
Write-Host "Building and publishing eShopOnContainers..." -ForegroundColor Yellow
|
|
||||||
dotnet publish -c Release -o obj/Docker/publish ../eShopOnContainers-ServicesAndWebApps.sln
|
|
||||||
}
|
|
||||||
if ($buildImages) {
|
if ($buildImages) {
|
||||||
Write-Host "Building Docker images tagged with '$imageTag'" -ForegroundColor Yellow
|
Write-Host "Building Docker images tagged with '$imageTag'" -ForegroundColor Yellow
|
||||||
$env:TAG=$imageTag
|
$env:TAG=$imageTag
|
||||||
docker-compose -p .. -f ../docker-compose.yml build
|
docker-compose -p .. -f ../docker-compose.yml build
|
||||||
|
|
||||||
Write-Host "Pushing images to $registry/$dockerOrg..." -ForegroundColor Yellow
|
Write-Host "Pushing images to $registry/$dockerOrg..." -ForegroundColor Yellow
|
||||||
$services = ("basket.api", "catalog.api", "identity.api", "ordering.api", "marketing.api","payment.api","locations.api", "webmvc", "webspa", "webstatus")
|
$services = ("basket.api", "catalog.api", "identity.api", "ordering.api", "ordering.backgroundtasks", "marketing.api","payment.api","locations.api", "webmvc", "webspa", "webstatus")
|
||||||
|
|
||||||
foreach ($service in $services) {
|
foreach ($service in $services) {
|
||||||
$imageFqdn = if ($useDockerHub) {"$dockerOrg/${service}"} else {"$registry/$dockerOrg/${service}"}
|
$imageFqdn = if ($useDockerHub) {"$dockerOrg/${service}"} else {"$registry/$dockerOrg/${service}"}
|
||||||
@ -100,35 +103,18 @@ if (-not [string]::IsNullOrEmpty($dockerUser)) {
|
|||||||
Write-Host "Removing existing services & deployments.." -ForegroundColor Yellow
|
Write-Host "Removing existing services & deployments.." -ForegroundColor Yellow
|
||||||
ExecKube -cmd 'delete deployments --all'
|
ExecKube -cmd 'delete deployments --all'
|
||||||
ExecKube -cmd 'delete services --all'
|
ExecKube -cmd 'delete services --all'
|
||||||
ExecKube -cmd 'delete configmap config-files'
|
|
||||||
ExecKube -cmd 'delete configmap urls'
|
ExecKube -cmd 'delete configmap urls'
|
||||||
ExecKube -cmd 'delete configmap externalcfg'
|
ExecKube -cmd 'delete configmap externalcfg'
|
||||||
|
|
||||||
# start sql, rabbitmq, frontend deploymentsExecKube -cmd 'delete configmap config-files'
|
# start sql, rabbitmq, frontend deployments
|
||||||
ExecKube -cmd 'create configmap config-files --from-file=nginx-conf=nginx.conf'
|
|
||||||
ExecKube -cmd 'label configmap config-files app=eshop'
|
|
||||||
|
|
||||||
if ($deployInfrastructure) {
|
if ($deployInfrastructure) {
|
||||||
Write-Host 'Deploying infrastructure deployments (databases, redis, RabbitMQ...)' -ForegroundColor Yellow
|
Write-Host 'Deploying infrastructure deployments (databases, redis, RabbitMQ...)' -ForegroundColor Yellow
|
||||||
ExecKube -cmd 'create -f sql-data.yaml -f basket-data.yaml -f keystore-data.yaml -f rabbitmq.yaml -f nosql-data.yaml'
|
ExecKube -cmd 'create -f sql-data.yaml -f basket-data.yaml -f keystore-data.yaml -f rabbitmq.yaml -f nosql-data.yaml'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Write-Host 'Deploying code deployments (Web APIs, Web apps, ...)' -ForegroundColor Yellow
|
Write-Host 'Deploying code deployments (Web APIs, Web apps, ...)' -ForegroundColor Yellow
|
||||||
ExecKube -cmd 'create -f services.yaml -f frontend.yaml'
|
ExecKube -cmd 'create -f services.yaml'
|
||||||
|
|
||||||
if ([string]::IsNullOrEmpty($externalDns)) {
|
|
||||||
Write-Host "Waiting for frontend's external ip..." -ForegroundColor Yellow
|
|
||||||
while ($true) {
|
|
||||||
$frontendUrl = & ExecKube -cmd 'get svc frontend -o=jsonpath="{.status.loadBalancer.ingress[0].ip}"'
|
|
||||||
if ([bool]($frontendUrl -as [ipaddress])) {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
Start-Sleep -s 15
|
|
||||||
}
|
|
||||||
$externalDns = $frontendUrl
|
|
||||||
}
|
|
||||||
|
|
||||||
Write-Host "Using $externalDns as the external DNS/IP of the k8s cluster"
|
|
||||||
|
|
||||||
ExecKube -cmd 'create configmap urls `
|
ExecKube -cmd 'create configmap urls `
|
||||||
--from-literal=BasketUrl=http://basket `
|
--from-literal=BasketUrl=http://basket `
|
||||||
@ -192,6 +178,8 @@ ExecKube -cmd 'set image deployments/payment payment=${registryPath}${dockerOrg}
|
|||||||
ExecKube -cmd 'set image deployments/webmvc webmvc=${registryPath}${dockerOrg}/webmvc:$imageTag'
|
ExecKube -cmd 'set image deployments/webmvc webmvc=${registryPath}${dockerOrg}/webmvc:$imageTag'
|
||||||
ExecKube -cmd 'set image deployments/webstatus webstatus=${registryPath}${dockerOrg}/webstatus:$imageTag'
|
ExecKube -cmd 'set image deployments/webstatus webstatus=${registryPath}${dockerOrg}/webstatus:$imageTag'
|
||||||
ExecKube -cmd 'set image deployments/webspa webspa=${registryPath}${dockerOrg}/webspa:$imageTag'
|
ExecKube -cmd 'set image deployments/webspa webspa=${registryPath}${dockerOrg}/webspa:$imageTag'
|
||||||
|
ExecKube -cmd 'set image deployments/orderingbackground orderingbackground=${registryPath}${dockerOrg}/ordering.backgroundtasks:$imageTag'
|
||||||
|
|
||||||
|
|
||||||
Write-Host "Execute rollout..." -ForegroundColor Yellow
|
Write-Host "Execute rollout..." -ForegroundColor Yellow
|
||||||
ExecKube -cmd 'rollout resume deployments/basket'
|
ExecKube -cmd 'rollout resume deployments/basket'
|
||||||
@ -204,6 +192,7 @@ ExecKube -cmd 'rollout resume deployments/payment'
|
|||||||
ExecKube -cmd 'rollout resume deployments/webmvc'
|
ExecKube -cmd 'rollout resume deployments/webmvc'
|
||||||
ExecKube -cmd 'rollout resume deployments/webstatus'
|
ExecKube -cmd 'rollout resume deployments/webstatus'
|
||||||
ExecKube -cmd 'rollout resume deployments/webspa'
|
ExecKube -cmd 'rollout resume deployments/webspa'
|
||||||
|
ExecKube -cmd 'rollout resume deployments/orderingbackground'
|
||||||
|
|
||||||
Write-Host "WebSPA is exposed at http://$externalDns, WebMVC at http://$externalDns/webmvc, WebStatus at http://$externalDns/webstatus" -ForegroundColor Yellow
|
Write-Host "WebSPA is exposed at http://$externalDns, WebMVC at http://$externalDns/webmvc, WebStatus at http://$externalDns/webstatus" -ForegroundColor Yellow
|
||||||
|
|
||||||
|
212
k8s/deploy.sh
Executable file
@ -0,0 +1,212 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# http://redsymbol.net/articles/unofficial-bash-strict-mode/
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
# This script is comparable to the PowerShell script deploy.ps1 but to be used from a Mac bash environment.
|
||||||
|
# There are, however, the following few differences/limitations:
|
||||||
|
|
||||||
|
# It assumes docker/container registry login was already performed
|
||||||
|
# It assumes K8s was given access to the registry—does not create any K8s secrets
|
||||||
|
# It does not support explicit kubectl config file (relies on kubectl config use-context to point kubectl at the right cluster/namespace)
|
||||||
|
# It always deploys infrastructure bits (redis, SQL Server etc)
|
||||||
|
# The script was tested only with Azure Container Registry (not Docker Hub, although it is expected to work with Docker Hub too)
|
||||||
|
|
||||||
|
# Feel free to submit a PR in order to improve it.
|
||||||
|
|
||||||
|
usage()
|
||||||
|
{
|
||||||
|
cat <<END
|
||||||
|
deploy.sh: deploys eShopOnContainers application to Kubernetes cluster
|
||||||
|
Parameters:
|
||||||
|
-r | --registry <container registry>
|
||||||
|
Specifies container registry (ACR) to use (required), e.g. myregistry.azurecr.io
|
||||||
|
-t | --tag <docker image tag>
|
||||||
|
Default: newly created, date-based timestamp, with 1-minute resolution
|
||||||
|
-b | --build-solution
|
||||||
|
Force solution build before deployment (default: false)
|
||||||
|
--skip-image-build
|
||||||
|
Do not build images (default is to build all images)
|
||||||
|
--skip-image-push
|
||||||
|
Do not upload images to the container registry (just run the Kubernetes deployment portion)
|
||||||
|
Default is to push images to container registry
|
||||||
|
-h | --help
|
||||||
|
Displays this help text and exits the script
|
||||||
|
|
||||||
|
It is assumed that the Kubernetes AKS cluster has been granted access to ACR registry.
|
||||||
|
For more info see
|
||||||
|
https://docs.microsoft.com/en-us/azure/container-registry/container-registry-auth-aks
|
||||||
|
|
||||||
|
WARNING! THE SCRIPT WILL COMPLETELY DESTROY ALL DEPLOYMENTS AND SERVICES VISIBLE
|
||||||
|
FROM THE CURRENT CONFIGURATION CONTEXT.
|
||||||
|
It is recommended that you create a separate namespace and confguration context
|
||||||
|
for the eShopOnContainers application, to isolate it from other applications on the cluster.
|
||||||
|
For more information see https://kubernetes.io/docs/tasks/administer-cluster/namespaces/
|
||||||
|
You can use eshop-namespace.yaml file (in the same directory) to create the namespace.
|
||||||
|
|
||||||
|
END
|
||||||
|
}
|
||||||
|
|
||||||
|
image_tag=$(date '+%Y%m%d%H%M')
|
||||||
|
build_solution=''
|
||||||
|
container_registry=''
|
||||||
|
build_images='yes'
|
||||||
|
push_images='yes'
|
||||||
|
|
||||||
|
while [[ $# -gt 0 ]]; do
|
||||||
|
case "$1" in
|
||||||
|
-r | --registry )
|
||||||
|
container_registry="$2"; shift 2 ;;
|
||||||
|
-t | --tag )
|
||||||
|
image_tag="$2"; shift 2 ;;
|
||||||
|
-b | --build-solution )
|
||||||
|
build_solution='yes'; shift ;;
|
||||||
|
--skip-image-build )
|
||||||
|
build_images=''; shift ;;
|
||||||
|
--skip-image-push )
|
||||||
|
push_images=''; shift ;;
|
||||||
|
-h | --help )
|
||||||
|
usage; exit 1 ;;
|
||||||
|
*)
|
||||||
|
echo "Unknown option $1"
|
||||||
|
usage; exit 2 ;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
if [[ ! $container_registry ]]; then
|
||||||
|
echo 'Container registry must be specified (e.g. myregistry.azurecr.io)'
|
||||||
|
echo ''
|
||||||
|
usage
|
||||||
|
exit 3
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ $build_solution ]]; then
|
||||||
|
echo "#################### Building eShopOnContainers solution ####################"
|
||||||
|
dotnet publish -o obj/Docker/publish ../eShopOnContainers-ServicesAndWebApps.sln
|
||||||
|
fi
|
||||||
|
|
||||||
|
export TAG=$image_tag
|
||||||
|
|
||||||
|
if [[ $build_images ]]; then
|
||||||
|
echo "#################### Building eShopOnContainers Docker images ####################"
|
||||||
|
docker-compose -p .. -f ../docker-compose.yml build
|
||||||
|
|
||||||
|
# Remove temporary images
|
||||||
|
docker rmi $(docker images -qf "dangling=true")
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ $push_images ]]; then
|
||||||
|
echo "#################### Pushing images to registry ####################"
|
||||||
|
services=(basket.api catalog.api identity.api ordering.api marketing.api payment.api locations.api webmvc webspa webstatus)
|
||||||
|
|
||||||
|
for service in "${services[@]}"
|
||||||
|
do
|
||||||
|
echo "Pushing image for service $service..."
|
||||||
|
docker tag "eshop/$service:$image_tag" "$container_registry/$service:$image_tag"
|
||||||
|
docker push "$container_registry/$service:$image_tag"
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "#################### Cleaning up old deployment ####################"
|
||||||
|
kubectl delete deployments --all
|
||||||
|
kubectl delete services --all
|
||||||
|
kubectl delete configmap config-files || true
|
||||||
|
kubectl delete configmap urls || true
|
||||||
|
kubectl delete configmap externalcfg || true
|
||||||
|
|
||||||
|
echo "#################### Deploying infrastructure components ####################"
|
||||||
|
kubectl create configmap config-files --from-file=nginx-conf=nginx.conf
|
||||||
|
kubectl label configmap config-files app=eshop
|
||||||
|
kubectl create -f sql-data.yaml -f basket-data.yaml -f keystore-data.yaml -f rabbitmq.yaml -f nosql-data.yaml
|
||||||
|
|
||||||
|
echo "#################### Creating application service definitions ####################"
|
||||||
|
kubectl create -f services.yaml -f frontend.yaml
|
||||||
|
|
||||||
|
echo "#################### Waiting for Azure to provision external IP ####################"
|
||||||
|
|
||||||
|
ip_regex='([0-9]{1,3}\.){3}[0-9]{1,3}'
|
||||||
|
while true; do
|
||||||
|
printf "."
|
||||||
|
frontendUrl=$(kubectl get svc frontend -o=jsonpath="{.status.loadBalancer.ingress[0].ip}")
|
||||||
|
if [[ $frontendUrl =~ $ip_regex ]]; then
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
sleep 5s
|
||||||
|
done
|
||||||
|
|
||||||
|
printf "\n"
|
||||||
|
externalDns=$frontendUrl
|
||||||
|
echo "Using $externalDns as the external DNS/IP of the K8s cluster"
|
||||||
|
|
||||||
|
echo "#################### Creating application configuration ####################"
|
||||||
|
|
||||||
|
# urls configmap
|
||||||
|
kubectl create configmap urls \
|
||||||
|
"--from-literal=BasketUrl=http://basket" \
|
||||||
|
"--from-literal=BasketHealthCheckUrl=http://basket/hc" \
|
||||||
|
"--from-literal=CatalogUrl=http://$externalDns/catalog-api" \
|
||||||
|
"--from-literal=CatalogHealthCheckUrl=http://catalog/hc" \
|
||||||
|
"--from-literal=PicBaseUrl=http://$externalDns/catalog-api/api/v1/catalog/items/[0]/pic/" \
|
||||||
|
"--from-literal=Marketing_PicBaseUrl=http://$externalDns/marketing-api/api/v1/campaigns/[0]/pic/" \
|
||||||
|
"--from-literal=IdentityUrl=http://$externalDns/identity" \
|
||||||
|
"--from-literal=IdentityHealthCheckUrl=http://identity/hc" \
|
||||||
|
"--from-literal=OrderingUrl=http://ordering" \
|
||||||
|
"--from-literal=OrderingHealthCheckUrl=http://ordering/hc" \
|
||||||
|
"--from-literal=MvcClientExternalUrl=http://$externalDns/webmvc" \
|
||||||
|
"--from-literal=WebMvcHealthCheckUrl=http://webmvc/hc" \
|
||||||
|
"--from-literal=MvcClientOrderingUrl=http://ordering" \
|
||||||
|
"--from-literal=MvcClientCatalogUrl=http://catalog" \
|
||||||
|
"--from-literal=MvcClientBasketUrl=http://basket" \
|
||||||
|
"--from-literal=MvcClientMarketingUrl=http://marketing" \
|
||||||
|
"--from-literal=MvcClientLocationsUrl=http://locations" \
|
||||||
|
"--from-literal=MarketingHealthCheckUrl=http://marketing/hc" \
|
||||||
|
"--from-literal=WebSpaHealthCheckUrl=http://webspa/hc" \
|
||||||
|
"--from-literal=SpaClientMarketingExternalUrl=http://$externalDns/marketing-api" \
|
||||||
|
"--from-literal=SpaClientOrderingExternalUrl=http://$externalDns/ordering-api" \
|
||||||
|
"--from-literal=SpaClientCatalogExternalUrl=http://$externalDns/catalog-api" \
|
||||||
|
"--from-literal=SpaClientBasketExternalUrl=http://$externalDns/basket-api" \
|
||||||
|
"--from-literal=SpaClientIdentityExternalUrl=http://$externalDns/identity" \
|
||||||
|
"--from-literal=SpaClientLocationsUrl=http://$externalDns/locations-api" \
|
||||||
|
"--from-literal=LocationsHealthCheckUrl=http://locations/hc" \
|
||||||
|
"--from-literal=SpaClientExternalUrl=http://$externalDns" \
|
||||||
|
"--from-literal=LocationApiClient=http://$externalDns/locations-api" \
|
||||||
|
"--from-literal=MarketingApiClient=http://$externalDns/marketing-api" \
|
||||||
|
"--from-literal=BasketApiClient=http://$externalDns/basket-api" \
|
||||||
|
"--from-literal=OrderingApiClient=http://$externalDns/ordering-api" \
|
||||||
|
"--from-literal=PaymentHealthCheckUrl=http://payment/hc"
|
||||||
|
|
||||||
|
kubectl label configmap urls app=eshop
|
||||||
|
|
||||||
|
# externalcfg configmap -- points to local infrastructure components (rabbitmq, SQL Server etc)
|
||||||
|
kubectl create -f conf_local.yml
|
||||||
|
|
||||||
|
# Create application pod deployments
|
||||||
|
kubectl create -f deployments.yaml
|
||||||
|
|
||||||
|
echo "#################### Deploying application pods ####################"
|
||||||
|
|
||||||
|
# update deployments with the correct image (with tag and/or registry)
|
||||||
|
kubectl set image deployments/basket "basket=$container_registry/basket.api:$image_tag"
|
||||||
|
kubectl set image deployments/catalog "catalog=$container_registry/catalog.api:$image_tag"
|
||||||
|
kubectl set image deployments/identity "identity=$container_registry/identity.api:$image_tag"
|
||||||
|
kubectl set image deployments/ordering "ordering=$container_registry/ordering.api:$image_tag"
|
||||||
|
kubectl set image deployments/marketing "marketing=$container_registry/marketing.api:$image_tag"
|
||||||
|
kubectl set image deployments/locations "locations=$container_registry/locations.api:$image_tag"
|
||||||
|
kubectl set image deployments/payment "payment=$container_registry/payment.api:$image_tag"
|
||||||
|
kubectl set image deployments/webmvc "webmvc=$container_registry/webmvc:$image_tag"
|
||||||
|
kubectl set image deployments/webstatus "webstatus=$container_registry/webstatus:$image_tag"
|
||||||
|
kubectl set image deployments/webspa "webspa=$container_registry/webspa:$image_tag"
|
||||||
|
|
||||||
|
kubectl rollout resume deployments/basket
|
||||||
|
kubectl rollout resume deployments/catalog
|
||||||
|
kubectl rollout resume deployments/identity
|
||||||
|
kubectl rollout resume deployments/ordering
|
||||||
|
kubectl rollout resume deployments/marketing
|
||||||
|
kubectl rollout resume deployments/locations
|
||||||
|
kubectl rollout resume deployments/payment
|
||||||
|
kubectl rollout resume deployments/webmvc
|
||||||
|
kubectl rollout resume deployments/webstatus
|
||||||
|
kubectl rollout resume deployments/webspa
|
||||||
|
|
||||||
|
echo "WebSPA is exposed at http://$externalDns, WebMVC at http://$externalDns/webmvc, WebStatus at http://$externalDns/webstatus"
|
||||||
|
echo "eShopOnContainers deployment is DONE"
|
@ -56,15 +56,15 @@ spec:
|
|||||||
path: /hc
|
path: /hc
|
||||||
port: 80
|
port: 80
|
||||||
scheme: HTTP
|
scheme: HTTP
|
||||||
initialDelaySeconds: 5
|
initialDelaySeconds: 60
|
||||||
periodSeconds: 10
|
periodSeconds: 60
|
||||||
livenessProbe:
|
livenessProbe:
|
||||||
httpGet:
|
httpGet:
|
||||||
path: /hc
|
path: /liveness
|
||||||
port: 80
|
port: 80
|
||||||
scheme: HTTP
|
scheme: HTTP
|
||||||
initialDelaySeconds: 60
|
initialDelaySeconds: 120
|
||||||
periodSeconds: 10
|
periodSeconds: 60
|
||||||
imagePullSecrets:
|
imagePullSecrets:
|
||||||
- name: registry-key
|
- name: registry-key
|
||||||
---
|
---
|
||||||
@ -121,15 +121,15 @@ spec:
|
|||||||
path: /hc
|
path: /hc
|
||||||
port: 80
|
port: 80
|
||||||
scheme: HTTP
|
scheme: HTTP
|
||||||
initialDelaySeconds: 5
|
initialDelaySeconds: 60
|
||||||
periodSeconds: 10
|
periodSeconds: 60
|
||||||
livenessProbe:
|
livenessProbe:
|
||||||
httpGet:
|
httpGet:
|
||||||
path: /hc
|
path: /liveness
|
||||||
port: 80
|
port: 80
|
||||||
scheme: HTTP
|
scheme: HTTP
|
||||||
initialDelaySeconds: 60
|
initialDelaySeconds: 120
|
||||||
periodSeconds: 10
|
periodSeconds: 60
|
||||||
imagePullSecrets:
|
imagePullSecrets:
|
||||||
- name: registry-key
|
- name: registry-key
|
||||||
---
|
---
|
||||||
@ -208,15 +208,15 @@ spec:
|
|||||||
path: /hc
|
path: /hc
|
||||||
port: 80
|
port: 80
|
||||||
scheme: HTTP
|
scheme: HTTP
|
||||||
initialDelaySeconds: 5
|
initialDelaySeconds: 60
|
||||||
periodSeconds: 10
|
periodSeconds: 60
|
||||||
livenessProbe:
|
livenessProbe:
|
||||||
httpGet:
|
httpGet:
|
||||||
path: /hc
|
path: /liveness
|
||||||
port: 80
|
port: 80
|
||||||
scheme: HTTP
|
scheme: HTTP
|
||||||
initialDelaySeconds: 60
|
initialDelaySeconds: 120
|
||||||
periodSeconds: 10
|
periodSeconds: 60
|
||||||
imagePullSecrets:
|
imagePullSecrets:
|
||||||
- name: registry-key
|
- name: registry-key
|
||||||
---
|
---
|
||||||
@ -259,6 +259,71 @@ spec:
|
|||||||
configMapKeyRef:
|
configMapKeyRef:
|
||||||
name: urls
|
name: urls
|
||||||
key: IdentityUrl
|
key: IdentityUrl
|
||||||
|
- name: ApplicationInsights__InstrumentationKey
|
||||||
|
valueFrom:
|
||||||
|
configMapKeyRef:
|
||||||
|
name: externalcfg
|
||||||
|
key: Instrumentation_Key
|
||||||
|
- name: UseLoadTest
|
||||||
|
valueFrom:
|
||||||
|
configMapKeyRef:
|
||||||
|
name: externalcfg
|
||||||
|
key: EnableLoadTest
|
||||||
|
- name: OrchestratorType
|
||||||
|
value: 'K8S'
|
||||||
|
ports:
|
||||||
|
- containerPort: 80
|
||||||
|
readinessProbe:
|
||||||
|
httpGet:
|
||||||
|
path: /hc
|
||||||
|
port: 80
|
||||||
|
scheme: HTTP
|
||||||
|
initialDelaySeconds: 60
|
||||||
|
periodSeconds: 60
|
||||||
|
livenessProbe:
|
||||||
|
httpGet:
|
||||||
|
path: /liveness
|
||||||
|
port: 80
|
||||||
|
scheme: HTTP
|
||||||
|
initialDelaySeconds: 120
|
||||||
|
periodSeconds: 60
|
||||||
|
imagePullSecrets:
|
||||||
|
- name: registry-key
|
||||||
|
---
|
||||||
|
apiVersion: extensions/v1beta1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
name: orderingbackground
|
||||||
|
spec:
|
||||||
|
paused: true
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: eshop
|
||||||
|
component: orderingbackground
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- name: orderingbackground
|
||||||
|
image: eshop/ordering.backgroundtasks
|
||||||
|
imagePullPolicy: Always
|
||||||
|
env:
|
||||||
|
- name: PATH_BASE
|
||||||
|
value: /ordering-backgroundtasks
|
||||||
|
- name: ConnectionString
|
||||||
|
valueFrom:
|
||||||
|
configMapKeyRef:
|
||||||
|
name: externalcfg
|
||||||
|
key: OrderingSqlDb
|
||||||
|
- name: EventBusConnection
|
||||||
|
valueFrom:
|
||||||
|
configMapKeyRef:
|
||||||
|
name: externalcfg
|
||||||
|
key: OrderingBus
|
||||||
|
- name: AzureServiceBusEnabled
|
||||||
|
valueFrom:
|
||||||
|
configMapKeyRef:
|
||||||
|
name: externalcfg
|
||||||
|
key: UseAzureServiceBus
|
||||||
- name: CheckUpdateTime
|
- name: CheckUpdateTime
|
||||||
valueFrom:
|
valueFrom:
|
||||||
configMapKeyRef:
|
configMapKeyRef:
|
||||||
@ -288,15 +353,15 @@ spec:
|
|||||||
path: /hc
|
path: /hc
|
||||||
port: 80
|
port: 80
|
||||||
scheme: HTTP
|
scheme: HTTP
|
||||||
initialDelaySeconds: 5
|
initialDelaySeconds: 60
|
||||||
periodSeconds: 10
|
periodSeconds: 60
|
||||||
livenessProbe:
|
livenessProbe:
|
||||||
httpGet:
|
httpGet:
|
||||||
path: /hc
|
path: /liveness
|
||||||
port: 80
|
port: 80
|
||||||
scheme: HTTP
|
scheme: HTTP
|
||||||
initialDelaySeconds: 60
|
initialDelaySeconds: 120
|
||||||
periodSeconds: 10
|
periodSeconds: 60
|
||||||
imagePullSecrets:
|
imagePullSecrets:
|
||||||
- name: registry-key
|
- name: registry-key
|
||||||
---
|
---
|
||||||
@ -368,15 +433,15 @@ spec:
|
|||||||
path: /hc
|
path: /hc
|
||||||
port: 80
|
port: 80
|
||||||
scheme: HTTP
|
scheme: HTTP
|
||||||
initialDelaySeconds: 5
|
initialDelaySeconds: 50
|
||||||
periodSeconds: 10
|
periodSeconds: 60
|
||||||
livenessProbe:
|
livenessProbe:
|
||||||
httpGet:
|
httpGet:
|
||||||
path: /hc
|
path: /liveness
|
||||||
port: 80
|
port: 80
|
||||||
scheme: HTTP
|
scheme: HTTP
|
||||||
initialDelaySeconds: 60
|
initialDelaySeconds: 120
|
||||||
periodSeconds: 10
|
periodSeconds: 60
|
||||||
imagePullSecrets:
|
imagePullSecrets:
|
||||||
- name: registry-key
|
- name: registry-key
|
||||||
---
|
---
|
||||||
@ -458,15 +523,15 @@ spec:
|
|||||||
path: /hc
|
path: /hc
|
||||||
port: 80
|
port: 80
|
||||||
scheme: HTTP
|
scheme: HTTP
|
||||||
initialDelaySeconds: 5
|
initialDelaySeconds: 60
|
||||||
periodSeconds: 10
|
periodSeconds: 60
|
||||||
livenessProbe:
|
livenessProbe:
|
||||||
httpGet:
|
httpGet:
|
||||||
path: /hc
|
path: /liveness
|
||||||
port: 80
|
port: 80
|
||||||
scheme: HTTP
|
scheme: HTTP
|
||||||
initialDelaySeconds: 60
|
initialDelaySeconds: 120
|
||||||
periodSeconds: 10
|
periodSeconds: 60
|
||||||
imagePullSecrets:
|
imagePullSecrets:
|
||||||
- name: registry-key
|
- name: registry-key
|
||||||
---
|
---
|
||||||
@ -513,15 +578,15 @@ spec:
|
|||||||
path: /hc
|
path: /hc
|
||||||
port: 80
|
port: 80
|
||||||
scheme: HTTP
|
scheme: HTTP
|
||||||
initialDelaySeconds: 5
|
initialDelaySeconds: 60
|
||||||
periodSeconds: 10
|
periodSeconds: 60
|
||||||
livenessProbe:
|
livenessProbe:
|
||||||
httpGet:
|
httpGet:
|
||||||
path: /hc
|
path: /liveness
|
||||||
port: 80
|
port: 80
|
||||||
scheme: HTTP
|
scheme: HTTP
|
||||||
initialDelaySeconds: 60
|
initialDelaySeconds: 120
|
||||||
periodSeconds: 10
|
periodSeconds: 60
|
||||||
imagePullSecrets:
|
imagePullSecrets:
|
||||||
- name: registry-key
|
- name: registry-key
|
||||||
---
|
---
|
||||||
@ -635,15 +700,15 @@ spec:
|
|||||||
path: /hc
|
path: /hc
|
||||||
port: 80
|
port: 80
|
||||||
scheme: HTTP
|
scheme: HTTP
|
||||||
initialDelaySeconds: 5
|
initialDelaySeconds: 60
|
||||||
periodSeconds: 10
|
periodSeconds: 60
|
||||||
livenessProbe:
|
livenessProbe:
|
||||||
httpGet:
|
httpGet:
|
||||||
path: /hc
|
path: /liveness
|
||||||
port: 80
|
port: 80
|
||||||
scheme: HTTP
|
scheme: HTTP
|
||||||
initialDelaySeconds: 60
|
initialDelaySeconds: 120
|
||||||
periodSeconds: 10
|
periodSeconds: 60
|
||||||
imagePullSecrets:
|
imagePullSecrets:
|
||||||
- name: registry-key
|
- name: registry-key
|
||||||
---
|
---
|
||||||
@ -828,14 +893,14 @@ spec:
|
|||||||
path: /hc
|
path: /hc
|
||||||
port: 80
|
port: 80
|
||||||
scheme: HTTP
|
scheme: HTTP
|
||||||
initialDelaySeconds: 5
|
initialDelaySeconds: 60
|
||||||
periodSeconds: 10
|
periodSeconds: 60
|
||||||
livenessProbe:
|
livenessProbe:
|
||||||
httpGet:
|
httpGet:
|
||||||
path: /hc
|
path: /liveness
|
||||||
port: 80
|
port: 80
|
||||||
scheme: HTTP
|
scheme: HTTP
|
||||||
initialDelaySeconds: 60
|
initialDelaySeconds: 120
|
||||||
periodSeconds: 10
|
periodSeconds: 60
|
||||||
imagePullSecrets:
|
imagePullSecrets:
|
||||||
- name: registry-key
|
- name: registry-key
|
||||||
|
5
k8s/eshop-namespace.yaml
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
apiVersion: v1
|
||||||
|
kind: Namespace
|
||||||
|
metadata:
|
||||||
|
name: eshop
|
||||||
|
|
@ -27,7 +27,7 @@ spec:
|
|||||||
spec:
|
spec:
|
||||||
containers:
|
containers:
|
||||||
- name: nginx
|
- name: nginx
|
||||||
image: nginx:1.11.10-alpine
|
image: nginx:1.13.8-alpine
|
||||||
imagePullPolicy: IfNotPresent
|
imagePullPolicy: IfNotPresent
|
||||||
ports:
|
ports:
|
||||||
- containerPort: 8080
|
- containerPort: 8080
|
||||||
|
33
k8s/gen-k8s-env-aks.ps1
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
Param(
|
||||||
|
[parameter(Mandatory=$true)][string]$resourceGroupName,
|
||||||
|
[parameter(Mandatory=$true)][string]$location,
|
||||||
|
[parameter(Mandatory=$false)][string]$registryName,
|
||||||
|
[parameter(Mandatory=$true)][string]$serviceName,
|
||||||
|
[parameter(Mandatory=$true)][string]$dnsName,
|
||||||
|
[parameter(Mandatory=$true)][string]$createAcr=$true,
|
||||||
|
[parameter(Mandatory=$false)][int]$nodeCount=2,
|
||||||
|
[parameter(Mandatory=$false)][string]$nodeVMSize="Standard_D2_v2",
|
||||||
|
[parameter(Mandatory=$false)][string]$kubernetesVersion="1.7.7"
|
||||||
|
)
|
||||||
|
|
||||||
|
# Create resource group
|
||||||
|
Write-Host "Creating resource group..." -ForegroundColor Yellow
|
||||||
|
az group create --name=$resourceGroupName --location=$location
|
||||||
|
|
||||||
|
if ($createAcr -eq $true) {
|
||||||
|
# Create Azure Container Registry
|
||||||
|
Write-Host "Creating Azure Container Registry..." -ForegroundColor Yellow
|
||||||
|
az acr create -n $registryName -g $resourceGroupName -l $location --admin-enabled true --sku Basic
|
||||||
|
}
|
||||||
|
|
||||||
|
# Create kubernetes orchestrator
|
||||||
|
Write-Host "Creating kubernetes orchestrator..." -ForegroundColor Yellow
|
||||||
|
az aks create --resource-group=$resourceGroupName --name=$serviceName --dns-name-prefix=$dnsName --generate-ssh-keys --node-count=$nodeCount --node-vm-size=$nodeVMSize --kubernetes-version $kubernetesVersion
|
||||||
|
|
||||||
|
# Retrieve kubernetes cluster configuration and save it under ~/.kube/config
|
||||||
|
az aks get-credentials --resource-group=$resourceGroupName --name=$serviceName
|
||||||
|
|
||||||
|
if ($createAcr -eq $true) {
|
||||||
|
# Show ACR credentials
|
||||||
|
az acr credential show -n $registryName
|
||||||
|
}
|
Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 26 KiB |
Before Width: | Height: | Size: 50 KiB After Width: | Height: | Size: 50 KiB |
Before Width: | Height: | Size: 31 KiB After Width: | Height: | Size: 31 KiB |
Before Width: | Height: | Size: 30 KiB After Width: | Height: | Size: 30 KiB |
55
k8s/ingress.yaml
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
apiVersion: extensions/v1beta1
|
||||||
|
kind: Ingress
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: eshop
|
||||||
|
component: frontend
|
||||||
|
name: eshop-ingress
|
||||||
|
annotations:
|
||||||
|
ingress.kubernetes.io/ssl-redirect: "false"
|
||||||
|
spec:
|
||||||
|
rules:
|
||||||
|
- http:
|
||||||
|
paths:
|
||||||
|
- path: /basket-api
|
||||||
|
backend:
|
||||||
|
serviceName: basket
|
||||||
|
servicePort: 80
|
||||||
|
- path: /catalog-api
|
||||||
|
backend:
|
||||||
|
serviceName: catalog
|
||||||
|
servicePort: 80
|
||||||
|
- path: /identity
|
||||||
|
backend:
|
||||||
|
serviceName: identity
|
||||||
|
servicePort: 80
|
||||||
|
- path: /ordering-api
|
||||||
|
backend:
|
||||||
|
serviceName: ordering
|
||||||
|
servicePort: 80
|
||||||
|
- path: /webmvc
|
||||||
|
backend:
|
||||||
|
serviceName: webmvc
|
||||||
|
servicePort: 80
|
||||||
|
- path: /webstatus
|
||||||
|
backend:
|
||||||
|
serviceName: webstatus
|
||||||
|
servicePort: 80
|
||||||
|
- path: /marketing-api
|
||||||
|
backend:
|
||||||
|
serviceName: marketing
|
||||||
|
servicePort: 80
|
||||||
|
- path: /payment-api
|
||||||
|
backend:
|
||||||
|
serviceName: payment
|
||||||
|
servicePort: 80
|
||||||
|
- path: /locations-api
|
||||||
|
backend:
|
||||||
|
serviceName: locations
|
||||||
|
servicePort: 80
|
||||||
|
- path: /
|
||||||
|
backend:
|
||||||
|
serviceName: webspa
|
||||||
|
servicePort: 80
|
||||||
|
|
||||||
|
|
19
k8s/nginx-ingress/azure/service.yaml
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
kind: Service
|
||||||
|
apiVersion: v1
|
||||||
|
metadata:
|
||||||
|
name: ingress-nginx
|
||||||
|
namespace: ingress-nginx
|
||||||
|
labels:
|
||||||
|
app: ingress-nginx
|
||||||
|
spec:
|
||||||
|
externalTrafficPolicy: Local
|
||||||
|
type: LoadBalancer
|
||||||
|
selector:
|
||||||
|
app: ingress-nginx
|
||||||
|
ports:
|
||||||
|
- name: http
|
||||||
|
port: 80
|
||||||
|
targetPort: http
|
||||||
|
- name: https
|
||||||
|
port: 443
|
||||||
|
targetPort: https
|
11
k8s/nginx-ingress/configmap.yaml
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
kind: ConfigMap
|
||||||
|
apiVersion: v1
|
||||||
|
metadata:
|
||||||
|
name: nginx-configuration
|
||||||
|
namespace: ingress-nginx
|
||||||
|
labels:
|
||||||
|
app: ingress-nginx
|
||||||
|
data:
|
||||||
|
ssl-redirect: "false"
|
||||||
|
proxy-buffer-size: "128k"
|
||||||
|
proxy-buffers: "4 256k"
|
52
k8s/nginx-ingress/default-backend.yaml
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
apiVersion: extensions/v1beta1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
name: default-http-backend
|
||||||
|
labels:
|
||||||
|
app: default-http-backend
|
||||||
|
namespace: ingress-nginx
|
||||||
|
spec:
|
||||||
|
replicas: 1
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: default-http-backend
|
||||||
|
spec:
|
||||||
|
terminationGracePeriodSeconds: 60
|
||||||
|
containers:
|
||||||
|
- name: default-http-backend
|
||||||
|
# Any image is permissable as long as:
|
||||||
|
# 1. It serves a 404 page at /
|
||||||
|
# 2. It serves 200 on a /healthz endpoint
|
||||||
|
image: gcr.io/google_containers/defaultbackend:1.4
|
||||||
|
livenessProbe:
|
||||||
|
httpGet:
|
||||||
|
path: /healthz
|
||||||
|
port: 8080
|
||||||
|
scheme: HTTP
|
||||||
|
initialDelaySeconds: 30
|
||||||
|
timeoutSeconds: 5
|
||||||
|
ports:
|
||||||
|
- containerPort: 8080
|
||||||
|
resources:
|
||||||
|
limits:
|
||||||
|
cpu: 10m
|
||||||
|
memory: 20Mi
|
||||||
|
requests:
|
||||||
|
cpu: 10m
|
||||||
|
memory: 20Mi
|
||||||
|
---
|
||||||
|
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Service
|
||||||
|
metadata:
|
||||||
|
name: default-http-backend
|
||||||
|
namespace: ingress-nginx
|
||||||
|
labels:
|
||||||
|
app: default-http-backend
|
||||||
|
spec:
|
||||||
|
ports:
|
||||||
|
- port: 80
|
||||||
|
targetPort: 8080
|
||||||
|
selector:
|
||||||
|
app: default-http-backend
|
4
k8s/nginx-ingress/namespace.yaml
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
apiVersion: v1
|
||||||
|
kind: Namespace
|
||||||
|
metadata:
|
||||||
|
name: ingress-nginx
|
40
k8s/nginx-ingress/patch-service-without-rbac.yaml
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
apiVersion: extensions/v1beta1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
name: nginx-ingress-controller
|
||||||
|
namespace: ingress-nginx
|
||||||
|
spec:
|
||||||
|
replicas: 1
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app: ingress-nginx
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: ingress-nginx
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- name: nginx-ingress-controller
|
||||||
|
image: quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.9.0
|
||||||
|
args:
|
||||||
|
- /nginx-ingress-controller
|
||||||
|
- --default-backend-service=$(POD_NAMESPACE)/default-http-backend
|
||||||
|
- --configmap=$(POD_NAMESPACE)/nginx-configuration
|
||||||
|
- --tcp-services-configmap=$(POD_NAMESPACE)/tcp-services
|
||||||
|
- --udp-services-configmap=$(POD_NAMESPACE)/udp-services
|
||||||
|
- --publish-service=$(POD_NAMESPACE)/ingress-nginx
|
||||||
|
- --annotations-prefix=nginx.ingress.kubernetes.io
|
||||||
|
env:
|
||||||
|
- name: POD_NAME
|
||||||
|
valueFrom:
|
||||||
|
fieldRef:
|
||||||
|
fieldPath: metadata.name
|
||||||
|
- name: POD_NAMESPACE
|
||||||
|
valueFrom:
|
||||||
|
fieldRef:
|
||||||
|
fieldPath: metadata.namespace
|
||||||
|
ports:
|
||||||
|
- name: http
|
||||||
|
containerPort: 80
|
||||||
|
- name: https
|
||||||
|
containerPort: 443
|
7
k8s/nginx-ingress/publish-service-patch.yaml
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
'op': 'add',
|
||||||
|
'path': '/spec/template/spec/containers/0/args/-',
|
||||||
|
'value': '--publish-service=$(POD_NAMESPACE)/ingress-nginx'
|
||||||
|
}
|
||||||
|
]
|
5
k8s/nginx-ingress/tcp-services-configmap.yaml
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
kind: ConfigMap
|
||||||
|
apiVersion: v1
|
||||||
|
metadata:
|
||||||
|
name: tcp-services
|
||||||
|
namespace: ingress-nginx
|
5
k8s/nginx-ingress/udp-services-configmap.yaml
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
kind: ConfigMap
|
||||||
|
apiVersion: v1
|
||||||
|
metadata:
|
||||||
|
name: udp-services
|
||||||
|
namespace: ingress-nginx
|
61
k8s/nginx-ingress/without-rbac.yaml
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
apiVersion: extensions/v1beta1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
name: nginx-ingress-controller
|
||||||
|
namespace: ingress-nginx
|
||||||
|
spec:
|
||||||
|
replicas: 1
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app: ingress-nginx
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: ingress-nginx
|
||||||
|
annotations:
|
||||||
|
prometheus.io/port: '10254'
|
||||||
|
prometheus.io/scrape: 'true'
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- name: nginx-ingress-controller
|
||||||
|
image: quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.9.0
|
||||||
|
args:
|
||||||
|
- /nginx-ingress-controller
|
||||||
|
- --default-backend-service=$(POD_NAMESPACE)/default-http-backend
|
||||||
|
- --configmap=$(POD_NAMESPACE)/nginx-configuration
|
||||||
|
- --tcp-services-configmap=$(POD_NAMESPACE)/tcp-services
|
||||||
|
- --udp-services-configmap=$(POD_NAMESPACE)/udp-services
|
||||||
|
- --annotations-prefix=nginx.ingress.kubernetes.io
|
||||||
|
env:
|
||||||
|
- name: POD_NAME
|
||||||
|
valueFrom:
|
||||||
|
fieldRef:
|
||||||
|
fieldPath: metadata.name
|
||||||
|
- name: POD_NAMESPACE
|
||||||
|
valueFrom:
|
||||||
|
fieldRef:
|
||||||
|
fieldPath: metadata.namespace
|
||||||
|
ports:
|
||||||
|
- name: http
|
||||||
|
containerPort: 80
|
||||||
|
- name: https
|
||||||
|
containerPort: 443
|
||||||
|
livenessProbe:
|
||||||
|
failureThreshold: 3
|
||||||
|
httpGet:
|
||||||
|
path: /healthz
|
||||||
|
port: 10254
|
||||||
|
scheme: HTTP
|
||||||
|
initialDelaySeconds: 10
|
||||||
|
periodSeconds: 10
|
||||||
|
successThreshold: 1
|
||||||
|
timeoutSeconds: 1
|
||||||
|
readinessProbe:
|
||||||
|
failureThreshold: 3
|
||||||
|
httpGet:
|
||||||
|
path: /healthz
|
||||||
|
port: 10254
|
||||||
|
scheme: HTTP
|
||||||
|
periodSeconds: 10
|
||||||
|
successThreshold: 1
|
||||||
|
timeoutSeconds: 1
|
@ -1,98 +0,0 @@
|
|||||||
pid /tmp/nginx.pid;
|
|
||||||
|
|
||||||
worker_processes 1;
|
|
||||||
|
|
||||||
events {
|
|
||||||
worker_connections 1024;
|
|
||||||
}
|
|
||||||
|
|
||||||
http {
|
|
||||||
server_tokens off;
|
|
||||||
|
|
||||||
add_header X-Frame-Options SAMEORIGIN;
|
|
||||||
add_header X-Content-Type-Options nosniff;
|
|
||||||
add_header X-XSS-Protection "1; mode=block";
|
|
||||||
|
|
||||||
client_body_temp_path /tmp/client_body;
|
|
||||||
fastcgi_temp_path /tmp/fastcgi_temp;
|
|
||||||
proxy_temp_path /tmp/proxy_temp;
|
|
||||||
scgi_temp_path /tmp/scgi_temp;
|
|
||||||
uwsgi_temp_path /tmp/uwsgi_temp;
|
|
||||||
|
|
||||||
gzip on;
|
|
||||||
gzip_comp_level 6;
|
|
||||||
gzip_min_length 1024;
|
|
||||||
gzip_buffers 4 32k;
|
|
||||||
gzip_types text/plain application/javascript text/css;
|
|
||||||
gzip_vary on;
|
|
||||||
|
|
||||||
keepalive_timeout 65;
|
|
||||||
|
|
||||||
proxy_buffer_size 128k;
|
|
||||||
proxy_buffers 4 256k;
|
|
||||||
proxy_busy_buffers_size 256k;
|
|
||||||
|
|
||||||
server {
|
|
||||||
listen 8080;
|
|
||||||
|
|
||||||
location /basket-api {
|
|
||||||
proxy_pass http://basket;
|
|
||||||
proxy_redirect off;
|
|
||||||
proxy_set_header Host $host;
|
|
||||||
}
|
|
||||||
|
|
||||||
location /catalog-api {
|
|
||||||
proxy_pass http://catalog;
|
|
||||||
proxy_redirect off;
|
|
||||||
proxy_set_header Host $host;
|
|
||||||
}
|
|
||||||
|
|
||||||
location /identity {
|
|
||||||
proxy_pass http://identity;
|
|
||||||
proxy_redirect off;
|
|
||||||
proxy_set_header Host $host;
|
|
||||||
}
|
|
||||||
|
|
||||||
location /ordering-api {
|
|
||||||
proxy_pass http://ordering;
|
|
||||||
proxy_redirect off;
|
|
||||||
proxy_set_header Host $host;
|
|
||||||
}
|
|
||||||
|
|
||||||
location /webmvc {
|
|
||||||
proxy_pass http://webmvc;
|
|
||||||
proxy_redirect off;
|
|
||||||
proxy_set_header Host $host;
|
|
||||||
}
|
|
||||||
|
|
||||||
location /webstatus {
|
|
||||||
proxy_pass http://webstatus;
|
|
||||||
proxy_redirect off;
|
|
||||||
proxy_set_header Host $host;
|
|
||||||
}
|
|
||||||
|
|
||||||
location /marketing-api {
|
|
||||||
proxy_pass http://marketing;
|
|
||||||
proxy_redirect off;
|
|
||||||
proxy_set_header Host $host;
|
|
||||||
}
|
|
||||||
|
|
||||||
location /payment-api {
|
|
||||||
proxy_pass http://payment;
|
|
||||||
proxy_redirect off;
|
|
||||||
proxy_set_header Host $host;
|
|
||||||
}
|
|
||||||
|
|
||||||
location /locations-api {
|
|
||||||
proxy_pass http://locations;
|
|
||||||
proxy_redirect off;
|
|
||||||
proxy_set_header Host $host;
|
|
||||||
}
|
|
||||||
|
|
||||||
location / {
|
|
||||||
proxy_pass http://webspa;
|
|
||||||
proxy_redirect off;
|
|
||||||
proxy_set_header Host $host;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -56,6 +56,20 @@ spec:
|
|||||||
---
|
---
|
||||||
apiVersion: v1
|
apiVersion: v1
|
||||||
kind: Service
|
kind: Service
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: eshop
|
||||||
|
component: orderingbackground
|
||||||
|
name: orderingbackground
|
||||||
|
spec:
|
||||||
|
ports:
|
||||||
|
- port: 80
|
||||||
|
selector:
|
||||||
|
app: eshop
|
||||||
|
component: orderingbackground
|
||||||
|
---
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Service
|
||||||
metadata:
|
metadata:
|
||||||
labels:
|
labels:
|
||||||
app: eshop
|
app: eshop
|
||||||
|
@ -43,9 +43,16 @@ PicBaseUrl=${ESHOP_AZURE_STORAGE_CATALOG:-http://${ESHOP_PROD_EXTERNAL_DNS_NAME_
|
|||||||
|
|
||||||
So, use `ESHOP_AZURE_STORAGE_CATALOG` if set, and if not use `http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5101/api/v1/catalog/items/[0]/pic/}`. Unfortunately seems that docker-compose do not substitute variables inside variables, so the value that `PicBaseUrl` gets if `ESHOP_AZURE_STORAGE_CATALOG` is not set is literally `http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5101/api/v1/catalog/items/[0]/pic/}` without any substitution.
|
So, use `ESHOP_AZURE_STORAGE_CATALOG` if set, and if not use `http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5101/api/v1/catalog/items/[0]/pic/}`. Unfortunately seems that docker-compose do not substitute variables inside variables, so the value that `PicBaseUrl` gets if `ESHOP_AZURE_STORAGE_CATALOG` is not set is literally `http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5101/api/v1/catalog/items/[0]/pic/}` without any substitution.
|
||||||
|
|
||||||
## Build container (Optional)
|
## Build container (DEPRECATED)
|
||||||
|
|
||||||
* `docker-compose.ci.build.yml`: This file is for starting the build container to build the project using a container that has all needed dependencies.
|
NOTE that since we support Docker MULTI-STAGE builds (support in VS 2017 since December 2017), the build container is no loger needed in CI/CD pipelines as a similar process is done by Docker itself under the covers with the multi-stage builds.
|
||||||
|
For more info on Docker Multi-Stage, read:
|
||||||
|
|
||||||
|
https://docs.docker.com/develop/develop-images/multistage-build/
|
||||||
|
|
||||||
|
https://blogs.msdn.microsoft.com/stevelasker/2017/09/11/net-and-multistage-dockerfiles/
|
||||||
|
|
||||||
|
* `docker-compose.ci.build.yml`: This file is for starting the build container to build the project using a container that has all needed prerequisites. Refer to [corresponding wiki section](https://github.com/dotnet-architecture/eShopOnContainers/wiki/03.-Setting-the-eShopOnContainers-solution-up-in-a-Windows-CLI-environment-(dotnet-CLI,-Docker-CLI-and-VS-Code)#build-the-bits-through-the-build-container-image) for more information.
|
||||||
|
|
||||||
**For more information** about docker-compose variable substitution read the [compose docs](https://docs.docker.com/compose/compose-file/#variable-substitution).
|
**For more information** about docker-compose variable substitution read the [compose docs](https://docs.docker.com/compose/compose-file/#variable-substitution).
|
||||||
|
|
||||||
|
@ -1,13 +0,0 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
|
||||||
|
|
||||||
<PropertyGroup>
|
|
||||||
<TargetFramework>netstandard1.5</TargetFramework>
|
|
||||||
<RootNamespace>Microsoft.eShopOnContainers.BuildingBlocks</RootNamespace>
|
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<PackageReference Include="Microsoft.AspNetCore.DataProtection" Version="1.1.2" />
|
|
||||||
<PackageReference Include="StackExchange.Redis.StrongName" Version="1.2.4" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
</Project>
|
|
@ -1,97 +0,0 @@
|
|||||||
namespace Microsoft.eShopOnContainers.BuildingBlocks
|
|
||||||
{
|
|
||||||
using Microsoft.AspNetCore.DataProtection;
|
|
||||||
using Microsoft.AspNetCore.DataProtection.Repositories;
|
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
|
||||||
using Microsoft.Extensions.Logging;
|
|
||||||
using StackExchange.Redis;
|
|
||||||
using System;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Net;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Extension methods for <see cref="IDataProtectionBuilder"/> for configuring
|
|
||||||
/// data protection options.
|
|
||||||
/// </summary>
|
|
||||||
public static class DataProtectionBuilderExtensions
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Sets up data protection to persist session keys in Redis.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="builder">The <see cref="IDataProtectionBuilder"/> used to set up data protection options.</param>
|
|
||||||
/// <param name="redisConnectionString">The connection string specifying the Redis instance and database for key storage.</param>
|
|
||||||
/// <returns>
|
|
||||||
/// The <paramref name="builder" /> for continued configuration.
|
|
||||||
/// </returns>
|
|
||||||
/// <exception cref="System.ArgumentNullException">
|
|
||||||
/// Thrown if <paramref name="builder" /> or <paramref name="redisConnectionString" /> is <see langword="null" />.
|
|
||||||
/// </exception>
|
|
||||||
/// <exception cref="System.ArgumentException">
|
|
||||||
/// Thrown if <paramref name="redisConnectionString" /> is empty.
|
|
||||||
/// </exception>
|
|
||||||
public static IDataProtectionBuilder PersistKeysToRedis(this IDataProtectionBuilder builder, string redisConnectionString)
|
|
||||||
{
|
|
||||||
if (builder == null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException(nameof(builder));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (redisConnectionString == null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException(nameof(redisConnectionString));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (redisConnectionString.Length == 0)
|
|
||||||
{
|
|
||||||
throw new ArgumentException("Redis connection string may not be empty.", nameof(redisConnectionString));
|
|
||||||
}
|
|
||||||
|
|
||||||
var configuration = ConfigurationOptions.Parse(redisConnectionString, true);
|
|
||||||
configuration.ResolveDns = true;
|
|
||||||
|
|
||||||
return builder.Use(ServiceDescriptor.Singleton<IXmlRepository>(services =>
|
|
||||||
new RedisXmlRepository(configuration, services.GetRequiredService<ILogger<RedisXmlRepository>>())));
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Updates an <see cref="IDataProtectionBuilder"/> to use the service of
|
|
||||||
/// a specific type, removing all other services of that type.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="builder">The <see cref="IDataProtectionBuilder"/> that should use the specified service.</param>
|
|
||||||
/// <param name="descriptor">The <see cref="ServiceDescriptor"/> with the service the <paramref name="builder" /> should use.</param>
|
|
||||||
/// <returns>
|
|
||||||
/// The <paramref name="builder" /> for continued configuration.
|
|
||||||
/// </returns>
|
|
||||||
/// <exception cref="System.ArgumentNullException">
|
|
||||||
/// Thrown if <paramref name="builder" /> or <paramref name="descriptor" /> is <see langword="null" />.
|
|
||||||
/// </exception>
|
|
||||||
public static IDataProtectionBuilder Use(this IDataProtectionBuilder builder, ServiceDescriptor descriptor)
|
|
||||||
{
|
|
||||||
// This algorithm of removing all other services of a specific type
|
|
||||||
// before adding the new/replacement service is how the base ASP.NET
|
|
||||||
// DataProtection bits work. Due to some of the differences in how
|
|
||||||
// that base set of bits handles DI, it's better to follow suit
|
|
||||||
// and work in the same way than to try and debug weird issues.
|
|
||||||
if (builder == null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException(nameof(builder));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (descriptor == null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException(nameof(descriptor));
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int i = builder.Services.Count - 1; i >= 0; i--)
|
|
||||||
{
|
|
||||||
if (builder.Services[i]?.ServiceType == descriptor.ServiceType)
|
|
||||||
{
|
|
||||||
builder.Services.RemoveAt(i);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
builder.Services.Add(descriptor);
|
|
||||||
return builder;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,210 +0,0 @@
|
|||||||
namespace Microsoft.eShopOnContainers.BuildingBlocks
|
|
||||||
{
|
|
||||||
using Microsoft.AspNetCore.DataProtection.Repositories;
|
|
||||||
using Microsoft.Extensions.Logging;
|
|
||||||
using StackExchange.Redis;
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Text.RegularExpressions;
|
|
||||||
using System.Xml.Linq;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Key repository that stores XML encrypted keys in a Redis distributed cache.
|
|
||||||
/// </summary>
|
|
||||||
/// <remarks>
|
|
||||||
/// <para>
|
|
||||||
/// The values stored in Redis are XML documents that contain encrypted session
|
|
||||||
/// keys used for the protection of things like session state. The document contents
|
|
||||||
/// are double-encrypted - first with a changing session key; then by a master key.
|
|
||||||
/// As such, there's no risk in storing the keys in Redis - even if someone can crack
|
|
||||||
/// the master key, they still need to also crack the session key. (Other solutions
|
|
||||||
/// for sharing keys across a farm environment include writing them to files
|
|
||||||
/// on a file share.)
|
|
||||||
/// </para>
|
|
||||||
/// <para>
|
|
||||||
/// While the repository uses a hash to keep the set of encrypted keys separate, you
|
|
||||||
/// can further separate these items from other items in Redis by specifying a unique
|
|
||||||
/// database in the connection string.
|
|
||||||
/// </para>
|
|
||||||
/// <para>
|
|
||||||
/// Consumers of the repository are responsible for caching the XML items as needed.
|
|
||||||
/// Typically repositories are consumed by things like <see cref="Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingProvider"/>
|
|
||||||
/// which generates <see cref="Microsoft.AspNetCore.DataProtection.KeyManagement.Internal.CacheableKeyRing"/>
|
|
||||||
/// values that get cached. The mechanism is already optimized for caching so there's
|
|
||||||
/// no need to create a redundant cache.
|
|
||||||
/// </para>
|
|
||||||
/// </remarks>
|
|
||||||
/// <seealso cref="Microsoft.AspNetCore.DataProtection.Repositories.IXmlRepository" />
|
|
||||||
/// <seealso cref="System.IDisposable" />
|
|
||||||
public class RedisXmlRepository : IXmlRepository, IDisposable
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// The root cache key for XML items stored in Redis
|
|
||||||
/// </summary>
|
|
||||||
public static readonly string RedisHashKey = "DataProtectionXmlRepository";
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// The connection to the Redis backing store.
|
|
||||||
/// </summary>
|
|
||||||
private IConnectionMultiplexer _connection;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Flag indicating whether the object has been disposed.
|
|
||||||
/// </summary>
|
|
||||||
private bool _disposed = false;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Initializes a new instance of the <see cref="RedisXmlRepository"/> class.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="connectionString">
|
|
||||||
/// The Redis connection string.
|
|
||||||
/// </param>
|
|
||||||
/// <param name="logger">
|
|
||||||
/// The <see cref="ILogger{T}"/> used to log diagnostic messages.
|
|
||||||
/// </param>
|
|
||||||
/// <exception cref="System.ArgumentNullException">
|
|
||||||
/// Thrown if <paramref name="connectionString" /> or <paramref name="logger" /> is <see langword="null" />.
|
|
||||||
/// </exception>
|
|
||||||
public RedisXmlRepository(ConfigurationOptions connectionString, ILogger<RedisXmlRepository> logger)
|
|
||||||
: this(ConnectionMultiplexer.Connect(connectionString), logger)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Initializes a new instance of the <see cref="RedisXmlRepository"/> class.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="connection">
|
|
||||||
/// The Redis database connection.
|
|
||||||
/// </param>
|
|
||||||
/// <param name="logger">
|
|
||||||
/// The <see cref="ILogger{T}"/> used to log diagnostic messages.
|
|
||||||
/// </param>
|
|
||||||
/// <exception cref="System.ArgumentNullException">
|
|
||||||
/// Thrown if <paramref name="connection" /> or <paramref name="logger" /> is <see langword="null" />.
|
|
||||||
/// </exception>
|
|
||||||
public RedisXmlRepository(IConnectionMultiplexer connection, ILogger<RedisXmlRepository> logger)
|
|
||||||
{
|
|
||||||
if (connection == null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException(nameof(connection));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (logger == null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException(nameof(logger));
|
|
||||||
}
|
|
||||||
|
|
||||||
this._connection = connection;
|
|
||||||
this.Logger = logger;
|
|
||||||
|
|
||||||
// Mask the password so it doesn't get logged.
|
|
||||||
var configuration = Regex.Replace(this._connection.Configuration, @"password\s*=\s*[^,]*", "password=****", RegexOptions.IgnoreCase);
|
|
||||||
this.Logger.LogDebug("Storing data protection keys in Redis: {RedisConfiguration}", configuration);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Gets the logger.
|
|
||||||
/// </summary>
|
|
||||||
/// <value>
|
|
||||||
/// The <see cref="ILogger{T}"/> used to log diagnostic messages.
|
|
||||||
/// </value>
|
|
||||||
public ILogger<RedisXmlRepository> Logger { get; private set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Performs application-defined tasks associated with freeing, releasing,
|
|
||||||
/// or resetting unmanaged resources.
|
|
||||||
/// </summary>
|
|
||||||
public void Dispose()
|
|
||||||
{
|
|
||||||
this.Dispose(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Gets all top-level XML elements in the repository.
|
|
||||||
/// </summary>
|
|
||||||
/// <returns>
|
|
||||||
/// An <see cref="IReadOnlyCollection{T}"/> with the set of elements
|
|
||||||
/// stored in the repository.
|
|
||||||
/// </returns>
|
|
||||||
public IReadOnlyCollection<XElement> GetAllElements()
|
|
||||||
{
|
|
||||||
var database = this._connection.GetDatabase();
|
|
||||||
var hash = database.HashGetAll(RedisHashKey);
|
|
||||||
var elements = new List<XElement>();
|
|
||||||
|
|
||||||
if (hash == null || hash.Length == 0)
|
|
||||||
{
|
|
||||||
return elements.AsReadOnly();
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach (var item in hash.ToStringDictionary())
|
|
||||||
{
|
|
||||||
elements.Add(XElement.Parse(item.Value));
|
|
||||||
}
|
|
||||||
|
|
||||||
this.Logger.LogDebug("Read {XmlElementCount} XML elements from Redis.", elements.Count);
|
|
||||||
return elements.AsReadOnly();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Adds a top-level XML element to the repository.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="element">The element to add.</param>
|
|
||||||
/// <param name="friendlyName">
|
|
||||||
/// An optional name to be associated with the XML element.
|
|
||||||
/// For instance, if this repository stores XML files on disk, the friendly name may
|
|
||||||
/// be used as part of the file name. Repository implementations are not required to
|
|
||||||
/// observe this parameter even if it has been provided by the caller.
|
|
||||||
/// </param>
|
|
||||||
/// <remarks>
|
|
||||||
/// The <paramref name="friendlyName" /> parameter must be unique if specified.
|
|
||||||
/// For instance, it could be the ID of the key being stored.
|
|
||||||
/// </remarks>
|
|
||||||
/// <exception cref="System.ArgumentNullException">
|
|
||||||
/// Thrown if <paramref name="element" /> is <see langword="null" />.
|
|
||||||
/// </exception>
|
|
||||||
public void StoreElement(XElement element, string friendlyName)
|
|
||||||
{
|
|
||||||
if (element == null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException(nameof(element));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (string.IsNullOrEmpty(friendlyName))
|
|
||||||
{
|
|
||||||
// The framework always passes in a name, but
|
|
||||||
// the contract indicates this may be null or empty.
|
|
||||||
friendlyName = Guid.NewGuid().ToString();
|
|
||||||
}
|
|
||||||
|
|
||||||
this.Logger.LogDebug("Storing XML element with friendly name {XmlElementFriendlyName}.", friendlyName);
|
|
||||||
|
|
||||||
this._connection.GetDatabase().HashSet(RedisHashKey, friendlyName, element.ToString());
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Releases unmanaged and - optionally - managed resources.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="disposing">
|
|
||||||
/// <see langword="true" /> to release both managed and unmanaged resources;
|
|
||||||
/// <see langword="false" /> to release only unmanaged resources.
|
|
||||||
/// </param>
|
|
||||||
protected virtual void Dispose(bool disposing)
|
|
||||||
{
|
|
||||||
if (!this._disposed)
|
|
||||||
{
|
|
||||||
if (disposing)
|
|
||||||
{
|
|
||||||
if (this._connection != null)
|
|
||||||
{
|
|
||||||
this._connection.Close();
|
|
||||||
this._connection.Dispose();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
this._connection = null;
|
|
||||||
this._disposed = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -5,9 +5,12 @@ namespace Microsoft.eShopOnContainers.BuildingBlocks.EventBus.Abstractions
|
|||||||
{
|
{
|
||||||
public interface IEventBus
|
public interface IEventBus
|
||||||
{
|
{
|
||||||
|
void Publish(IntegrationEvent @event);
|
||||||
|
|
||||||
void Subscribe<T, TH>()
|
void Subscribe<T, TH>()
|
||||||
where T : IntegrationEvent
|
where T : IntegrationEvent
|
||||||
where TH : IIntegrationEventHandler<T>;
|
where TH : IIntegrationEventHandler<T>;
|
||||||
|
|
||||||
void SubscribeDynamic<TH>(string eventName)
|
void SubscribeDynamic<TH>(string eventName)
|
||||||
where TH : IDynamicIntegrationEventHandler;
|
where TH : IDynamicIntegrationEventHandler;
|
||||||
|
|
||||||
@ -17,7 +20,5 @@ namespace Microsoft.eShopOnContainers.BuildingBlocks.EventBus.Abstractions
|
|||||||
void Unsubscribe<T, TH>()
|
void Unsubscribe<T, TH>()
|
||||||
where TH : IIntegrationEventHandler<T>
|
where TH : IIntegrationEventHandler<T>
|
||||||
where T : IntegrationEvent;
|
where T : IntegrationEvent;
|
||||||
|
|
||||||
void Publish(IntegrationEvent @event);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Newtonsoft.Json" Version="10.0.3" />
|
<PackageReference Include="Newtonsoft.Json" Version="11.0.1" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
@ -1,145 +0,0 @@
|
|||||||
//using Microsoft.eShopOnContainers.BuildingBlocks.CommandBus;
|
|
||||||
using Microsoft.Extensions.Logging;
|
|
||||||
using Newtonsoft.Json;
|
|
||||||
using Polly;
|
|
||||||
using Polly.Retry;
|
|
||||||
using RabbitMQ.Client;
|
|
||||||
using RabbitMQ.Client.Events;
|
|
||||||
using RabbitMQ.Client.Exceptions;
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Net.Sockets;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
/*
|
|
||||||
namespace Microsoft.eShopOnContainers.BuildingBlocks.EventBusRabbitMQ
|
|
||||||
{
|
|
||||||
public class CommandBusRabbitMQ : ICommandBus, IDisposable
|
|
||||||
{
|
|
||||||
const string BROKER_NAME = "eshop_command_bus";
|
|
||||||
|
|
||||||
private readonly IRabbitMQPersistentConnection _persistentConnection;
|
|
||||||
private readonly ILogger<CommandBusRabbitMQ> _logger;
|
|
||||||
|
|
||||||
private IModel _consumerChannel;
|
|
||||||
private string _queueName;
|
|
||||||
|
|
||||||
private readonly Dictionary<string, IIntegrationCommandHandler> _handlers;
|
|
||||||
private readonly Dictionary<string, Type> _typeMappings;
|
|
||||||
|
|
||||||
public CommandBusRabbitMQ(IRabbitMQPersistentConnection persistentConnection,
|
|
||||||
ILogger<CommandBusRabbitMQ> logger)
|
|
||||||
{
|
|
||||||
_logger = logger;
|
|
||||||
_persistentConnection = persistentConnection;
|
|
||||||
_handlers = new Dictionary<string, IIntegrationCommandHandler>();
|
|
||||||
_typeMappings = new Dictionary<string, Type>();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Send<T>(string name, T data)
|
|
||||||
{
|
|
||||||
Send(new IntegrationCommand<T>(name, data));
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Handle<TC>(string name, IIntegrationCommandHandler<TC> handler)
|
|
||||||
{
|
|
||||||
_handlers.Add(name, handler);
|
|
||||||
_typeMappings.Add(name, typeof(TC));
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Handle(string name, IIntegrationCommandHandler handler)
|
|
||||||
{
|
|
||||||
_handlers.Add(name, handler);
|
|
||||||
}
|
|
||||||
public void Handle<TI, TC>(TI handler) where TI : IIntegrationCommandHandler<TC>
|
|
||||||
{
|
|
||||||
var name = typeof(TI).Name;
|
|
||||||
_handlers.Add(name, handler);
|
|
||||||
_typeMappings.Add(name, typeof(TC));
|
|
||||||
}
|
|
||||||
|
|
||||||
private void Send<T>(IntegrationCommand<T> command)
|
|
||||||
{
|
|
||||||
if (!_persistentConnection.IsConnected)
|
|
||||||
{
|
|
||||||
_persistentConnection.TryConnect();
|
|
||||||
}
|
|
||||||
|
|
||||||
var policy = RetryPolicy.Handle<BrokerUnreachableException>()
|
|
||||||
.Or<SocketException>()
|
|
||||||
.WaitAndRetry(5, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)), (ex, time) =>
|
|
||||||
{
|
|
||||||
_logger.LogWarning(ex.ToString());
|
|
||||||
});
|
|
||||||
|
|
||||||
using (var channel = _persistentConnection.CreateModel())
|
|
||||||
{
|
|
||||||
var commandName = command.Name;
|
|
||||||
channel.ExchangeDeclare(exchange: BROKER_NAME, type: "direct");
|
|
||||||
var message = JsonConvert.SerializeObject(command);
|
|
||||||
var body = Encoding.UTF8.GetBytes(message);
|
|
||||||
policy.Execute(() =>
|
|
||||||
{
|
|
||||||
channel.BasicPublish(exchange: BROKER_NAME,
|
|
||||||
routingKey: commandName,
|
|
||||||
basicProperties: null,
|
|
||||||
body: body);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private IModel CreateConsumerChannel()
|
|
||||||
{
|
|
||||||
if (!_persistentConnection.IsConnected)
|
|
||||||
{
|
|
||||||
_persistentConnection.TryConnect();
|
|
||||||
}
|
|
||||||
|
|
||||||
var channel = _persistentConnection.CreateModel();
|
|
||||||
|
|
||||||
channel.ExchangeDeclare(exchange: BROKER_NAME, type: "direct");
|
|
||||||
_queueName = channel.QueueDeclare().QueueName;
|
|
||||||
var consumer = new EventingBasicConsumer(channel);
|
|
||||||
consumer.Received += async (model, ea) =>
|
|
||||||
{
|
|
||||||
var commandName = ea.RoutingKey;
|
|
||||||
var message = Encoding.UTF8.GetString(ea.Body);
|
|
||||||
await InvokeHandler(commandName, message);
|
|
||||||
};
|
|
||||||
|
|
||||||
channel.BasicConsume(queue: _queueName,
|
|
||||||
noAck: true,
|
|
||||||
consumer: consumer);
|
|
||||||
|
|
||||||
channel.CallbackException += (sender, ea) =>
|
|
||||||
{
|
|
||||||
_consumerChannel.Dispose();
|
|
||||||
_consumerChannel = CreateConsumerChannel();
|
|
||||||
};
|
|
||||||
|
|
||||||
return channel;
|
|
||||||
}
|
|
||||||
|
|
||||||
private Task InvokeHandler(string commandName, string message)
|
|
||||||
{
|
|
||||||
if (_handlers.ContainsKey(commandName))
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Dispose()
|
|
||||||
{
|
|
||||||
if (_consumerChannel != null)
|
|
||||||
{
|
|
||||||
_consumerChannel.Dispose();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*/
|
|
@ -32,11 +32,12 @@ namespace Microsoft.eShopOnContainers.BuildingBlocks.EventBusRabbitMQ
|
|||||||
private string _queueName;
|
private string _queueName;
|
||||||
|
|
||||||
public EventBusRabbitMQ(IRabbitMQPersistentConnection persistentConnection, ILogger<EventBusRabbitMQ> logger,
|
public EventBusRabbitMQ(IRabbitMQPersistentConnection persistentConnection, ILogger<EventBusRabbitMQ> logger,
|
||||||
ILifetimeScope autofac, IEventBusSubscriptionsManager subsManager, int retryCount = 5)
|
ILifetimeScope autofac, IEventBusSubscriptionsManager subsManager, string queueName = null, int retryCount = 5)
|
||||||
{
|
{
|
||||||
_persistentConnection = persistentConnection ?? throw new ArgumentNullException(nameof(persistentConnection));
|
_persistentConnection = persistentConnection ?? throw new ArgumentNullException(nameof(persistentConnection));
|
||||||
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
|
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
|
||||||
_subsManager = subsManager ?? new InMemoryEventBusSubscriptionsManager();
|
_subsManager = subsManager ?? new InMemoryEventBusSubscriptionsManager();
|
||||||
|
_queueName = queueName;
|
||||||
_consumerChannel = CreateConsumerChannel();
|
_consumerChannel = CreateConsumerChannel();
|
||||||
_autofac = autofac;
|
_autofac = autofac;
|
||||||
_retryCount = retryCount;
|
_retryCount = retryCount;
|
||||||
@ -91,9 +92,13 @@ namespace Microsoft.eShopOnContainers.BuildingBlocks.EventBusRabbitMQ
|
|||||||
|
|
||||||
policy.Execute(() =>
|
policy.Execute(() =>
|
||||||
{
|
{
|
||||||
|
var properties = channel.CreateBasicProperties();
|
||||||
|
properties.DeliveryMode = 2; // persistent
|
||||||
|
|
||||||
channel.BasicPublish(exchange: BROKER_NAME,
|
channel.BasicPublish(exchange: BROKER_NAME,
|
||||||
routingKey: eventName,
|
routingKey: eventName,
|
||||||
basicProperties: null,
|
mandatory:true,
|
||||||
|
basicProperties: properties,
|
||||||
body: body);
|
body: body);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -147,7 +152,6 @@ namespace Microsoft.eShopOnContainers.BuildingBlocks.EventBusRabbitMQ
|
|||||||
_subsManager.RemoveDynamicSubscription<TH>(eventName);
|
_subsManager.RemoveDynamicSubscription<TH>(eventName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public void Dispose()
|
public void Dispose()
|
||||||
{
|
{
|
||||||
if (_consumerChannel != null)
|
if (_consumerChannel != null)
|
||||||
@ -170,7 +174,12 @@ namespace Microsoft.eShopOnContainers.BuildingBlocks.EventBusRabbitMQ
|
|||||||
channel.ExchangeDeclare(exchange: BROKER_NAME,
|
channel.ExchangeDeclare(exchange: BROKER_NAME,
|
||||||
type: "direct");
|
type: "direct");
|
||||||
|
|
||||||
_queueName = channel.QueueDeclare().QueueName;
|
channel.QueueDeclare(queue: _queueName,
|
||||||
|
durable: true,
|
||||||
|
exclusive: false,
|
||||||
|
autoDelete: false,
|
||||||
|
arguments: null);
|
||||||
|
|
||||||
|
|
||||||
var consumer = new EventingBasicConsumer(channel);
|
var consumer = new EventingBasicConsumer(channel);
|
||||||
consumer.Received += async (model, ea) =>
|
consumer.Received += async (model, ea) =>
|
||||||
@ -179,6 +188,8 @@ namespace Microsoft.eShopOnContainers.BuildingBlocks.EventBusRabbitMQ
|
|||||||
var message = Encoding.UTF8.GetString(ea.Body);
|
var message = Encoding.UTF8.GetString(ea.Body);
|
||||||
|
|
||||||
await ProcessEvent(eventName, message);
|
await ProcessEvent(eventName, message);
|
||||||
|
|
||||||
|
channel.BasicAck(ea.DeliveryTag,multiple:false);
|
||||||
};
|
};
|
||||||
|
|
||||||
channel.BasicConsume(queue: _queueName,
|
channel.BasicConsume(queue: _queueName,
|
||||||
@ -196,8 +207,6 @@ namespace Microsoft.eShopOnContainers.BuildingBlocks.EventBusRabbitMQ
|
|||||||
|
|
||||||
private async Task ProcessEvent(string eventName, string message)
|
private async Task ProcessEvent(string eventName, string message)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
||||||
if (_subsManager.HasSubscriptionsForEvent(eventName))
|
if (_subsManager.HasSubscriptionsForEvent(eventName))
|
||||||
{
|
{
|
||||||
using (var scope = _autofac.BeginLifetimeScope(AUTOFAC_SCOPE_NAME))
|
using (var scope = _autofac.BeginLifetimeScope(AUTOFAC_SCOPE_NAME))
|
||||||
|
@ -6,10 +6,11 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Autofac" Version="4.6.1" />
|
<PackageReference Include="Autofac" Version="4.6.2" />
|
||||||
|
<PackageReference Include="Microsoft.CSharp" Version="4.4.1" />
|
||||||
<PackageReference Include="Microsoft.Extensions.Logging" Version="2.0.0" />
|
<PackageReference Include="Microsoft.Extensions.Logging" Version="2.0.0" />
|
||||||
<PackageReference Include="Newtonsoft.Json" Version="10.0.3" />
|
<PackageReference Include="Newtonsoft.Json" Version="11.0.1" />
|
||||||
<PackageReference Include="Polly" Version="5.3.1" />
|
<PackageReference Include="Polly" Version="5.8.0" />
|
||||||
<PackageReference Include="RabbitMQ.Client" Version="5.0.1" />
|
<PackageReference Include="RabbitMQ.Client" Version="5.0.1" />
|
||||||
<PackageReference Include="System.ValueTuple" Version="4.4.0" />
|
<PackageReference Include="System.ValueTuple" Version="4.4.0" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
@ -46,8 +46,8 @@
|
|||||||
|
|
||||||
var message = new Message
|
var message = new Message
|
||||||
{
|
{
|
||||||
MessageId = new Guid().ToString(),
|
MessageId = Guid.NewGuid().ToString(),
|
||||||
Body = Encoding.UTF8.GetBytes(jsonMessage),
|
Body = body,
|
||||||
Label = eventName,
|
Label = eventName,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -6,8 +6,9 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Autofac" Version="4.6.1" />
|
<PackageReference Include="Autofac" Version="4.6.2" />
|
||||||
<PackageReference Include="Microsoft.Azure.ServiceBus" Version="1.0.0" />
|
<PackageReference Include="Microsoft.Azure.ServiceBus" Version="2.0.0" />
|
||||||
|
<PackageReference Include="Microsoft.CSharp" Version="4.4.1" />
|
||||||
<PackageReference Include="Microsoft.Extensions.Logging" Version="2.0.0" />
|
<PackageReference Include="Microsoft.Extensions.Logging" Version="2.0.0" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
@ -6,12 +6,12 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="2.0.0" />
|
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="2.0.1" />
|
||||||
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="2.0.0" />
|
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="2.0.1" />
|
||||||
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="2.0.0" />
|
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="2.0.1" />
|
||||||
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="2.0.0" />
|
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="2.0.1" />
|
||||||
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="2.0.0" />
|
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="2.0.1" />
|
||||||
<PackageReference Include="Newtonsoft.Json" Version="10.0.3" />
|
<PackageReference Include="Newtonsoft.Json" Version="11.0.1" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
@ -2,9 +2,6 @@
|
|||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>netstandard2.0</TargetFramework>
|
<TargetFramework>netstandard2.0</TargetFramework>
|
||||||
<GenerateAssemblyConfigurationAttribute>false</GenerateAssemblyConfigurationAttribute>
|
|
||||||
<GenerateAssemblyCompanyAttribute>false</GenerateAssemblyCompanyAttribute>
|
|
||||||
<GenerateAssemblyProductAttribute>false</GenerateAssemblyProductAttribute>
|
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
@ -16,7 +13,7 @@
|
|||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Microsoft.AspNetCore.Hosting" Version="2.0.0" />
|
<PackageReference Include="Microsoft.AspNetCore.Hosting" Version="2.0.1" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
@ -16,11 +16,11 @@
|
|||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Microsoft.AspNetCore.Hosting" Version="2.0.0" />
|
<PackageReference Include="Microsoft.AspNetCore.Hosting" Version="2.0.1" />
|
||||||
<PackageReference Include="System.Threading.Tasks.Parallel" Version="4.3.0" />
|
<PackageReference Include="System.Threading.Tasks.Parallel" Version="4.3.0" />
|
||||||
<PackageReference Include="System.Threading.Thread" Version="4.3.0" />
|
<PackageReference Include="System.Threading.Thread" Version="4.3.0" />
|
||||||
<PackageReference Include="System.Threading.Tasks.Extensions" Version="4.4.0" />
|
<PackageReference Include="System.Threading.Tasks.Extensions" Version="4.4.0" />
|
||||||
<PackageReference Include="WindowsAzure.Storage" Version="8.5.0" />
|
<PackageReference Include="WindowsAzure.Storage" Version="9.1.0" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>netstandard1.3</TargetFramework>
|
<TargetFramework>netstandard2.0</TargetFramework>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
@ -9,7 +9,7 @@
|
|||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="System.Data.SqlClient" Version="4.4.0" />
|
<PackageReference Include="System.Data.SqlClient" Version="4.4.2" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|