Devolutions Server deployment to Azure App Service using a container

This guide covers deploying Devolutions Server to Azure App Service using a container, providing a fully managed platform with automatic scaling, built-in TLS, and Azure service integration.

Azure Portal deployment

Prerequisites

  • An Azure subscription.

  • Azure CLI installed: az --version (or use Azure Cloud Shell).

  • SQL Server administrator access (for database creation).

  • Devolutions Server container image in registry (Docker Hub or Azure Container Registry).

Create an Azure SQL database

  1. Navigate to the Azure portal.

  2. Click Create a resource, and search for SQL DatabaseCreate.

  3. In the Basics tab, fill the fields as follows:

    FieldsSuggested input
    SubscriptionSelect your subscription.
    Resource GroupCreate a new group named rg-dvls-prod.
    Database nameEnter dvls.
    ServerClick on Create new and fill the fields as follows:
    • Server name: dvls-sql-server-<unique>. The server name must be globally unique.

    • Location: select a region.

    • Authentication: enter your SQL authentication.

    • Server admin login: sqladmin.

    • Password: choose a strong password.

    Click on OK.

    Workload environmentSelect Production.

    Compute + storage

    Click on Configure database, and fill the fields like so:

    • Service tier: choose Standard.

    • DTUs: SO (10 DTUs) for testing, 20+ DTUs for production.

    Click on Apply.

  4. Then, for the Networking tab:

    Fields Suggested input
    Connectivity method Select Public endpoint.
    Allow Azure services Choose Yes, as it is required for App service to work.
    Add current client IP Choose Yes, as it is necessary for management purposes.
  5. And the Additional settings tab:

    Fields Suggested input
    Use existing data Select None.
    Collation Choose Default.
  6. Click on Review + createCreate and wait for deployment. This should take about 3-5 minutes.

Create a database user for Devolutions Server

  1. Navigate to your SQL database's Query editor and log in with server administrator credentials.

  2. Run the following SQL query:

-- Create dedicated DVLS user
CREATE LOGIN dvls_user WITH PASSWORD = 'YourSecurePassword123!';

-- Switch to DVLS database
USE dvls;

-- Create user and grant permissions
CREATE USER dvls_user FOR LOGIN dvls_user;
ALTER ROLE db_owner ADD MEMBER dvls_user;

Create an App Service Plan

  1. Click Create a resourceApp Service PlanCreate.

  2. Fill in the Basics tab as follows:

    Fields

    Suggested input

    Subscription

    Select your subscription.

    Resource Group

    Enter the same as the database's: rg-dvls-prod.

    Name

    Enter asp-dvls-prod.

    Operating System

    Select your desired operating system.

    Region

    Enter the same region as the one chosen for during SQL database configuration.

    Pricing tier

    Click Change size, then choose pricing tiers for:

    • Production: POV3 (recommended minimum).

    • Development: B2 (basic tier, lower cost).

    Once your choice is made, click Apply.

  3. Click Review + createCreate.

Create the app service

  1. Head over to Create a resourceWeb AppCreate.

  2. In the Basics tab, fill the fields as shown below:

     

    Fields Suggested input
    Subscription Select your subscription.
    Resource Group Enter rg-dvls-prod, as before.
    Name Enter dvls-prod-<unique>. It will become dvls-prod-<unique>.azurewebsites.net.
    Publish Choose Container.
    Operating System Select your desired operating system.
    Region Enter the same region as for the SQL database and App Service Plan.
    Linux Plan Select asp-dvls-prod (created during the App Service Plan's creation).
  3. And the Container tab:

    Fields Suggested input
    Image Source Choose Docker Hub or Azure Container Registry.
    Image and tag Enter devolutions/devolutions-server:release-20XX.X (replace the version number with the latest one).
    Registry access Select Public (for Docker Hub).
  4. Click Review + createCreate, and wait 2-3 minutes for deployment.

Configure the application's settings

  1. Navigate to App ServiceConfigurationApplication settings.

  2. Click New application setting for each variable:

    Name Value Notes
    DATABASE_HOST dvls-sql-server-<unique>.database.windows.net Your SQL Server hostname.
    DATABASE_NAME dvls Your database name.
    DATABASE_USERNAME dvls_user The dedicated SQL user.
    DATABASE_PASSWORD YourSecurePassword123! Use Key Vault reference in production.
    WEB_SCHEME http Protocol (App Service handles HTTPS termination).
    PORT 5000 The container's listen port.
    DVLS_TELEMETRY true Enable telemetry.
    WEBSITES_PORT 5000 Azure-specific (tells App Service which port to forward).
  3. Click Save, then Continue to confirm restart.

Initialize Devolutions Server and retrieve encryption configuration

  1. Go to ConfigurationApplication settings.

  2. Add new setting:

    • Name: DVLS_INIT

    • Value: true

  3. Click SaveContinue. This restarts the app.

  4. Under Monitoring, navigate to Log stream, and wait 1-2 minutes for initialization to complete.

  5. Enable SSH access temporarily by heading to Development ToolsSSH, and clicking on Go.

  6. Extract the encryption configuration:

    cat /opt/devolutions/dvls/App_Data/encryption.config | base64
    
  7. Copy the base64 output.

  8. Go to ConfigurationApplication settingsNew application setting. Enter DVLS_ENCRYPTION_CONFIG_B64 for the Name field and paste the base64 file's content copied during step #7 in the Value field. Click OK.

  9. Find the DVLS_INIT setting and click Delete.

  10. Click Save, and then Continue.

  1. Go to ConfigurationApplication settings.

  2. Add new setting:

    • Name: DVLS_INIT

    • Value: true

  3. Click SaveContinue. This restarts the app.

  4. Under Monitoring, navigate to Log stream, and wait 1-2 minutes for initialization to complete.

  5. Enable SSH access temporarily by heading to Development ToolsSSH, and clicking on Go.

  6. Extract the encryption configuration:

    cat /opt/devolutions/dvls/App_Data/encryption.config | base64
    
  7. Copy the base64 output.

  8. Go to ConfigurationApplication settingsNew application setting. Enter DVLS_ENCRYPTION_CONFIG_B64 for the Name field and paste the base64 file's content copied during step #7 in the Value field. Click OK.

  9. Find the DVLS_INIT setting and click Delete.

  10. Click Save, and then Continue.

  1. Go to ConfigurationApplication settings.

  2. Add new setting:

    • Name: DVLS_INIT

    • Value: true

  3. Click SaveContinue. This restarts the app.

  4. Under Monitoring, navigate to Log stream, and wait 1-2 minutes for initialization to complete.

  5. Enable SSH access temporarily by heading to Development ToolsSSH, and clicking on Go.

  6. Extract the encryption configuration:

    cat /opt/devolutions/dvls/App_Data/encryption.config | base64
    
  7. Copy the base64 output.

  8. Go to ConfigurationApplication settingsNew application setting. Enter DVLS_ENCRYPTION_CONFIG_B64 for the Name field and paste the base64 file's content copied during step #7 in the Value field. Click OK.

  9. Find the DVLS_INIT setting and click Delete.

  10. Click Save, and then Continue.

Access Devolutions Server

  1. Navigate to OverviewURL.

  2. Click the URL or visit: https://dvls-prod-<unique>.azurewebsites.net

  3. Login with default credentials:

    • Username: dvls-admin

    • Password: dvls-admin

Immediately after login, change the default password by heading to AdministrationUsers, clicking on the vertical ellipsis button of the dvls-admin user, and selecting Change password.

Azure CLI Deployment

Azure CLI is also available for automated or repeatable deployments.

Prerequisites

# Login to Azure
az login

# Set subscription
az account set --subscription "Your Subscription Name"

# Verify Azure CLI version (2.50+ recommended)
az --version
# Login to Azure
az login

# Set subscription
az account set --subscription "Your Subscription Name"

# Verify Azure CLI version (2.50+ recommended)
az --version
# Login to Azure
az login

# Set subscription
az account set --subscription "Your Subscription Name"

# Verify Azure CLI version (2.50+ recommended)
az --version

Custom domain and TLS

Add custom domain

  1. Navigate to App ServiceCustom domainsAdd custom domain.

  2. Enter your domain: dvls.company.com

  3. Follow DNS configuration instructions:

    • CNAME: dvls.company.comdvls-prod-<unique>.azurewebsites.net.

    • Or A record + TXT record for apex domain.

  4. Click on Validate, then Add.

Add managed certificate (free and renews automatically)

  1. Navigate to CertificatesManaged certificatesAdd certificate.

  2. Select your custom domain.

  3. Click on Validate, then Add.

  4. Navigate to Custom domains, select your domain, and click on Add binding.

  5. For the Certificate, select Managed certificate.

  6. For the TLS/SSL type, choose SNI SSL.

  7. Click Add.

Force HTTPS

  1. Navigate to ConfigurationGeneral settings.

  2. Set HTTPS Only to On, and click on Save.

Monitoring

Enable Application Insights

Portal

  1. Navigate to App ServiceApplication InsightsTurn on Application Insights.

  2. Create new or Select existing Application Insights resources.

  3. Click Apply.

CLI

# Create Application Insights
az monitor app-insights component create `
  --app dvls-insights `
  --location eastus `
  --resource-group rg-dvls-prod `
  --application-type web

# Get connection string
$CONN_STRING = az monitor app-insights component show `
  --app dvls-insights `
  --resource-group rg-dvls-prod `
  --query connectionString -o tsv

# Configure App Service
az webapp config appsettings set `
  --resource-group rg-dvls-prod `
  --name dvls-prod-<unique> `
  --settings "APPLICATIONINSIGHTS_CONNECTION_STRING=$CONN_STRING"
# Create Application Insights
az monitor app-insights component create \
  --app dvls-insights \
  --location eastus \
  --resource-group rg-dvls-prod \
  --application-type web

# Get connection string
CONN_STRING=$(az monitor app-insights component show \
  --app dvls-insights \
  --resource-group rg-dvls-prod \
  --query connectionString -o tsv)

# Configure App Service
az webapp config appsettings set \
  --resource-group rg-dvls-prod \
  --name dvls-prod-<unique> \
  --settings \
    APPLICATIONINSIGHTS_CONNECTION_STRING="$CONN_STRING"
# Create Application Insights
az monitor app-insights component create \
  --app dvls-insights \
  --location eastus \
  --resource-group rg-dvls-prod \
  --application-type web

# Get connection string
CONN_STRING=$(az monitor app-insights component show \
  --app dvls-insights \
  --resource-group rg-dvls-prod \
  --query connectionString -o tsv)

# Configure App Service
az webapp config appsettings set \
  --resource-group rg-dvls-prod \
  --name dvls-prod-<unique> \
  --settings \
    APPLICATIONINSIGHTS_CONNECTION_STRING="$CONN_STRING"

The location is set to East US as an example here. Make sure to change the value to your region.

View logs

Stream logs

az webapp log tail `
  --resource-group rg-dvls-prod `
  --name dvls-prod-<unique>
az webapp log tail \
  --resource-group rg-dvls-prod \
  --name dvls-prod-<unique>
az webapp log tail \
  --resource-group rg-dvls-prod \
  --name dvls-prod-<unique>

Download logs

az webapp log download `
  --resource-group rg-dvls-prod `
  --name dvls-prod-<unique> `
  --log-file dvls-logs.zip
az webapp log download \
  --resource-group rg-dvls-prod \
  --name dvls-prod-<unique> \
  --log-file dvls-logs.zip
az webapp log download \
  --resource-group rg-dvls-prod \
  --name dvls-prod-<unique> \
  --log-file dvls-logs.zip

Security

Use Azure Key Vault for secrets

  1. Enable Managed Identity:

    az webapp identity assign `
      --resource-group rg-dvls-prod `
      --name dvls-prod-<unique>
    
    PRINCIPAL_ID=$(az webapp identity show `
      --resource-group rg-dvls-prod `
      --name dvls-prod-<unique> `
      --query principalId -o tsv)
    
  2. Create a Key Vault and store secret:

    az keyvault create `
      --name kv-dvls-prod `
      --resource-group rg-dvls-prod `
      --location eastus
    
    az keyvault secret set `
      --vault-name kv-dvls-prod `
      --name dvls-db-password `
      --value 'YourSecurePassword123!'
    
  3. Grant access:

    az keyvault set-policy `
      --name kv-dvls-prod `
      --object-id "$PRINCIPAL_ID" `
      --secret-permissions get
    
  4. Reference in App Settings:

    SECRET_URI=$(az keyvault secret show `
      --vault-name kv-dvls-prod `
      --name dvls-db-password `
      --query id -o tsv)
    
    az webapp config appsettings set `
      --resource-group rg-dvls-prod `
      --name dvls-prod-<unique> `
      --settings `
        DATABASE_PASSWORD="@Microsoft.KeyVault(SecretUri=${SECRET_URI})"
    
  1. Enable Managed Identity:

    az webapp identity assign \
      --resource-group rg-dvls-prod \
      --name dvls-prod-<unique>
    
    PRINCIPAL_ID=$(az webapp identity show \
      --resource-group rg-dvls-prod \
      --name dvls-prod-<unique> \
      --query principalId -o tsv)
    
  2. Create a Key Vault and store secret:

    az keyvault create \
      --name kv-dvls-prod \
      --resource-group rg-dvls-prod \
      --location eastus
    
    az keyvault secret set \
      --vault-name kv-dvls-prod \
      --name dvls-db-password \
      --value 'YourSecurePassword123!'
    
  3. Grant access:

    az keyvault set-policy \
      --name kv-dvls-prod \
      --object-id "$PRINCIPAL_ID" \
      --secret-permissions get
    
  4. Reference in App Settings:

    SECRET_URI=$(az keyvault secret show \
      --vault-name kv-dvls-prod \
      --name dvls-db-password \
      --query id -o tsv)
    
    az webapp config appsettings set \
      --resource-group rg-dvls-prod \
      --name dvls-prod-<unique> \
      --settings \
        DATABASE_PASSWORD="@Microsoft.KeyVault(SecretUri=${SECRET_URI})"
    
  1. Enable Managed Identity:

    az webapp identity assign \
      --resource-group rg-dvls-prod \
      --name dvls-prod-<unique>
    
    PRINCIPAL_ID=$(az webapp identity show \
      --resource-group rg-dvls-prod \
      --name dvls-prod-<unique> \
      --query principalId -o tsv)
    
  2. Create a Key Vault and store secret:

    az keyvault create \
      --name kv-dvls-prod \
      --resource-group rg-dvls-prod \
      --location eastus
    
    az keyvault secret set \
      --vault-name kv-dvls-prod \
      --name dvls-db-password \
      --value 'YourSecurePassword123!'
    
  3. Grant access:

    az keyvault set-policy \
      --name kv-dvls-prod \
      --object-id "$PRINCIPAL_ID" \
      --secret-permissions get
    
  4. Reference in App Settings:

    SECRET_URI=$(az keyvault secret show \
      --vault-name kv-dvls-prod \
      --name dvls-db-password \
      --query id -o tsv)
    
    az webapp config appsettings set \
      --resource-group rg-dvls-prod \
      --name dvls-prod-<unique> \
      --settings \
        DATABASE_PASSWORD="@Microsoft.KeyVault(SecretUri=${SECRET_URI})"
    

See also

Devolutions Forum logo Share your feedback