.NET CORE - DMM INSTALLATION
Docker Image: DMM with built-in DMM API
Types of Host
There are two methods to run the DMM host:
- AgentsWeb
- 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:
- DmmDrmAgentConfig (for plugin)
- MibDrmPackageConfig (for plugin)
- DmmEncodingAgentConfig (for plugin)
- DmmUploadingAgentConfig (for plugin)
- DmmDrmKeyStorerAgentConfig (for plugin)
- 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)
- DOWNLOADER_INSTANCES
- ENCODER_INSTANCES
- DRM_INSTANCES
- UPLOADER_INSTANCES
- CLEANER_INSTANCES
- SUBTITLER_INSTANCES
- DRM_KEY_STORER_INSTANCES
- 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:
- APIPORT
- 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:
- DMMAPI_ for DMM API.
- AGENTS_ for plugins.
- AGENTSSERVICE_ for the simple host.
- 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:
- CustomSettings:UseProxy
- 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>