💪Deploying Progress Sitefinity CMS in Azure using Bicep | by Dave R – Microsoft Azure MVP☁️ | CodeX | Oct, 2021

Progress Sitefinity is a modern CMS in a PaaS model that delivers intuitive web content management for business professionals, a robust CMS development environment, and a rich end-user experience.

This article will review how we can deploy this platform in Azure using Bicep, the new domain-specific language (DSL) that uses declarative syntax to deploy Azure resources.

  • An active Azure Subscription
  • A user with the owner/contributor role
  • A resource group in the Azure subscription
  • Bicep installed in your local machine
  • Azure PowerShell installed in your local machine

So what can we do with Progress Sitefinity? Progress Sitefinity is a CMS that you can deploy in Azure and create personalized websites, customer and partner portals, e-commerce shops, and enable cross-channel campaign management.

The diagram below shows a high-level overview of Progress Sitefinity in Azure:

Progress Sitefinity — Azure Reference Architecture

This article aims to show you how to deploy the essential components of this solution in Azure using Bicep. So let’s work on the Bicep file.

We will define the following parameters in the Bicep file

  • siteName: This is the name of the website
  • location: The location for all the resources
  • hostingPlanName: This is the App Service Plan
  • appServicePlanInstances: This is the App Service Plan instance count
  • appServicePlanTier: This is the pricing tier for the App Service Plan
  • sqlServerName: The SQL Azure DB server name
  • administratorLogin: the user admin for the SQL Server instance
  • administratorLoginPassword: The password
  • databaseName: The SQL database name

The code below shows the definition of the parameters in the Bicep file:

@description('Name of Azure Website')
param siteName string
@description('Location for all resources.')
param location string = resourceGroup().location
@description('Name of Azure App Service Plan')
param hostingPlanName string
@minValue(1)
@maxValue(3)
@description('App Service Plan's instance count')
param appServicePlanInstances int = 1
@description('App Service Plan's pricing tier.')
param appServicePlanTier string = 'S3'
@description('SQL Azure DB Server name')
param sqlServerName string
@description('SQL Azure DB administrator username')
param administratorLogin string
@description('SQL Azure DB administrator password')
@secure()
param administratorLoginPassword string
@description('Database name')
param databaseName string

Now we will define the database resources, including the SQL Server, the SQL database, and the firewall rules:

resource sqlServerName_resource 'Microsoft.Sql/servers@2014-04-01' = {
name: sqlServerName
location: location
properties: {
administratorLogin: administratorLogin
administratorLoginPassword: administratorLoginPassword
}
}
resource sqlServerName_databaseName 'Microsoft.Sql/servers/databases@2014-04-01' = {
parent: sqlServerName_resource
name: databaseName
location: location
properties: {
edition: 'Standard'
collation: 'SQL_Latin1_General_CP1_CI_AS'
maxSizeBytes: '21474836480'
requestedServiceObjectiveId: '455330e1-00cd-488b-b5fa-177c226f28b7'
}
}
resource sqlServerName_AllowAllWindowsAzureIps 'Microsoft.Sql/servers/firewallrules@2014-04-01' = {
parent: sqlServerName_resource
name: 'AllowAllWindowsAzureIps'

properties: {
endIpAddress: '0.0.0.0'
startIpAddress: '0.0.0.0'
}
}

The next step is to define the web components, including the server farm and the website:

resource hostingPlanName_resource 'Microsoft.Web/serverfarms@2021-01-01' = {
name: hostingPlanName
location: location
sku: {
name: appServicePlanTier
capacity: appServicePlanInstances
}
}
resource siteName_resource 'Microsoft.Web/sites@2021-01-01' = {
name: siteName
location: resourceGroup().location
tags: {
'hidden-related:/subscriptions/${subscription().subscriptionId}/resourcegroups/${resourceGroup().name}/providers/Microsoft.Web/serverfarms/${hostingPlanName}': 'empty'
}
properties: {

serverFarmId: '/subscriptions/${subscription().subscriptionId}/resourcegroups/${resourceGroup().name}/providers/Microsoft.Web/serverfarms/${hostingPlanName}'
}
dependsOn: [
hostingPlanName_resource
]
}

Lastly, we will define the source control and the configuration for the site:

resource siteName_web 'Microsoft.Web/Sites/sourcecontrols@2015-08-01' = {
parent: siteName_resource
location: location
name: 'web'
properties: {
repoUrl: 'https://github.com/Sitefinity/azure-sample-app'
branch: 'master'
isManualIntegration: true
}
}
resource siteName_connectionstrings 'Microsoft.Web/sites/config@2021-01-01' = {
parent: siteName_resource
name: 'connectionstrings'
properties: {
defaultConnection: {

value: 'Data Source=tcp:${sqlServerName_resource.properties.fullyQualifiedDomainName},1433;Initial Catalog=${databaseName};User Id=${administratorLogin}@${sqlServerName};Password=${administratorLoginPassword};'
type: 'SQLAzure'
}
}
dependsOn: [
siteName_web
sqlServerName_databaseName
]
}

resource siteName_appsettings 'Microsoft.Web/sites/config@2021-01-01' = {
parent: siteName_resource
name: 'appsettings'

properties: {
'sf-env:ConnectionStringParams:defaultConnection': 'Backend=azure'
'sf-env:ConnectionStringName': 'defaultConnection'
}
}

Here’s the complete Bicep file that deploys a Progress Sitefinity CMS in Azure:

We will use the code below to deploy the above Bicep template:

$date = Get-Date -Format "MM-dd-yyyy"
$deploymentName = "AzInsiderDeployment"+"$date"
New-AzResourceGroupDeployment -Name $deploymentName -ResourceGroupName progress-sitefinity -TemplateFile .main.bicep -c

Note you can optionally create a parameters file and pass them on during deployment time. In this case, we will manually pass the parameters during deployment time, as shown below:

Progress Sitefinity — Deployment Preview

Then we will have a preview of the deployment as shown below:

Progress Sitefinity — Deployment Preview

Once the validation is complete, we can execute the deployment. The deployment takes a few minutes to complete.

The figure below shows the output of the deployment:

Progress Sitefinity — Deployment output

We can now go to the Azure Portal and grab the URL of the website.

Progress Sitefinity — Website URL

Once you navigate to the URL of the App Service, you should see the screen below:

  • Note: it can take a few seconds to load for the first time.
Progress Sitefinity screen

Then you can apply for your license and start working on the platform.

You can find the GitHub repository with samples to customize your solution here: https://github.com/Sitefinity/azure-sample-app

Join the AzInsider email list here.

-Dave R.