📢 Mona 2.0 is now in preview! Visit https://github.com/microsoft/mona-saas/discussions/134 and let us know what you think.
MIT License
📢 Mona 2.0 is now in preview! Take a look and let us know what you think.
Questions? Check out our FAQ!
Mona SaaS is a [M]arketplace [On]boarding [A]ccelerator designed to make it easier for Microsoft's ISV partners to rapidly onboard transactable SaaS solutions to Azure Marketplace and AppSource. It includes lightweight, reusable code modules that ISVs deploy in their own Azure subscription, and low/no-code integration templates featuring Azure Logic Apps.
Mona SaaS implements all of the various customer and publisher (you, the ISV) flows that are required by Microsoft's SaaS fulfillment APIs including both the landing page that customers will see when purchasing your SaaS offer and the webhook that Azure Marketplace uses to notify you of subscription changes like cancellations and suspensions.
Each of these operations is exposed to your SaaS application by Mona SaaS through events published to a custom Event Grid topic automatically provisioned during setup. By default, Mona SaaS deploys a set of "stub" Logic Apps into your Azure subscription that are enabled by default and configured to be triggered by these subscription events.
Since Mona SaaS exposes these subscription-related events to your SaaS application through an Event Grid topic, you have lots of options for handling them. Because Mona SaaS is using Event Grid, multiple event subscribers can handle the same events simultaneously. These flows can be easily modified in production with no downtime.
First, ensure that the following prerequisites are met.
Navigate to the Azure portal and launch the Bash cloud shell.
If this is the first time that you've used the cloud shell, you will be prompted to create or choose an existing an Azure Files share.
Run this command from the cloud shell to clone the Mona SaaS repository —
git clone https://github.com/microsoft/mona-saas
By default, the Mona SaaS repository will be cloned to a local directory named mona-saas
. Navigate to the setup folder by running the following command —
cd ./mona-saas/Mona.SaaS/Mona.SaaS.Setup
Finally, enable the setup script to be executed locally by running —
chmod +x ./basic-deploy.sh
At a minimum, you need this information before running the setup script —
az account list-locations -o table
from the cloud shell. Be sure to use the region's Name
, not DisplayName
or RegionalDisplayName
.To deploy a Mona instance named monaex01
to the West Europe (westeurope
) Azure region, you would run the following command from the cloud shell. Note that, since you didn't explicitly provide a display name, Mona will default to using monaex01
as the display name.
./basic-deploy.sh -r "westeurope" -n "monaex01"
To include the display name Mona Example 01
explicitly, your would run —
./basic-deploy.sh -r "westeurope" -n "monaex01" -d "Mona Example 01"
The setup script supports additional optional parameters detailed in the table below. For example, if you wish to deploy Mona into a specific Azure subscription (9897b07c-86fa-4779-92e3-6273664ec722
) and resource group (monaex01group
), you can run —
# Broken down into multiple lines for readability...
./basic-deploy.sh \
-r "westeurope" \
-n "monaex01" \
-d "Mona Example 01" \
-g "monaex01group" \
-s "9897b07c-86fa-4779-92e3-6273664ec722"
Switch | Name | Required | Default | Notes |
---|---|---|---|---|
-n |
Deployment name | Yes | N/A | A user-defined, globally-unique name for this Mona SaaS deployment. The deployment name must contain only alphanumeric characters and be 13 characters in length or less. |
-r |
Deployment region | Yes | N/A |
The Azure region to which Mona SaaS should be deployed. For a complete list of available regions, run az account list-locations -o table from the Azure CLI (Bash cloud shell). Be sure to use the region's Name , not DisplayName or RegionalDisplayName . |
-d |
Display name | No | Same as deployment name (-n ) |
A "friendly" display name for this Mona SaaS deployment. If provided, this is also the name of the Azure Active Directory (AAD) app created during setup. While providing this parameter isn't required, it's highly recommended. |
-a |
Existing App Service plan ID | No | N/A | The complete resource ID (i.e., /subscriptions/{subscriptionId}/... ) of an existing App Service plan to publish the Mona web app to. If provided, the App Service plan must exist in the same region (see -l ) and Azure subscription (see -s ) where Mona is being deployed. If not provided, the setup script will automatically provision a new App Service plan (S1) within the same resource group (see -r ) where Mona is being deployed. It must also be a Windows-based App Service plan. |
-g |
Deployment Azure resource group name | No | mona-[deployment name (-n)] |
The Azure resource group to deploy Mona SaaS into. If the resource group already exists, it must be empty. If the group doesn't exist, it will be automatically created during setup. |
-s |
Deployment Azure subscription ID | No | The current subscription | The ID of the Azure subscription to deploy Mona SaaS into. |
-e |
Subscription event version identifier | No | Current (2021-10-01 ) |
When set, specifies the version of subscription events Mona should publish. Learn more here. |
-m |
Flag - Enable passthrough mode. | No | N/A | When set, configures this Mona deployment to use passthrough mode. |
-h |
Flag - Don't show script splash screen. | No | N/A | When set, the setup script will not display the standard Mona setup splash screen. |
-p |
Flag - Don't publish the web app. | No | N/A | When set, the setup script will provision all Azure and Azure Active Directory reources as usual but won't actually publish the Mona web app. |
Once the script is finished, note the information provided in the Mona Deployment Summary
. It's strongly recommended to save these values somewhere safe and convenient as you will likely need to refer to them again later.
Locate the setup URL at the very bottom of the script output. It will look similiar to this —
https://mona-web-monaex01.azurewebsites.net/setup
# Where "monaex01" is the Mona deployment name.
Click the URL (it's automatically linked within the cloud shell) to navigate to that site and complete the Mona SaaS setup wizard.
The setup wizard is hosted entirely within your own Mona SaaS deployment so you're aren't sharing any information with Microsoft (or anyone else) at this point.
During your initial setup you may receive a warning indicating that your sign-in is unverified and needs admin approval. If you'd like to resolve this warning please see this section of the FAQ for more info.
Use the Partner Center to configure your offer(s) and begin transacting with Microsoft!
Mona SaaS is open source (see our license) and free to use.
Since Mona SaaS is deployed into your Azure environment, the only costs that you're responsible for are those of hosting its supporting Azure resources. These resources include —
-a
setup script parameter.Note that free services are not included in this list.
Your actual costs may vary based on the following —
Use the Azure pricing calculator to better understand your unique costs.
For help in forecasting your Mona SaaS costs see this article.
Mona SaaS takes a dependency on the open source Commercial Marketplace .NET Client (commercial-marketplace-client-dotnet
). This library's DLL is conveniently included in the Mona SaaS repository.
All other dependencies are automatically satisfied using Nuget during the Mona SaaS setup process. For more information on Mona SaaS' dependencies, check out our dependency graph.
Please see our support docs for more information.
Please see our security docs for more information.
-n
setup script switch) mentioned in this section must be globally unique.Please refer to these docs for more information.
This project may contain trademarks or logos for projects, products, or services. Authorized use of Microsoft trademarks or logos is subject to and must follow Microsoft's Trademark & Brand Guidelines. Use of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship. Any use of third-party trademarks or logos are subject to those third-party's policies.