Table of Contents

.NET CORE - DMM INSTALLATION

Docker Image: DMM with built-in DMM API

Types of Host

There are two methods to run the DMM host:

  1. AgentsWeb
  2. AgentsAsAService

The first method allows one to access a web page to control each and every plugin, and exposes a SignalR API which can be used to communicate and subscribe to each plugin.

The second method loads and starts all plugins automatically, with no web access whatsoever. All feedback is received through logging.

Pulling image

Our images are saved in Amazon ECR, and the repository is managed by the Itaas team. One can ask them for a credential to pull images from it.

AgentsWeb image can be downloaded through the following command:

docker pull 873339144623.dkr.ecr.us-east-1.amazonaws.com/agile/mib-dmm:latest

AgentsAsAService image can be downloaded through the following command:

docker pull 873339144623.dkr.ecr.us-east-1.amazonaws.com/agile/mib-dmm-asservice:latest

Configuring

Various configuration files were already integrated in the image, however some are required to be configured manually as they can contain credentials, such as:

  1. DmmDrmAgentConfig (for plugin)
  2. MibDrmPackageConfig (for plugin)
  3. DmmEncodingAgentConfig (for plugin)
  4. DmmUploadingAgentConfig (for plugin)
  5. DmmDrmKeyStorerAgentConfig (for plugin)
  6. MibDatabaseConfig (for dmmapi. May be required for the Uploader plugin if using the DatabaseKeyWriter for DRM)

During container creation, one can set some environment variables to select the number of plugins that will be spawned for each type. Those variables are: (default 1)

  1. DOWNLOADER_INSTANCES
  2. ENCODER_INSTANCES
  3. DRM_INSTANCES
  4. UPLOADER_INSTANCES
  5. CLEANER_INSTANCES
  6. SUBTITLER_INSTANCES
  7. DRM_KEY_STORER_INSTANCES
  8. RESIZER_INSTANCES

The default port for MibDmmApi is 30000, while the default port for the plugin dashboard is 40000, and they can be changed with the following environment variables:

  1. APIPORT
  2. HOSTPORT

One can configure each plugin, the API or the host through environment variables or through config files. When configuring with environment variables, each one has a different prefix:

  1. DMMAPI_ for DMM API.
  2. AGENTS_ for plugins.
  3. AGENTSSERVICE_ for the simple host.
  4. AGENTSWEB_ for the web runner.

For example: DMMAPI_MIBDATABASECONFIG_DEFAULT_SERVER=192.168.1.86

If one is using a ReverseProxy, some settings must be set in appsettings.json:

  1. CustomSettings:UseProxy
  2. CustomSettings:CustomUrlBase (if the web host is set to anything other than root)

Examples

Simple, without web service or proxy

docker create -p 80:40000 -e ENCODER_INSTANCES=3 -e UPLOADER_INSTANCES=2 \
    -e DMMAPI_MIBDATABASECONFIG_DEFAULT_TYPE=sql2005 \
    -e DMMAPI_MIBDATABASECONFIG_DEFAULT_SERVER=192.168.1.86 \
    -e DMMAPI_MIBDATABASECONFIG_DEFAULT_DATABASE=MibDmm \
    -e DMMAPI_MIBDATABASECONFIG_DEFAULT_USERNAME=username\
    -e DMMAPI_MIBDATABASECONFIG_DEFAULT_PASSWORD=password \
    -v $PWD/agents_config/DmmDrmAgentConfig.mibconfig:/app/agents/config/DmmDrmAgentConfig.mibconfig:ro \
    -v $PWD/agents_config/DmmEncodingAgentConfig.mibconfig:/app/agents/config/DmmEncodingAgentConfig.mibconfig:ro \
    -v $PWD/agents_config/DmmUploadingAgentConfig.mibconfig:/app/agents/config/DmmUploadingAgentConfig.mibconfig:ro \
    -v $PWD/agents_config/MibDrmPackageConfig.mibconfig:/app/agents/config/MibDrmPackageConfig.mibconfig:ro \
    -v $PWD/agents_config/MibDatabaseConfig.mibconfig:/app/agents/config/MibDatabaseConfig.mibconfig:ro \
    -v $PWD/agents_config/MibDrmStoreConfig.mibconfig:/app/agents/config/MibDrmStoreConfig.mibconfig:ro \
    -v $PWD/logs:/app/logs:rw \
    --name dmm-agentsservice 873339144623.dkr.ecr.us-east-1.amazonaws.com/agile/mib-dmm-asservice:latest

Web, without proxy

docker create -p 80:40000 -p 81:30000 -e ENCODER_INSTANCES=3 -e UPLOADER_INSTANCES=2 \
    -v $PWD/agents_config/DmmDrmAgentConfig.mibconfig:/app/agents/config/DmmDrmAgentConfig.mibconfig:ro \
    -v $PWD/agents_config/DmmEncodingAgentConfig.mibconfig:/app/agents/config/DmmEncodingAgentConfig.mibconfig:ro \
    -v $PWD/agents_config/DmmUploadingAgentConfig.mibconfig:/app/agents/config/DmmUploadingAgentConfig.mibconfig:ro \
    -v $PWD/agents_config/MibDrmPackageConfig.mibconfig:/app/agents/config/MibDrmPackageConfig.mibconfig:ro \
    -v $PWD/agents_config/MibDatabaseConfig.mibconfig:/app/agents/config/MibDatabaseConfig.mibconfig:ro \
    -v $PWD/agents_config/MibDrmStoreConfig.mibconfig:/app/agents/config/MibDrmStoreConfig.mibconfig:ro \
    -v $PWD/dmmapi_config/MibDatabaseConfig.mibconfig:/app/dmmapi/config/MibDatabaseConfig.mibconfig:ro \
    -v $PWD/logs:/app/logs:rw \
    --name dmm-apphost 873339144623.dkr.ecr.us-east-1.amazonaws.com/agile/mib-dmm:latest

Complex, Nginx as proxy and docker-compose

docker-compose.yml:

version: '3'
services:
  reverse_proxy:
    depends_on:
      - dmm
    container_name: reverse_proxy
    hostname: reverse_proxy
    image: nginx:alpine
    restart: unless-stopped
    ports:
      - 80:80
      #- 443:443
    volumes:
      - ./nginx_config/nginx.conf:/etc/nginx/nginx.conf:ro
      #- <path/to/your/certs>:/etc/ssl/private
  dmm:
    image: 873339144623.dkr.ecr.us-east-1.amazonaws.com/agile/mib-dmm:latest
    restart: unless-stopped
    volumes:
      - ./agents_config/DmmDrmAgentConfig.mibconfig:/app/agents/config/DmmDrmAgentConfig.mibconfig:ro
      - ./agents_config/DmmEncodingAgentConfig.mibconfig:/app/agents/config/DmmEncodingAgentConfig.mibconfig:ro
      - ./agents_config/DmmUploadingAgentConfig.mibconfig:/app/agents/config/DmmUploadingAgentConfig.mibconfig:ro
      - ./agents_config/MibDrmPackageConfig.mibconfig:/app/agents/config/MibDrmPackageConfig.mibconfig:ro
      - ./agents_config/MibDatabaseConfig.mibconfig:/app/agents/config/MibDatabaseConfig.mibconfig:ro
      - ./agents_config/MibDrmStoreConfig.mibconfig:/app/agents/config/MibDrmStoreConfig.mibconfig:ro
      - ./dmmapi_config/MibDatabaseConfig.mibconfig:/app/dmmapi/config/MibDatabaseConfig.mibconfig:ro
      - ./dmmapi_config/appsettings.json:/app/dmmapi/appsettings.json:ro
      - ./agentsweb_config/appsettings.json:/app/agentsweb/appsettings.json:ro

appsettings.json: (for DmmApi)

{
  "Logging": {
    "LogLevel": {
      "Default": "Warning"
    }
  },
  "AllowedHosts": "*",
  "CustomSettings": {
    "UseProxy": "true",
    "CustomUrlBase": "/MibDmmApi"
  }
}

appsettings.json: (for WebHost)

{
  "Logging": {
    "LogLevel": {
      "Default": "Warning"
    }
  },
  "AllowedHosts": "*",
  "CustomSettings": {
    "UseProxy": "true",
    "CustomUrlBase": "/MibDmm"
  }
}

nginx.conf:

worker_processes auto;
events { worker_connections 1024; }
http {
    sendfile on;
    upstream docker-dmmapi {
        server dmm:30000;
    }
    upstream docker-dmm-apphost {
        server dmm:40000;
    }
    server {
        listen   80 default_server;
        # listen [::]:80 default_server deferred;
        return   444;
    }
    server {
        listen 80;
        server_name mib-linux.uuxinternal.com;
        location /MibDmmApi/ {
            proxy_pass         http://docker-dmmapi/;
            proxy_set_header   Upgrade $http_upgrade;
            proxy_set_header   Connection keep-alive;
            proxy_set_header   Host $host;
            proxy_set_header   X-Real-IP $remote_addr;
            proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header   X-Forwarded-Host $server_name;
            proxy_set_header   X-Forwarded-Proto $scheme;
        }
        location /MibDmm/ {
            proxy_pass         http://docker-dmm-apphost/MibDmm/;
            proxy_set_header   Upgrade $http_upgrade;
            proxy_set_header   Connection keep-alive;
            proxy_set_header   Host $host;
            proxy_set_header   X-Real-IP $remote_addr;
            proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header   X-Forwarded-Host $server_name;
            proxy_set_header   X-Forwarded-Proto $scheme;
        }
        location /MibDmm/appHub {
            proxy_pass         http://docker-dmm-apphost/MibDmm/appHub;
            proxy_set_header   Upgrade $http_upgrade;
            proxy_set_header   Connection "upgrade";
            proxy_set_header   Host $host;
            proxy_set_header   X-Real-IP $remote_addr;
            proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header   X-Forwarded-Host $server_name;
            proxy_set_header   X-Forwarded-Proto $scheme;
        }
    }
}

MibConfig Configuration File Samples

MibDrmStoreConfig.mibconfig

<?xml version="1.0" encoding="utf-8" ?>
<mibConfig>
  <paybackStore>
    <paybackUrl>http://payback.com/</paybackUrl>
    <paybackInstanceId>123</paybackInstanceId>
    <paybackApiKey>ap1k3y</paybackApiKey>
  </paybackStore>
  <databaseStore>
    <table>MMEDIAS</table>
    <validColumnNames>assetid,drmkeyid,drmseed,drmaeskey</validColumnNames>
  </databaseStore>
</mibConfig>

MibDrmPackageConfig.mibconfig

<?xml version="1.0" encoding="utf-8" ?>
<mibConfig>
  <widevineDash>
    <dashPackagerLocalPath>/app/tools/shakapackager/</dashPackagerLocalPath>
    <dashPackagerWorkingFolder>DmmWorkingFolder</dashPackagerWorkingFolder>
    <keyServerUrl>https://license.uat.widevine.com/cenc/getcontentkey/mib</keyServerUrl>
    <signer>mib</signer>
    <provider>mib</provider>
    <aesSigningKey>a3sk3y</aesSigningKey>
    <aesSigningIv>a3s1v</aesSigningIv>
  </widevineDash>
</mibConfig>

DmmEncodingAgentConfig.mibconfig

<?xml version="1.0" encoding="utf-8" ?>
<mibConfig>
  <default>
    <statusUpdateSeconds>10</statusUpdateSeconds>
    <tempPath>/temp/encoder</tempPath>
    <ThreeGEncoderPath>/app/tools/ffmpeg/ffmpeg</ThreeGEncoderPath>
    <ThreeGHintAppPath>/app/tools/mp4box/mp4box</ThreeGHintAppPath>
    <keepAliveTimeout>600</keepAliveTimeout>
    <elementalServer>http://192.168.1.85</elementalServer>
    <elementalBypassCertificateValidation>false</elementalBypassCertificateValidation>
    <azureExpressionUser>expressionUser</azureExpressionUser>
    <azureExpressionKey>3xpr3ssionKey</azureExpressionKey>
    <azureExpressionReservedUnitType>Premium</azureExpressionReservedUnitType> <!-- Basic|Standard|Premium -->
    <!-- In Seconds -->
    <!-- minTime>10</minTime -->
    <!-- difTime>10</difTime -->
    <expressionHlsTemplateName>H.264 Smooth Streams to Apple HTTP Live Streams</expressionHlsTemplateName>
    <disableDeinterlace>true</disableDeinterlace>
    <disableTwoPass>true</disableTwoPass>
    <!-- difBitrate>10</difBitrate -->
    <!-- Aws settings -->
    <AwsAccessKey>awsAcc3ssK3y</AwsAccessKey>
    <AwsSecretKey>awsS3cretK3y</AwsSecretKey>
    <AwsTranscoderEndpoint>eu-west-1</AwsTranscoderEndpoint>
    <AwsTranscoderRole>arn:aws:iam::311383118881:role/iam-trancoder</AwsTranscoderRole>
  </default>
  <ateme>
    <atemeServer>http://192.168.1.83/</atemeServer>
    <atemeToken>D80A26C3-8FB2-2A0C-3150-B12205F68764</atemeToken>
    <atemeVersion>3.8.0.7</atemeVersion>
    <atemeServerWaitTime>10</atemeServerWaitTime>
  </ateme>
</mibConfig>

DmmUploadingAgent.mibconfig

<?xml version="1.0" encoding="utf-8" ?>
<mibConfig>
  <default>
    <statusUpdateSeconds>10</statusUpdateSeconds>
    <useOffsetOnUpload>true</useOffsetOnUpload>
    <tempPath>/temp/uploader</tempPath>
    <ignoredExtensions>.dfxp</ignoredExtensions>
    <cmsAuthApiUrl>http://mib-dev.uuxinternal.com/dev/mibauthorizationserver/</cmsAuthApiUrl>
    <cmsAuthApiClientId>AuthPortal</cmsAuthApiClientId>
    <cmsAuthApiClientSecret>5Yr5BzMwm49qA9h90dUSnKtTeqG0au</cmsAuthApiClientSecret>
    <cmsApiUrl>http://mib-dev.uuxinternal.com/dev/mibapi/</cmsApiUrl>
    <cmsApiUsername>admin</cmsApiUsername>
    <cmsApiPassword>p4ssword</cmsApiPassword>
    <isDirectUpload>true</isDirectUpload>
  </default>
</mibConfig>

DmmDrmKeyStorerAgent.mibconfig

<?xml version="1.0" encoding="utf-8" ?>
<mibConfig>
  <default>
    <tempPath>/temp/drmkeystore</tempPath>
    <cmsAuthApiUrl>http://mib-dev.uuxinternal.com/dev/mibauthorizationserver/</cmsAuthApiUrl>
    <cmsAuthApiClientId>AuthPortal</cmsAuthApiClientId>
    <cmsAuthApiClientSecret>5Yr5BzMwm49qA9h90dUSnKtTeqG0au</cmsAuthApiClientSecret>
    <cmsApiUrl>http://mib-dev.uuxinternal.com/dev/mibapi/</cmsApiUrl>
    <cmsApiUsername>admin</cmsApiUsername>
    <cmsApiPassword>p4ssword</cmsApiPassword>
    <drmStoreAssemblyName>MediaiBox.Dmm.Agents.Uploader.KeyStore</drmStoreAssemblyName>
    <drmStoreClassFullName>MediaiBox.Dmm.Agents.Uploader.KeyStore.MibPaybackStore</drmStoreClassFullName>
  </default>
</mibConfig>