/mona-saas

[M]arketplace [On]boarding [A]ccelerator for SaaS 2.0 is live! 🎉 Learn more @ https://github.com/microsoft/mona-saas/discussions/140.

Primary LanguageC#MIT LicenseMIT

📢 Mona 2.0 is now in preview! Take a look and let us know what you think.

Mona SaaS

CI Build

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.

How does Mona SaaS work?

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.

Mona Architecture Overview

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.

How do I get started with Mona SaaS?

1. Prerequisites

First, ensure that the following prerequisites are met.

  • You have an active Azure subscription. If you don't already have one, get one free here.
  • You have the ability to create new app registrations within your Azure Active Directory (AAD) tenant. In order to create app registrations, you must be a directory administrator. For more information, see this article.
  • You have the ability to create resources and resource groups within the target Azure subscription. Typically, this requires at least contributor-level access to the subscription.
  • You have a Workplace or School account. Guest account or personal accounts will not work.

2. Clone the Mona SaaS GitHub repository

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

3. Set up Mona SaaS

At a minimum, you need this information before running the setup script —

  • The Azure region in which you wish to deploy Mona SaaS.
    • For a complete list of available regions, run az account list-locations -o table from the cloud shell. Be sure to use the region's Name, not DisplayName or RegionalDisplayName.
  • An arbitrary, globally-unique name for this Mona deployment.
    • This identifier must consist of lowercase alphanumeric characters (a-z, 0-9) only.
    • It must also be between 3 and 13 characters in length.
  • A friendly display name for your Mona deployment which your customers will see when authenticating to the landing page that Mona SaaS deploys. Although a display name isn't technically required, it's highly recommended.

Setup script examples

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"

Setup script parameters

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.

4. Complete Mona SaaS setup

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.

5. Finish setting up your offer(s) in Partner Center

Use the Partner Center to configure your offer(s) and begin transacting with Microsoft!

How much does Mona SaaS cost?

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 —

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.

Dependencies

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.

Who supports Mona SaaS?

Please see our support docs for more information.

Security

Please see our security docs for more information.

Considerations and limitations

  • The deployment name (-n setup script switch) mentioned in this section must be globally unique.

How can I contribute?

Please refer to these docs for more information.

Trademarks

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.