Support for ACS 6.1 and latest

Support for different Sharding Methods
This commit is contained in:
Angel Borroy
2019-07-30 16:02:26 +02:00
parent e467608636
commit f7cf98073a
10 changed files with 762 additions and 116 deletions
@@ -5,7 +5,7 @@ This project generates a collection of Docker Compose Templates to test Reposito
* Plain HTTP communications
* TLS/SSL Mutual Authentication communications
* Sharding (dynamic) with DB_ID or Explicit Routing
* Sharding (dynamic) with different Sharding Methods
* Replication (master/slave)
## Project structure
@@ -13,28 +13,33 @@ This project generates a collection of Docker Compose Templates to test Reposito
Following templates are provided.
```
$ tree generators/app/templates/latest
├── .env
├── alfresco
│   ├── Dockerfile
│   └── model
│   ├── sharding-content-model-context.xml
│   └── sharding-content-model.xml
├── docker-compose-ce.yml
├── docker-compose-ee.yml
├── search
│   └── Dockerfile
├── zeppelin
| └── Dockerfile
└── keystores
$ tree generators/app/templates/
generators/app/templates/
├── 6.1
│   ├── docker-compose-ce.yml
│   └── docker-compose-ee.yml
├── keystores
│   ├── alfresco
│   ├── client
│   ├── solr
│   └── zeppelin
└── latest
├── alfresco
├── solr
│   ├── Dockerfile
│   └── model
│   ├── sharding-content-model-context.xml
│   └── sharding-content-model.xml
├── docker-compose-ce.yml
├── docker-compose-ee.yml
├── search
│   └── Dockerfile
└── zeppelin
└── Dockerfile
```
* `.env` includes default values for Docker Compose environment variables
* `docker-compose-ce.yml` is the base Docker Compose Template for Alfresco Community deployment
* `docker-compose-ee.yml` is the base Docker Compose Template for Alfresco Enterprise deployment
* `docker-compose-ce.yml` is the base Docker Compose Template for Alfresco Community deployment (for latest and ACS 6.1)
* `docker-compose-ee.yml` is the base Docker Compose Template for Alfresco Enterprise deployment (for latest and ACS 6.1)
* `alfresco` includes a Dockerfile template to start Alfresco Repository
* `model` includes a default content model for Sharding Explicit Routing
* `search` includes a Dockerfile template to start Search Services and Insight Engine
@@ -58,6 +63,17 @@ $ mkdir my-custom-docker-compose
$ yo alfresco-docker-compose
```
## ACS Version
Currently supported ACS Version are `latest` and `6.1`
This is the first choice to be selected when the generator is executed.
```
? Which ACS version do you want to use?
6.1
latest
```
## Community
When using Community, some different options can be combined:
@@ -66,7 +82,6 @@ When using Community, some different options can be combined:
* Use SOLR Replication in Master/Slave mode (only when using http)
```
? Which Alfresco version do you want to use? latest
? Would you like to use Alfresco enterprise or community? community
? Would you like to use http or https? http
? Would you like to use a SOLR Replication (2 nodes in master-slave)? Yes
@@ -76,20 +91,38 @@ When using Community, some different options can be combined:
When using Enterprise, some options can be added to Community configuration:
* Use dynamic Sharding with 2 SOLR nodes pre-configured (only when not using SOLR Replication)
* Use Explicit Routing for Shards instead of DB_ID (only when using Sharding)
* Use dynamic Sharding with 2 SOLR nodes pre-configured (every sharding method is supported)
* Insight Engine, as Search Services is selected by default
* Deploy Zeppelin app to use JDBC Connector to SOLR
```
? Would you like to use dynamic Sharding (2 SOLR nodes)? Yes
? Would you like to use SOLR Explicit Routing instead of DB_ID for the Shards? Yes
? Which Sharding Method do you want to use?
DB_ID
DB_ID_RANGE
ACL_ID
MOD_ACL_ID
DATE
PROPERTY
LAST_REGISTERED_INDEXING_SHARD
EXPLICIT_ID_FALLBACK_LRIS
EXPLICIT_ID
? Would you like to use Insight Engine instead of Search Services? Yes
? Would you like to deploy Zeppelin? Yes
```
## Using Explicit Routing feature
## Sharding methods default parameters
**DB_ID_RANGE**
Shard range is 0-800 for the instance 0 and 801-40000 for the instance 1.
**DATE**
Shard property is `cm:created` and grouping is set to 2.
**PROPERTY**
Shard property is `shard:shardId`, belonging to a custom model deployed in the template.
**EXPLICIT_ID** and **EXPLICIT_ID_FALLBACK_LRIS**
Custom content model is deployed to provide a property, named `shard:shardId`, holding the Shard Number (0, 1) where the content is indexed.
## Configuration catalog
@@ -121,15 +154,14 @@ $ yo alfresco-docker-compose --acsVersion=latest --alfrescoVersion=community --h
**Parameter names reference**
`--acsVersion`: default latest, but could be set to e.g. 6.1.0.5
`--acsVersion`: default latest, but could be set to 6.1
`--alfrescoVersion`: community or enterprise
`--httpMode`: http or https
`--clustering`: true or false
`--insightEngine`: true or false
`--zeppelin`: true or false
`--sharding`: true or false
`--explicitRouting`: true or false
`--shardingMethod`: DB_ID, DB_ID_RANGE, ACL_ID, MOD_ACL_ID, DATE, PROPERTY, LAST_REGISTERED_INDEXING_SHARD, EXPLICIT_ID_FALLBACK_LRIS, EXPLICIT_ID
## Using Docker Compose
@@ -22,9 +22,10 @@ module.exports = class extends Generator {
const prompts = [
{
type: 'input',
type: 'list',
name: 'acsVersion',
message: 'Which Alfresco version do you want to use?',
message: 'Which ACS version do you want to use?',
choices: [ "6.1", "latest" ],
default: 'latest'
},
{
@@ -58,10 +59,21 @@ module.exports = class extends Generator {
},
{
whenFunction: response => response.alfrescoVersion == 'enterprise' && response.sharding,
type: 'confirm',
name: 'explicitRouting',
message: 'Would you like to use SOLR Explicit Routing instead of DB_ID for the Shards?',
default: false
type: 'list',
name: 'shardingMethod',
message: 'Which Sharding Method do you want to use?',
choices: [
"DB_ID",
"DB_ID_RANGE",
"ACL_ID",
"MOD_ACL_ID",
"DATE",
"PROPERTY",
"LAST_REGISTERED_INDEXING_SHARD",
"EXPLICIT_ID_FALLBACK_LRIS",
"EXPLICIT_ID"
],
default: 'DB_ID'
},
{
whenFunction: response => response.alfrescoVersion == 'enterprise',
@@ -104,14 +116,16 @@ module.exports = class extends Generator {
// Generate boilerplate from "templates" folder
writing() {
// TODO: Add support for other versions of ACS.
// e.g. Using something like:
// if (this.props.acsVersion.startsWith('6.0')) {
var templateDirectory = 'latest';
var dockerComposeTemplateDirectory = 'latest';
if (this.props.acsVersion.startsWith('6.1')) {
dockerComposeTemplateDirectory = '6.1';
}
// Docker Compose environment variables values
this.fs.copyTpl(
this.templatePath(templateDirectory + '/.env'),
this.templatePath(dockerComposeTemplateDirectory + '/.env'),
this.destinationPath('.env'),
{
acsTag: this.props.acsVersion
@@ -121,8 +135,8 @@ module.exports = class extends Generator {
// Base Docker Compose Template
const dockerComposeTemplate =
(this.props.alfrescoVersion == 'community' ?
templateDirectory + '/docker-compose-ce.yml' :
templateDirectory + '/docker-compose-ee.yml');
dockerComposeTemplateDirectory + '/docker-compose-ce.yml' :
dockerComposeTemplateDirectory + '/docker-compose-ee.yml');
// Repository Docker Image name
const acsImageName =
@@ -155,7 +169,7 @@ module.exports = class extends Generator {
searchPath: searchBasePath,
zeppelin: (this.props.zeppelin ? "true" : "false"),
sharding: (this.props.sharding ? "true" : "false"),
explicitRouting: (this.props.explicitRouting ? "true" : "false")
shardingMethod: (this.props.shardingMethod)
}
);
@@ -0,0 +1,15 @@
ALFRESCO_TAG=6.1.0.5
ALFRESCO_CE_TAG=6.1.2-ga
SHARE_TAG=6.1.0
POSTGRES_TAG=10.1
TRANSFORM_ROUTER_TAG=1.0.1
PDF_RENDERER_TAG=2.0.10
IMAGE_MAGICK_TAG=2.0.10
LIBREOFFICE_TAG=2.0.10
TIKA_TAG=2.0.10
SHARED_FILE_STORE_TAG=0.5.3
ACTIVE_MQ_TAG=5.15.8
DIGITAL_WORKSPACE_TAG=1.1.0
ACS_NGINX_TAG=3.0.0
SEARCH_TAG=latest
ZEPPELIN_TAG=latest
@@ -0,0 +1,161 @@
# Using version 2 as 3 does not support resource constraint options (cpu_*, mem_* limits) for non swarm mode in Compose
version: "2"
services:
alfresco:
build:
context: ./alfresco
args:
ALFRESCO_TAG: ${ALFRESCO_CE_TAG}
SOLR_COMMS: <%=secureComms%> <% if (httpMode == 'https') { %>
TRUSTSTORE_TYPE: JCEKS
TRUSTSTORE_PASS: kT9X6oe68t
KEYSTORE_TYPE: JCEKS
KEYSTORE_PASS: kT9X6oe68t <% } %>
mem_limit: 1800m
environment:
JAVA_OPTS : "
-Ddb.driver=org.postgresql.Driver
-Ddb.username=alfresco
-Ddb.password=alfresco
-Ddb.url=jdbc:postgresql://postgres:5432/alfresco
-Dsolr.host=<%=searchSolrHost%>
-Dsolr.port.ssl=8983
-Dsolr.secureComms=<%=secureComms%>
-Dsolr.base.url=/solr
-Dindex.subsystem.name=solr6
-Dshare.host=localhost
-Dalfresco.port=8082
-Daos.baseUrlOverwrite=http://localhost:8082/alfresco/aos
-Dmessaging.broker.url=\"failover:(nio://activemq:61616)?timeout=3000&jms.useCompression=true\"
-Ddeployment.method=DOCKER_COMPOSE
-Dcsrf.filter.enabled=false
-Dalfresco.restApi.basicAuthScheme=true
-Xms1500m -Xmx1500m
"
ports:
- 8082:8080 <% if (httpMode == 'https') { %>
- 8443:8443
volumes:
- ./keystores/alfresco:/usr/local/tomcat/alf_data/keystore <% } %>
solr6:
build:
context: ./search
args:
SEARCH_TAG: ${SEARCH_TAG}
SOLR_HOSTNAME: solr6
ALFRESCO_HOSTNAME: alfresco
ALFRESCO_COMMS: <%=secureComms%> <% if (httpMode == 'https') { %>
TRUSTSTORE_TYPE: JCEKS
KEYSTORE_TYPE: JCEKS <% } %> <% if (replication == 'true') { %>
ENABLE_MASTER: "true"
ENABLE_SLAVE: "false" <% } %>
mem_limit: 1200m
environment:
#Solr needs to know how to register itself with Alfresco
SOLR_ALFRESCO_HOST: "alfresco"
SOLR_ALFRESCO_PORT: "<%=alfrescoPort%>"
ALFRESCO_SECURE_COMMS: <%=secureComms%>
#Alfresco needs to know how to call solr
SOLR_SOLR_HOST: "solr6"
SOLR_SOLR_PORT: "8983"
#Create the default alfresco and archive cores
SOLR_CREATE_ALFRESCO_DEFAULTS: "alfresco,archive"
SOLR_JAVA_MEM: "-Xms1g -Xmx1g" <% if (httpMode == 'https') { %>
SOLR_SSL_TRUST_STORE: "/opt/<%=searchPath%>/keystore/ssl.repo.client.truststore"
SOLR_SSL_TRUST_STORE_PASSWORD: "kT9X6oe68t"
SOLR_SSL_TRUST_STORE_TYPE: "JCEKS"
SOLR_SSL_KEY_STORE: "/opt/<%=searchPath%>/keystore/ssl.repo.client.keystore"
SOLR_SSL_KEY_STORE_PASSWORD: "kT9X6oe68t"
SOLR_SSL_KEY_STORE_TYPE: "JCEKS"
SOLR_SSL_NEED_CLIENT_AUTH: "true"
SOLR_OPTS: "
-Dsolr.ssl.checkPeerName=false
-Dsolr.allow.unsafe.resourceloading=true
" <% } %>
ports:
- 8083:8983 <% if (httpMode == 'https') { %>
volumes:
- ./keystores/solr:/opt/<%=searchPath%>/keystore <% } %>
<% if (replication == 'true') { %>
solr6secondary:
build:
context: ./search
args:
SEARCH_TAG: ${SEARCH_TAG}
SOLR_HOSTNAME: solr6secondary
ALFRESCO_HOSTNAME: alfresco
ALFRESCO_COMMS: <%=secureComms%> <% if (httpMode == 'https') { %>
TRUSTSTORE_TYPE: JCEKS
KEYSTORE_TYPE: JCEKS <% } %> <% if (replication == 'true') { %>
ENABLE_MASTER: "true"
ENABLE_SLAVE: "false"
MASTER_HOST: solr6 <% } %>
mem_limit: 1200m
environment:
#Solr needs to know how to register itself with Alfresco
SOLR_ALFRESCO_HOST: "alfresco"
SOLR_ALFRESCO_PORT: "<%=alfrescoPort%>"
ALFRESCO_SECURE_COMMS: <%=secureComms%>
#Alfresco needs to know how to call solr
SOLR_SOLR_HOST: "solr6secondary"
SOLR_SOLR_PORT: "8983"
#Create the default alfresco and archive cores
SOLR_CREATE_ALFRESCO_DEFAULTS: "alfresco,archive"
SOLR_JAVA_MEM: "-Xms1g -Xmx1g" <% if (httpMode == 'https') { %>
SOLR_SSL_TRUST_STORE: "/opt/<%=searchPath%>/keystore/ssl.repo.client.truststore"
SOLR_SSL_TRUST_STORE_PASSWORD: "kT9X6oe68t"
SOLR_SSL_TRUST_STORE_TYPE: "JCEKS"
SOLR_SSL_KEY_STORE: "/opt/<%=searchPath%>/keystore/ssl.repo.client.keystore"
SOLR_SSL_KEY_STORE_PASSWORD: "kT9X6oe68t"
SOLR_SSL_KEY_STORE_TYPE: "JCEKS"
SOLR_SSL_NEED_CLIENT_AUTH: "true"
SOLR_OPTS: "
-Dsolr.ssl.checkPeerName=false
-Dsolr.allow.unsafe.resourceloading=true
" <% } %>
ports:
- 8084:8983 <% if (httpMode == 'https') { %>
volumes:
- ./keystores/solr:/opt/<%=searchPath%>/keystore <% } %>
<% } %>
share:
image: alfresco/alfresco-share:${SHARE_TAG}
mem_limit: 1g
environment:
REPO_HOST: "alfresco"
REPO_PORT: "8080"
JAVA_OPTS: "
-Xms500m
-Xmx500m
-Dalfresco.host=localhost
-Dalfresco.port=8080
-Dalfresco.context=alfresco
-Dalfresco.protocol=http
"
ports:
- 8080:8080
postgres:
image: postgres:${POSTGRES_TAG}
mem_limit: 512m
environment:
- POSTGRES_PASSWORD=alfresco
- POSTGRES_USER=alfresco
- POSTGRES_DB=alfresco
command: postgres -c max_connections=300 -c log_min_messages=LOG
ports:
- 5432:5432
activemq:
image: alfresco/alfresco-activemq:${ACTIVE_MQ_TAG}
mem_limit: 512m
ports:
- 8161:8161 # Web Console
- 5672:5672 # AMQP
- 61616:61616 # OpenWire
- 61613:61613 # STOMP
@@ -0,0 +1,324 @@
# Using version 2 as 3 does not support resource constraint options (cpu_*, mem_* limits) for non swarm mode in Compose
version: "2"
services:
alfresco:
build:
context: ./alfresco
args:
ALFRESCO_TAG: ${ALFRESCO_TAG}
SOLR_COMMS: <%=secureComms%> <% if (httpMode == 'https') { %>
TRUSTSTORE_TYPE: JCEKS
TRUSTSTORE_PASS: kT9X6oe68t
KEYSTORE_TYPE: JCEKS
KEYSTORE_PASS: kT9X6oe68t <% } %>
mem_limit: 1800m
environment:
JAVA_OPTS: "
-Ddb.driver=org.postgresql.Driver
-Ddb.username=alfresco
-Ddb.password=alfresco
-Ddb.url=jdbc:postgresql://postgres:5432/alfresco
-Dsolr.host=<%=searchSolrHost%>
-Dsolr.port.ssl=8983
-Dsolr.secureComms=<%=secureComms%>
-Dsolr.base.url=/solr <% if (sharding == 'true') { %>
-Dsolr.useDynamicShardRegistration=true <% } %>
-Dindex.subsystem.name=solr6
-Dalfresco-pdf-renderer.url=http://alfresco-pdf-renderer:8090/
-Djodconverter.url=http://libreoffice:8090/
-Dimg.url=http://imagemagick:8090/
-Dtika.url=http://tika:8090/
-Dsfs.url=http://shared-file-store:8099/
-Dshare.host=127.0.0.1
-Dshare.port=8080
-Dalfresco.host=localhost
-Dalfresco.port=8080
-Daos.baseUrlOverwrite=http://localhost:8080/alfresco/aos
-Dmessaging.broker.url=\"failover:(nio://activemq:61616)?timeout=3000&jms.useCompression=true\"
-Ddeployment.method=DOCKER_COMPOSE
-Dlocal.transform.service.enabled=true
-Dtransform.service.enabled=true
-Dcsrf.filter.enabled=false
-Dalfresco.restApi.basicAuthScheme=true
-Xms1500m -Xmx1500m
" <% if (httpMode == 'https') { %>
ports:
- 8443:8443
volumes:
- ./keystores/alfresco:/usr/local/tomcat/alf_data/keystore <% } %>
solr6:
build:
context: ./search
args:
SEARCH_TAG: ${SEARCH_TAG}
SOLR_HOSTNAME: solr6
ALFRESCO_HOSTNAME: alfresco
ALFRESCO_COMMS: <%=secureComms%> <% if (httpMode == 'https') { %>
TRUSTSTORE_TYPE: JCEKS
KEYSTORE_TYPE: JCEKS <% } %> <% if (replication == 'true') { %>
ENABLE_MASTER: "true"
ENABLE_SLAVE: "false" <% } %> <% if (sharding == 'true') { %>
ENABLE_SHARDING: "true"
NUM_SHARDS: "2"
SHARD_ID: "0" <% if (shardingMethod == 'DB_ID_RANGE') { %>
SHARD_RANGE: "0-800" <% } %> <% if (shardingMethod == 'DATE') { %>
SHARD_KEY: "cm:created"
SHARD_DATE_GROUPING: "2" <% } %> <% if (shardingMethod == 'PROPERTY') { %>
SHARD_KEY: "shard:shardId" <% } %> <% if (shardingMethod == 'EXPLICIT_ID' || shardingMethod == 'EXPLICIT_ID_FALLBACK_LRIS') { %>
SHARD_KEY: "shard:shardId" <% } %>
SHARDING_METHOD: <%=shardingMethod%> <% } %>
mem_limit: 1200m
environment:
#Solr needs to know how to register itself with Alfresco
SOLR_ALFRESCO_HOST: "alfresco"
SOLR_ALFRESCO_PORT: "<%=alfrescoPort%>"
ALFRESCO_SECURE_COMMS: <%=secureComms%>
#Alfresco needs to know how to call solr
SOLR_SOLR_HOST: "solr6"
SOLR_SOLR_PORT: "8983"
#Create the default alfresco and archive cores
SOLR_CREATE_ALFRESCO_DEFAULTS: "alfresco,archive"
SOLR_JAVA_MEM: "-Xms1g -Xmx1g" <% if (httpMode == 'https') { %>
SOLR_SSL_TRUST_STORE: "/opt/<%=searchPath%>/keystore/ssl.repo.client.truststore"
SOLR_SSL_TRUST_STORE_PASSWORD: "kT9X6oe68t"
SOLR_SSL_TRUST_STORE_TYPE: "JCEKS"
SOLR_SSL_KEY_STORE: "/opt/<%=searchPath%>/keystore/ssl.repo.client.keystore"
SOLR_SSL_KEY_STORE_PASSWORD: "kT9X6oe68t"
SOLR_SSL_KEY_STORE_TYPE: "JCEKS"
SOLR_SSL_NEED_CLIENT_AUTH: "true" <% if (sharding == 'true') { %>
SOLR_SSL_CLIENT_KEY_STORE: "/opt/<%=searchPath%>/keystore/ssl.repo.client.keystore"
SOLR_SSL_CLIENT_KEY_STORE_PASSWORD: "kT9X6oe68t"
SOLR_SSL_CLIENT_KEY_STORE_TYPE: "JCEKS"
SOLR_SSL_CLIENT_TRUST_STORE: "/opt/<%=searchPath%>/keystore/ssl.repo.client.keystore"
SOLR_SSL_CLIENT_TRUST_STORE_PASSWORD: "kT9X6oe68t"
SOLR_SSL_CLIENT_TRUST_STORE_TYPE: "JCEKS" <% } %>
SOLR_OPTS: "
-Dsolr.ssl.checkPeerName=false
-Dsolr.allow.unsafe.resourceloading=true
" <% } %>
ports:
- 8083:8983 <% if (httpMode == 'https') { %>
volumes:
- ./keystores/solr:/opt/<%=searchPath%>/keystore <% } %>
<% if (sharding == 'true' || replication == 'true') { %>
solr6secondary:
build:
context: ./search
args:
SEARCH_TAG: ${SEARCH_TAG}
SOLR_HOSTNAME: solr6secondary
ALFRESCO_HOSTNAME: alfresco
ALFRESCO_COMMS: <%=secureComms%> <% if (httpMode == 'https') { %>
TRUSTSTORE_TYPE: JCEKS
KEYSTORE_TYPE: JCEKS <% } %> <% if (replication == 'true') { %>
ENABLE_MASTER: "true"
ENABLE_SLAVE: "false"
MASTER_HOST: solr6 <% } %> <% if (sharding == 'true') { %>
ENABLE_SHARDING: "true"
NUM_SHARDS: "2"
SHARD_ID: "1" <% if (shardingMethod == 'DB_ID_RANGE') { %>
SHARD_RANGE: "801-40000" <% } %> <% if (shardingMethod == 'DATE') { %>
SHARD_KEY: "cm:created"
SHARD_DATE_GROUPING: "2" <% } %> <% if (shardingMethod == 'PROPERTY') { %>
SHARD_KEY: "shard:shardId" <% } %> <% if (shardingMethod == 'EXPLICIT_ID' || shardingMethod == 'EXPLICIT_ID_FALLBACK_LRIS') { %>
SHARD_KEY: "shard:shardId" <% } %>
SHARDING_METHOD: <%=shardingMethod%> <% } %>
mem_limit: 1200m
environment:
#Solr needs to know how to register itself with Alfresco
SOLR_ALFRESCO_HOST: "alfresco"
SOLR_ALFRESCO_PORT: "<%=alfrescoPort%>"
ALFRESCO_SECURE_COMMS: <%=secureComms%>
#Alfresco needs to know how to call solr
SOLR_SOLR_HOST: "solr6secondary"
SOLR_SOLR_PORT: "8983"
#Create the default alfresco and archive cores
SOLR_CREATE_ALFRESCO_DEFAULTS: "alfresco,archive"
SOLR_JAVA_MEM: "-Xms1g -Xmx1g" <% if (httpMode == 'https') { %>
SOLR_SSL_TRUST_STORE: "/opt/<%=searchPath%>/keystore/ssl.repo.client.truststore"
SOLR_SSL_TRUST_STORE_PASSWORD: "kT9X6oe68t"
SOLR_SSL_TRUST_STORE_TYPE: "JCEKS"
SOLR_SSL_KEY_STORE: "/opt/<%=searchPath%>/keystore/ssl.repo.client.keystore"
SOLR_SSL_KEY_STORE_PASSWORD: "kT9X6oe68t"
SOLR_SSL_KEY_STORE_TYPE: "JCEKS"
SOLR_SSL_NEED_CLIENT_AUTH: "true" <% if (sharding == 'true') { %>
SOLR_SSL_CLIENT_KEY_STORE: "/opt/<%=searchPath%>/keystore/ssl.repo.client.keystore"
SOLR_SSL_CLIENT_KEY_STORE_PASSWORD: "kT9X6oe68t"
SOLR_SSL_CLIENT_KEY_STORE_TYPE: "JCEKS"
SOLR_SSL_CLIENT_TRUST_STORE: "/opt/<%=searchPath%>/keystore/ssl.repo.client.keystore"
SOLR_SSL_CLIENT_TRUST_STORE_PASSWORD: "kT9X6oe68t"
SOLR_SSL_CLIENT_TRUST_STORE_TYPE: "JCEKS" <% } %>
SOLR_OPTS: "
-Dsolr.ssl.checkPeerName=false
-Dsolr.allow.unsafe.resourceloading=true
" <% } %>
ports:
- 8084:8983 <% if (httpMode == 'https') { %>
volumes:
- ./keystores/solr:/opt/<%=searchPath%>/keystore <% } %>
<% } %>
<% if (zeppelin == 'true') { %>
zeppelin:
build:
context: ./zeppelin
args:
ZEPPELIN_TAG: ${ZEPPELIN_TAG}
ALFRESCO_COMMS: <%=secureComms%>
mem_limit: 768m
environment: <% if (httpMode == 'https') { %>
REPO_PROTOCOL: "https" <% } %>
REPO_HOST: "alfresco"
REPO_PORT: "<%=alfrescoPort%>" <% if (httpMode == 'https') { %>
JAVA_OPTS: "
-Dalfresco.enable.ssl=true
-Dsolr.ssl.checkPeerName=false
-Djavax.net.ssl.keyStore=/zeppelin/keystore/ssl.repo.client.keystore
-Djavax.net.ssl.keyStorePassword=kT9X6oe68t
-Djavax.net.ssl.keyStoreType=JCEKS
-Djavax.net.ssl.trustStore=/zeppelin/keystore/ssl.repo.client.truststore
-Djavax.net.ssl.trustStorePassword=kT9X6oe68t
-Djavax.net.ssl.trustStoreType=JCEKS
" <% } %>
ports:
- 9090:9090 <% if (httpMode == 'https') { %>
volumes:
- ./keystores/zeppelin:/zeppelin/keystore <% } %>
<% } %>
transform-router:
mem_limit: 512m
image: quay.io/alfresco/alfresco-transform-router:${TRANSFORM_ROUTER_TAG}
environment:
JAVA_OPTS: " -Xms256m -Xmx512m"
ACTIVEMQ_URL: "nio://activemq:61616"
IMAGEMAGICK_URL: "http://imagemagick:8090"
PDF_RENDERER_URL : "http://alfresco-pdf-renderer:8090"
LIBREOFFICE_URL : "http://libreoffice:8090"
TIKA_URL : "http://tika:8090"
FILE_STORE_URL: "http://shared-file-store:8099/alfresco/api/-default-/private/sfs/versions/1/file"
links:
- activemq
alfresco-pdf-renderer:
image: quay.io/alfresco/alfresco-pdf-renderer:${PDF_RENDERER_TAG}
mem_limit: 512m
environment:
JAVA_OPTS: " -Xms256m -Xmx512m"
ACTIVEMQ_URL: "nio://activemq:61616"
FILE_STORE_URL: "http://shared-file-store:8099/alfresco/api/-default-/private/sfs/versions/1/file"
ports:
- 8090:8090
links:
- activemq
imagemagick:
image: quay.io/alfresco/alfresco-imagemagick:${IMAGE_MAGICK_TAG}
mem_limit: 512m
environment:
JAVA_OPTS: " -Xms256m -Xmx512m"
ACTIVEMQ_URL: "nio://activemq:61616"
FILE_STORE_URL: "http://shared-file-store:8099/alfresco/api/-default-/private/sfs/versions/1/file"
ports:
- 8091:8090
links:
- activemq
libreoffice:
image: quay.io/alfresco/alfresco-libreoffice:${LIBREOFFICE_TAG}
mem_limit: 1g
environment:
JAVA_OPTS: " -Xms256m -Xmx512m"
ACTIVEMQ_URL: "nio://activemq:61616"
FILE_STORE_URL: "http://shared-file-store:8099/alfresco/api/-default-/private/sfs/versions/1/file"
ports:
- 8092:8090
links:
- activemq
tika:
image: quay.io/alfresco/alfresco-tika:${TIKA_TAG}
mem_limit: 512m
environment:
JAVA_OPTS: " -Xms256m -Xmx512m"
ACTIVEMQ_URL: "nio://activemq:61616"
FILE_STORE_URL: "http://shared-file-store:8099/alfresco/api/-default-/private/sfs/versions/1/file"
ports:
- 8093:8090
links:
- activemq
shared-file-store:
image: alfresco/alfresco-shared-file-store:${SHARED_FILE_STORE_TAG}
mem_limit: 512m
environment:
JAVA_OPTS: " -Xms256m -Xmx512m"
scheduler.content.age.millis: 86400000
scheduler.cleanup.interval: 86400000
ports:
- 8099:8099
volumes:
- shared-file-store-volume:/tmp/Alfresco/sfs
share:
image: alfresco/alfresco-share:${SHARE_TAG}
mem_limit: 1g
environment:
REPO_HOST: "alfresco"
REPO_PORT: "8080"
JAVA_OPTS: "
-Xms500m
-Xmx500m
-Dalfresco.host=localhost
-Dalfresco.port=8080
-Dalfresco.context=alfresco
-Dalfresco.protocol=http
"
postgres:
image: postgres:${POSTGRES_TAG}
mem_limit: 512m
environment:
- POSTGRES_PASSWORD=alfresco
- POSTGRES_USER=alfresco
- POSTGRES_DB=alfresco
command: postgres -c max_connections=300 -c log_min_messages=LOG
ports:
- 5432:5432
activemq:
image: alfresco/alfresco-activemq:${ACTIVE_MQ_TAG}
mem_limit: 512m
ports:
- 8161:8161 # Web Console
- 5672:5672 # AMQP
- 61616:61616 # OpenWire
- 61613:61613 # STOMP
digital-workspace:
image: quay.io/alfresco/alfresco-digital-workspace:${DIGITAL_WORKSPACE_TAG}
mem_limit: 128m
environment:
BASEPATH: ./
proxy:
image: alfresco/alfresco-acs-nginx:${ACS_NGINX_TAG}
mem_limit: 128m
depends_on:
- alfresco
- digital-workspace
ports:
- 8080:8080
links:
- digital-workspace
- alfresco
- share
volumes:
shared-file-store-volume:
driver_opts:
type: tmpfs
device: tmpfs
@@ -1,14 +1,16 @@
ALFRESCO_TAG=<%=acsTag%>
SHARE_TAG=6.1.0
POSTGRES_TAG=10.1
TRANSFORM_ROUTER_TAG=1.0.1
PDF_RENDERER_TAG=2.0.10
IMAGE_MAGICK_TAG=2.0.10
LIBREOFFICE_TAG=2.0.10
TIKA_TAG=2.0.10
SHARE_TAG=6.1.0-RC3
POSTGRES_TAG=10.9
TRANSFORM_ROUTER_TAG=1.1.0-EA2
PDF_RENDERER_TAG=2.1.0-EA4
IMAGE_MAGICK_TAG=2.1.0-EA4
LIBREOFFICE_TAG=2.1.0-EA4
TIKA_TAG=2.1.0-EA4
TRANSFORM_MISC_TAG=2.1.0-EA4
SHARED_FILE_STORE_TAG=0.5.3
ACTIVE_MQ_TAG=5.15.8
DIGITAL_WORKSPACE_TAG=1.1.0
ACS_NGINX_TAG=3.0.0
ACS_NGINX_TAG=3.0.1
ACS_COMMUNITY_NGINX_TAG=1.0.0
SEARCH_TAG=latest
ZEPPELIN_TAG=latest
@@ -30,12 +30,26 @@ services:
-Daos.baseUrlOverwrite=http://localhost:8082/alfresco/aos
-Dmessaging.broker.url=\"failover:(nio://activemq:61616)?timeout=3000&jms.useCompression=true\"
-Ddeployment.method=DOCKER_COMPOSE
-Dlocal.transform.service.enabled=true
-DlocalTransform.pdfrenderer.url=http://alfresco-pdf-renderer:8090/
-DlocalTransform.imagemagick.url=http://imagemagick:8090/
-DlocalTransform.libreoffice.url=http://libreoffice:8090/
-DlocalTransform.tika.url=http://tika:8090/
-DlocalTransform.misc.url=http://transform-misc:8090/
-Dlegacy.transform.service.enabled=true
-Dalfresco-pdf-renderer.url=http://alfresco-pdf-renderer:8090/
-Djodconverter.url=http://libreoffice:8090/
-Dimg.url=http://imagemagick:8090/
-Dtika.url=http://tika:8090/
-Dtransform.misc.url=http://transform-misc:8090/
-Dcsrf.filter.enabled=false
-Dalfresco.restApi.basicAuthScheme=true
-Xms1500m -Xmx1500m
"
" <% if (httpMode == 'https') { %>
ports:
- 8082:8080 <% if (httpMode == 'https') { %>
- 8443:8443
volumes:
- ./keystores/alfresco:/usr/local/tomcat/alf_data/keystore <% } %>
@@ -123,6 +137,46 @@ services:
- ./keystores/solr:/opt/<%=searchPath%>/keystore <% } %>
<% } %>
alfresco-pdf-renderer:
image: alfresco/alfresco-pdf-renderer:${PDF_RENDERER_TAG}
mem_limit: 1g
environment:
JAVA_OPTS: " -Xms256m -Xmx512m"
ports:
- 8090:8090
imagemagick:
image: alfresco/alfresco-imagemagick:${IMAGE_MAGICK_TAG}
mem_limit: 1g
environment:
JAVA_OPTS: " -Xms256m -Xmx512m"
ports:
- 8091:8090
libreoffice:
image: alfresco/alfresco-libreoffice:${LIBREOFFICE_TAG}
mem_limit: 1g
environment:
JAVA_OPTS: " -Xms256m -Xmx512m"
ports:
- 8092:8090
tika:
image: alfresco/alfresco-tika:${TIKA_TAG}
mem_limit: 1g
environment:
JAVA_OPTS: " -Xms256m -Xmx512m"
ports:
- 8093:8090
transform-misc:
image: alfresco/alfresco-transform-misc:${TRANSFORM_MISC_TAG}
mem_limit: 1g
environment:
JAVA_OPTS: " -Xms256m -Xmx512m"
ports:
- 8094:8090
share:
image: alfresco/alfresco-share:${SHARE_TAG}
mem_limit: 1g
@@ -137,8 +191,6 @@ services:
-Dalfresco.context=alfresco
-Dalfresco.protocol=http
"
ports:
- 8080:8080
postgres:
image: postgres:${POSTGRES_TAG}
@@ -159,3 +211,14 @@ services:
- 5672:5672 # AMQP
- 61616:61616 # OpenWire
- 61613:61613 # STOMP
proxy:
image: alfresco/acs-community-ngnix:${ACS_COMMUNITY_NGINX_TAG}
mem_limit: 128m
depends_on:
- alfresco
ports:
- 8080:8080
links:
- alfresco
- share
@@ -25,20 +25,29 @@ services:
-Dsolr.base.url=/solr <% if (sharding == 'true') { %>
-Dsolr.useDynamicShardRegistration=true <% } %>
-Dindex.subsystem.name=solr6
-Daos.baseUrlOverwrite=http://localhost:8080/alfresco/aos
-Dmessaging.broker.url=\"failover:(nio://activemq:61616)?timeout=3000&jms.useCompression=true\"
-Ddeployment.method=DOCKER_COMPOSE
-Dtransform.service.enabled=true
-Dtransform.service.url=http://transform-router:8095
-Dsfs.url=http://shared-file-store:8099/
-Dlocal.transform.service.enabled=true
-DlocalTransform.pdfrenderer.url=http://alfresco-pdf-renderer:8090/
-DlocalTransform.imagemagick.url=http://imagemagick:8090/
-DlocalTransform.libreoffice.url=http://libreoffice:8090/
-DlocalTransform.tika.url=http://tika:8090/
-DlocalTransform.misc.url=http://transform-misc:8090/
-Dlegacy.transform.service.enabled=true
-Dalfresco-pdf-renderer.url=http://alfresco-pdf-renderer:8090/
-Djodconverter.url=http://libreoffice:8090/
-Dimg.url=http://imagemagick:8090/
-Dtika.url=http://tika:8090/
-Dsfs.url=http://shared-file-store:8099/
-Dshare.host=127.0.0.1
-Dshare.port=8080
-Dalfresco.host=localhost
-Dalfresco.port=8080
-Daos.baseUrlOverwrite=http://localhost:8080/alfresco/aos
-Dmessaging.broker.url=\"failover:(nio://activemq:61616)?timeout=3000&jms.useCompression=true\"
-Ddeployment.method=DOCKER_COMPOSE
-Dlocal.transform.service.enabled=true
-Dtransform.service.enabled=true
-Dtransform.misc.url=http://transform-misc:8090/
-Dcsrf.filter.enabled=false
-Dalfresco.restApi.basicAuthScheme=true
-Xms1500m -Xmx1500m
@@ -62,8 +71,13 @@ services:
ENABLE_SLAVE: "false" <% } %> <% if (sharding == 'true') { %>
ENABLE_SHARDING: "true"
NUM_SHARDS: "2"
SHARD_ID: "0" <% } %> <% if (explicitRouting == 'true') { %>
EXPLICIT_ROUTING_SHARDING: "true" <% } %>
SHARD_ID: "0" <% if (shardingMethod == 'DB_ID_RANGE') { %>
SHARD_RANGE: "0-800" <% } %> <% if (shardingMethod == 'DATE') { %>
SHARD_KEY: "cm:created"
SHARD_DATE_GROUPING: "2" <% } %> <% if (shardingMethod == 'PROPERTY') { %>
SHARD_KEY: "shard:shardId" <% } %> <% if (shardingMethod == 'EXPLICIT_ID' || shardingMethod == 'EXPLICIT_ID_FALLBACK_LRIS') { %>
SHARD_KEY: "shard:shardId" <% } %>
SHARDING_METHOD: <%=shardingMethod%> <% } %>
mem_limit: 1200m
environment:
#Solr needs to know how to register itself with Alfresco
@@ -114,8 +128,13 @@ services:
MASTER_HOST: solr6 <% } %> <% if (sharding == 'true') { %>
ENABLE_SHARDING: "true"
NUM_SHARDS: "2"
SHARD_ID: "1" <% } %> <% if (explicitRouting == 'true') { %>
EXPLICIT_ROUTING_SHARDING: "true" <% } %>
SHARD_ID: "1" <% if (shardingMethod == 'DB_ID_RANGE') { %>
SHARD_RANGE: "801-40000" <% } %> <% if (shardingMethod == 'DATE') { %>
SHARD_KEY: "cm:created"
SHARD_DATE_GROUPING: "2" <% } %> <% if (shardingMethod == 'PROPERTY') { %>
SHARD_KEY: "shard:shardId" <% } %> <% if (shardingMethod == 'EXPLICIT_ID' || shardingMethod == 'EXPLICIT_ID_FALLBACK_LRIS') { %>
SHARD_KEY: "shard:shardId" <% } %>
SHARDING_METHOD: <%=shardingMethod%> <% } %>
mem_limit: 1200m
environment:
#Solr needs to know how to register itself with Alfresco
@@ -190,12 +209,14 @@ services:
LIBREOFFICE_URL : "http://libreoffice:8090"
TIKA_URL : "http://tika:8090"
FILE_STORE_URL: "http://shared-file-store:8099/alfresco/api/-default-/private/sfs/versions/1/file"
ports:
- 8095:8095
links:
- activemq
alfresco-pdf-renderer:
image: quay.io/alfresco/alfresco-pdf-renderer:${PDF_RENDERER_TAG}
mem_limit: 512m
image: alfresco/alfresco-pdf-renderer:${PDF_RENDERER_TAG}
mem_limit: 1g
environment:
JAVA_OPTS: " -Xms256m -Xmx512m"
ACTIVEMQ_URL: "nio://activemq:61616"
@@ -206,8 +227,8 @@ services:
- activemq
imagemagick:
image: quay.io/alfresco/alfresco-imagemagick:${IMAGE_MAGICK_TAG}
mem_limit: 512m
image: alfresco/alfresco-imagemagick:${IMAGE_MAGICK_TAG}
mem_limit: 1g
environment:
JAVA_OPTS: " -Xms256m -Xmx512m"
ACTIVEMQ_URL: "nio://activemq:61616"
@@ -218,7 +239,7 @@ services:
- activemq
libreoffice:
image: quay.io/alfresco/alfresco-libreoffice:${LIBREOFFICE_TAG}
image: alfresco/alfresco-libreoffice:${LIBREOFFICE_TAG}
mem_limit: 1g
environment:
JAVA_OPTS: " -Xms256m -Xmx512m"
@@ -230,8 +251,8 @@ services:
- activemq
tika:
image: quay.io/alfresco/alfresco-tika:${TIKA_TAG}
mem_limit: 512m
image: alfresco/alfresco-tika:${TIKA_TAG}
mem_limit: 1g
environment:
JAVA_OPTS: " -Xms256m -Xmx512m"
ACTIVEMQ_URL: "nio://activemq:61616"
@@ -239,7 +260,19 @@ services:
ports:
- 8093:8090
links:
- activemq
- activemq
transform-misc:
image: alfresco/alfresco-transform-misc:${TRANSFORM_MISC_TAG}
mem_limit: 1g
environment:
JAVA_OPTS: " -Xms256m -Xmx512m"
ACTIVEMQ_URL: "nio://activemq:61616"
FILE_STORE_URL: "http://shared-file-store:8099/alfresco/api/-default-/private/sfs/versions/1/file"
ports:
- 8094:8090
links:
- activemq
shared-file-store:
image: alfresco/alfresco-shared-file-store:${SHARED_FILE_STORE_TAG}
@@ -295,7 +328,7 @@ services:
BASEPATH: ./
proxy:
image: quay.io/alfresco/alfresco-acs-nginx:${ACS_NGINX_TAG}
image: alfresco/alfresco-acs-nginx:${ACS_NGINX_TAG}
mem_limit: 128m
depends_on:
- alfresco
@@ -1,5 +1,6 @@
ARG SEARCH_TAG
FROM <%=searchImage%>:${SEARCH_TAG}
# FROM <%=searchImage%>:${SEARCH_TAG}
FROM searchservices:develop
# COMMON
ARG ALFRESCO_HOSTNAME
@@ -89,16 +90,38 @@ RUN if [ "$ENABLE_SHARDING" == "true" ] ; then \
${DIST_DIR}/solr/bin/search_config_setup.sh; \
fi
# EXPLICIT ROUTING SHARDING
ARG EXPLICIT_ROUTING_SHARDING
ENV EXPLICIT_ROUTING_SHARDING $EXPLICIT_ROUTING_SHARDING
# SHARDING METHOD
ARG SHARDING_METHOD
ENV SHARDING_METHOD $SHARDING_METHOD
ARG SHARD_RANGE
ENV SHARD_RANGE $SHARD_RANGE
ARG SHARD_KEY
ENV SHARD_KEY $SHARD_KEY
ARG SHARD_DATE_GROUPING
ENV SHARD_DATE_GROUPING $SHARD_DATE_GROUPING
# Set Shard Method and Shard Key property name
RUN if [ "$EXPLICIT_ROUTING_SHARDING" == "true" ] ; then \
sed -i '/^bash.*/i sed -i "'"s/shard.method=DB_ID/shard.method=EXPLICIT_ID_FALLBACK_DBID/g"'" ${DIST_DIR}/solrhome/templates/rerank/conf/solrcore.properties\n' \
${DIST_DIR}/solr/bin/search_config_setup.sh && \
sed -i '/^bash.*/i echo "\nshard.key=shard:shardId\n" >> ${DIST_DIR}/solrhome/templates/rerank/conf/solrcore.properties\n' \
RUN if [ "$ENABLE_SHARDING" == "true" ] ; then \
sed -i '/^bash.*/i sed -i "'"s/shard.method=DB_ID/shard.method=${SHARDING_METHOD}/g"'" ${DIST_DIR}/solrhome/templates/rerank/conf/solrcore.properties\n' \
${DIST_DIR}/solr/bin/search_config_setup.sh; \
if [ "$SHARDING_METHOD" == "DB_ID_RANGE" ]; then \
sed -i '/^bash.*/i echo "\nshard.range=${SHARD_RANGE}\n" >> ${DIST_DIR}/solrhome/templates/rerank/conf/solrcore.properties\n' \
${DIST_DIR}/solr/bin/search_config_setup.sh; \
fi; \
if [ "$SHARDING_METHOD" == "DATE" ]; then \
sed -i '/^bash.*/i echo "\nshard.key=${SHARD_KEY}\n" >> ${DIST_DIR}/solrhome/templates/rerank/conf/solrcore.properties\n' \
${DIST_DIR}/solr/bin/search_config_setup.sh && \
sed -i '/^bash.*/i echo "\nshard.date.grouping=${SHARD_DATE_GROUPING}\n" >> ${DIST_DIR}/solrhome/templates/rerank/conf/solrcore.properties\n' \
${DIST_DIR}/solr/bin/search_config_setup.sh; \
fi; \
if [ "$SHARDING_METHOD" == "PROPERTY" ]; then \
sed -i '/^bash.*/i echo "\nshard.key=${SHARD_KEY}\n" >> ${DIST_DIR}/solrhome/templates/rerank/conf/solrcore.properties\n' \
${DIST_DIR}/solr/bin/search_config_setup.sh; \
fi; \
if [[ ("$SHARDING_METHOD" == "EXPLICIT_ID") || ("$SHARDING_METHOD" == "EXPLICIT_ID_FALLBACK_LRIS") ]]; then \
sed -i '/^bash.*/i echo "\nshard.key=${SHARD_KEY}\n" >> ${DIST_DIR}/solrhome/templates/rerank/conf/solrcore.properties\n' \
${DIST_DIR}/solr/bin/search_config_setup.sh; \
fi; \
fi
# Useless for 'none'/'http' communications with Alfresco
+13 -34
View File
@@ -1216,9 +1216,9 @@
}
},
"lodash": {
"version": "4.17.11",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz",
"integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg=="
"version": "4.17.15",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
"integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A=="
},
"log-symbols": {
"version": "2.2.0",
@@ -1358,9 +1358,9 @@
"integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ="
},
"mixin-deep": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz",
"integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==",
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz",
"integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==",
"requires": {
"for-in": "^1.0.2",
"is-extendable": "^1.0.1"
@@ -1804,9 +1804,9 @@
"integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA=="
},
"set-value": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz",
"integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==",
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz",
"integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==",
"requires": {
"extend-shallow": "^2.0.1",
"is-extendable": "^0.1.1",
@@ -2196,35 +2196,14 @@
"integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ=="
},
"union-value": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz",
"integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=",
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz",
"integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==",
"requires": {
"arr-union": "^3.1.0",
"get-value": "^2.0.6",
"is-extendable": "^0.1.1",
"set-value": "^0.4.3"
},
"dependencies": {
"extend-shallow": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
"integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
"requires": {
"is-extendable": "^0.1.0"
}
},
"set-value": {
"version": "0.4.3",
"resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz",
"integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=",
"requires": {
"extend-shallow": "^2.0.1",
"is-extendable": "^0.1.1",
"is-plain-object": "^2.0.1",
"to-object-path": "^0.3.0"
}
}
"set-value": "^2.0.1"
}
},
"unset-value": {