diff --git a/templates/MongoDB/1/README.md b/templates/MongoDB/1/README.md new file mode 100644 index 0000000..5d1109f --- /dev/null +++ b/templates/MongoDB/1/README.md @@ -0,0 +1,18 @@ +# MongoDB + + +### Info: + + This template creates MongoDB replica set on top of Rancher. Replica set size starts with 3 MongoDB instances, the replica set has the ability to scale up automatically when adding new instances. + + +### Usage: + + Select MongoDB from catalog. + + Enter the name of the replica set. + + Click deploy. + + MongoDB can now be accessed over the Rancher network. + diff --git a/templates/MongoDB/1/docker-compose.yml b/templates/MongoDB/1/docker-compose.yml new file mode 100644 index 0000000..bd37783 --- /dev/null +++ b/templates/MongoDB/1/docker-compose.yml @@ -0,0 +1,35 @@ +mongo-cluster: + restart: always + environment: + MONGO_SERVICE_NAME: mongo-cluster + tty: true + entrypoint: /opt/rancher/bin/entrypoint.sh + command: + - --replSet + - "${replset_name}" + image: mongo:3.2 + labels: + io.rancher.container.hostname_override: container_name + io.rancher.sidekicks: mongo-base, mongo-datavolume + volumes_from: + - mongo-datavolume + - mongo-base +mongo-base: + restart: always + net: none + tty: true + labels: + io.rancher.container.hostname_override: container_name + io.rancher.container.start_once: true + image: rancher/mongodb-conf:v0.1.0 + stdin_open: true + entrypoint: /bin/true +mongo-datavolume: + net: none + labels: + io.rancher.container.hostname_override: container_name + io.rancher.container.start_once: true + volumes: + - /data/db + entrypoint: /bin/true + image: busybox diff --git a/templates/MongoDB/1/rancher-compose.yml b/templates/MongoDB/1/rancher-compose.yml new file mode 100644 index 0000000..f52c0cb --- /dev/null +++ b/templates/MongoDB/1/rancher-compose.yml @@ -0,0 +1,19 @@ +.catalog: + name: "MongoDB" + version: "3.2-rancher1" + description: "MongoDB Replica Set" + uuid: mongodb-1 + minimum_rancher_version: v0.46.0 + questions: + - variable: replset_name + description: "Name of the MongoDB replicaSet" + label: "ReplicaSet Name" + type: "string" + required: true + default: "rs0" +mongo-cluster: + scale: 3 + metadata: + mongo: + yml: + replset.name: "${replset_name}" diff --git a/templates/MongoDB/config.yml b/templates/MongoDB/config.yml index de44927..eacc787 100644 --- a/templates/MongoDB/config.yml +++ b/templates/MongoDB/config.yml @@ -1,5 +1,5 @@ name: MongoDB description: | MongoDB Replica Set. -version: 3.0.0-rancher1 +version: 3.2-rancher1 category: Database diff --git a/templates/Prometheus/0/docker-compose.yml b/templates/Prometheus/0/docker-compose.yml index 30aa44b..3872143 100644 --- a/templates/Prometheus/0/docker-compose.yml +++ b/templates/Prometheus/0/docker-compose.yml @@ -3,6 +3,7 @@ ranch-eye: - 9104:9104/tcp labels: io.rancher.scheduler.global: 'true' + io.rancher.container.dns: true tty: true image: rucknar/ranch-eye:01 stdin_open: true @@ -13,6 +14,7 @@ node-exporter: - 9100:9100 labels: io.rancher.scheduler.global: 'true' + io.rancher.container.dns: true tty: true image: prom/node-exporter:latest stdin_open: true @@ -20,16 +22,13 @@ node-exporter: prom-conf: tty: true - labels: - io.rancher.container.pull_image: always - image: rucknar/prom-conf:02 - command: /bin/sh -c "/usr//bin/confd -onetime -backend rancher -prefix /2015-12-19 && cat" + image: rucknar/prom-conf:08 volumes: - /etc/prom-conf/ prometheus: tty: true - image: prom/prometheus:latest + image: prom/prometheus:0.17.0 command: -alertmanager.url=http://alertmanager:9093 -config.file=/etc/prom-conf/prometheus.yml -storage.local.path=/prometheus -web.console.libraries=/etc/prometheus/console_libraries -web.console.templates=/etc/prometheus/consoles ports: - 9090:9090 @@ -42,15 +41,6 @@ prometheus: - node-exporter:node-exporter - rancher-api-integration:rancher-api-integration -graf-db: - tty: true - image: rucknar/graf-db:01 - labels: - io.rancher.container.pull_image: always - command: cat - volumes: - - /var/lib/grafana/ - influxdb: image: tutum/influxdb:0.10 ports: @@ -63,6 +53,13 @@ influxdb: - GRAPHITE_DB=rancher - GRAPHITE_BINDING=:2003 +graf-db: + tty: true + image: rucknar/graf-db:02 + command: cat + volumes: + - /var/lib/grafana/ + grafana: tty: true image: grafana/grafana:2.6.0 diff --git a/templates/Prometheus/0/rancher-compose.yml b/templates/Prometheus/0/rancher-compose.yml index 04a5025..320097d 100644 --- a/templates/Prometheus/0/rancher-compose.yml +++ b/templates/Prometheus/0/rancher-compose.yml @@ -1,6 +1,6 @@ .catalog: name: "Prometheus" - version: "1.0.2" + version: "1.0.3" description: "Prometheus Monitoring Solution" uuid: prometheus-1 minimum_rancher_version: v0.56.0 diff --git a/templates/Prometheus/config.yml b/templates/Prometheus/config.yml index 94a0411..77da5c2 100644 --- a/templates/Prometheus/config.yml +++ b/templates/Prometheus/config.yml @@ -1,5 +1,5 @@ name: Prometheus description: | Prometheus and friends, auto-discovering monitoring solution for Rancher deployments. -version: 1.0.2 +version: 1.0.3 category: Monitoring diff --git a/templates/alfresco/0/README.md b/templates/alfresco/0/README.md new file mode 100644 index 0000000..0a9862e --- /dev/null +++ b/templates/alfresco/0/README.md @@ -0,0 +1,33 @@ +# Alfresco + +### Note: + +If you can read French, you can look my [blog](https://blog.webcenter.fr) to look how to upgrade container after deployement for a production usage. + +### Info: + +This template deploys a collection of containers based upon the technologies below, once deployed you should have a + Electronic Document Management (EDM) plateform based on Alfresco. +* **Alfresco** - Used to manage all aspect of EDM. (https://github.com/disaster37/rancher-alfresco) +* **Postgresql** - It's the SGBD to store metadatas of your EDM. (https://github.com/docker-library/postgres) + +This template is just a base to test Alfresco. If you should use in production sky, You must upgrade it after install to setting it in your context (see all parameters you can use to set Alfresco on github). You must at minimal setting that : +* **Volume** : You must mount a database volume and alfresco volume on storage pool (convoy-gluster is a good idea). + * For Postgresql `/var/lib/postgresql/data/pgdata` + * For Alfresco `/opt/alfresco/alf_data` +* **Reverse Proxy / Load balancer** : You probably put load balancer like a endpoint for user. To do that, you must add extra parameter on your Alfresco container. + * **REVERSE_PROXY_URL** : put your url like `https://ged.my-domain.com` +* **Mail setting** : There are a lot of parameter to set mail context. +* **CIFS setting** : There are a lot of parameter to set CIFS context. +* **LDAP authentification** : There are a lot of parameter to set LDAP authentification + +All components in this stack are open source tools available in the community. All this template does is to bound them together in an easy to use package. + + + +## Deployment: +* Select Alfresco from the community catalog. +* Click deploy. + +## Usage +* Alfresco Share is now available on port 8080 with the following url `http://your_ip:8080/share`. Authentication is with the default `admin/admin`. diff --git a/templates/alfresco/0/docker-compose.yml b/templates/alfresco/0/docker-compose.yml new file mode 100644 index 0000000..b9c580c --- /dev/null +++ b/templates/alfresco/0/docker-compose.yml @@ -0,0 +1,24 @@ +alfresco: + environment: + CIFS_ENABLED: 'false' + FTP_ENABLED: 'false' + labels: + io.rancher.container.pull_image: always' + tty: true + image: webcenter/rancher-alfresco:v5.1.0-2 + links: + - postgres:db + stdin_open: true + ports: + - 8080:8080/tcp +postgres: + environment: + PGDATA: /var/lib/postgresql/data/pgdata + POSTGRES_DB: ${database_name} + POSTGRES_PASSWORD: ${database_password} + POSTGRES_USER: ${database_user} + labels: + io.rancher.container.pull_image: always + tty: true + image: postgres:9.4 + stdin_open: true diff --git a/templates/alfresco/0/rancher-compose.yml b/templates/alfresco/0/rancher-compose.yml new file mode 100644 index 0000000..7e1186a --- /dev/null +++ b/templates/alfresco/0/rancher-compose.yml @@ -0,0 +1,45 @@ +.catalog: + name: "Alfresco" + version: "5.1.0" + description: "Alfresco Electronic Document Management" + uuid: alfresco-5.1.0-2 + minimum_rancher_version: v0.56.0 + questions: + - variable: database_name + description: "Name of the Alfresco database" + label: "Database name" + type: "string" + required: true + default: "alfresco" + - variable: database_user + description: "Login for the Alfresco database" + label: "Database login" + type: "string" + required: true + default: "alfresco" + - variable: database_password + description: "Password for the Alfresco database" + label: "Database password" + type: "string" + required: true + default: "alfresco" + +alfresco: + scale: 1 + health_check: + port: 8080 + interval: 5000 + unhealthy_threshold: 3 + strategy: recreate + healthy_threshold: 2 + response_timeout: 5000 + +postgres: + scale: 1 + health_check: + port: 5432 + interval: 5000 + unhealthy_threshold: 3 + strategy: recreate + response_timeout: 5000 + healthy_threshold: 2 diff --git a/templates/alfresco/catalogIcon-alfresco.svg b/templates/alfresco/catalogIcon-alfresco.svg new file mode 100644 index 0000000..278bd66 --- /dev/null +++ b/templates/alfresco/catalogIcon-alfresco.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/templates/alfresco/config.yml b/templates/alfresco/config.yml new file mode 100644 index 0000000..4750406 --- /dev/null +++ b/templates/alfresco/config.yml @@ -0,0 +1,5 @@ +name: Alfresco +description: | + Slef hosted your EDM with Alfresco on few seconds. +version: 5.1.0 +category: EDM diff --git a/templates/datadog/0/README.md b/templates/datadog/0/README.md new file mode 100644 index 0000000..b141d24 --- /dev/null +++ b/templates/datadog/0/README.md @@ -0,0 +1,13 @@ +# DataDog Agent Service + +## Info +Based on the official [Datadog Agent Docker image](github.com/DataDog/docker-dd-agent) with a few changes to the init script to better support the Rancher environment. + +## Notable Improvements +* Hostname reported to DataDog is the actual name of the host (per Rancher Metadata service) +* User can specify host labels which will be sent to DataDog as key:value tags for the host +* User can either deploy the DogStat Agent globally on every host or deploy a single instance of a standalone DogStatsD +* The later is useful if you just want a StatsD aggregator to which other services can send metrics + +[Github repository for the image](https://github.com/janeczku/dd-agent-rancher) +[Docker Hub trusted image builds](https://hub.docker.com/r/janeczku/dd-agent-rancher) diff --git a/templates/datadog/0/docker-compose.yml b/templates/datadog/0/docker-compose.yml new file mode 100755 index 0000000..da22bbb --- /dev/null +++ b/templates/datadog/0/docker-compose.yml @@ -0,0 +1,14 @@ +datadog-agent: + image: janeczku/dd-agent-rancher:11.0.563 + restart: always + environment: + API_KEY: ${api_key} + DOGSTATSD_ONLY: ${statsd_standalone} + STATSD_METRIC_NAMESPACE: ${statsd_namespace} + HOST_LABELS: ${host_labels} + volumes: + - /var/run/docker.sock:/var/run/docker.sock + - /proc/:/host/proc/:ro + - /sys/fs/cgroup/:/host/sys/fs/cgroup:ro + labels: + io.rancher.scheduler.global: ${global_service} diff --git a/templates/datadog/0/rancher-compose.yml b/templates/datadog/0/rancher-compose.yml new file mode 100755 index 0000000..fdf3fc9 --- /dev/null +++ b/templates/datadog/0/rancher-compose.yml @@ -0,0 +1,42 @@ +.catalog: + name: "DataDog" + version: "11.0.563-rancher1" + description: "Datadog Agent and DogStatsD" + minimum_rancher_version: v0.46.0 + questions: + - variable: "api_key" + label: "DataDog Api Key" + description: "Your DataDog API key" + required: true + type: "string" + - variable: "host_labels" + label: "Host Labels to Tags" + description: | + Comma delimited list (no spaces) of host labels to set as DataDog key/value tags. + Example: 'provider,region' + required: false + type: "string" + - variable: "global_service" + label: "Global Service" + description: | + Enable this option to run an instance of the DataDog Agent on every host. + If you merely want a StatsD aggregator to which other services can send + metrics, then you may uncheck this and instead enable the Standalone mode. + required: true + type: "boolean" + default: true + - variable: "statsd_standalone" + label: "Standalone StatsD" + description: | + Enable this option to run only DogStatsD without the full Agent. + You can then send StatsD metrics to port 8125/udp of the service. + required: true + type: "boolean" + default: false + - variable: "statsd_namespace" + label: "StatsD Metric Namespace" + description: | + You may optionally set a namespace for all StatsD metrics aggregated by this service. + If set then 'metric.name' will become 'namespace.metric.name'. + required: false + type: "string" diff --git a/templates/datadog/catalogIcon-datadog.svg b/templates/datadog/catalogIcon-datadog.svg new file mode 100644 index 0000000..48947ad --- /dev/null +++ b/templates/datadog/catalogIcon-datadog.svg @@ -0,0 +1,39 @@ + + + + + + \ No newline at end of file diff --git a/templates/datadog/config.yml b/templates/datadog/config.yml new file mode 100755 index 0000000..51d3baa --- /dev/null +++ b/templates/datadog/config.yml @@ -0,0 +1,8 @@ +name: Datadog +description: | + Datadog Agent and DogStatsD +version: 11.0.563-rancher1 +category: Monitoring +maintainer: "Jan Broer " +license: The MIT License +projectURL: http://www.github.com/janeczku/dd-agent-rancher diff --git a/templates/gogs/0/docker-compose.yml b/templates/gogs/0/docker-compose.yml new file mode 100644 index 0000000..cc95838 --- /dev/null +++ b/templates/gogs/0/docker-compose.yml @@ -0,0 +1,14 @@ +gogs: + image: gogs/gogs:latest + ports: + - ${http_port}:3000 + - ${ssh_port}:22 + links: + - mysql:db + +mysql: + image: mysql:latest + ports: + - ${public_port}:3306 + environment: + MYSQL_ROOT_PASSWORD: ${mysql_password} diff --git a/templates/gogs/0/rancher-compose.yml b/templates/gogs/0/rancher-compose.yml new file mode 100644 index 0000000..7b5983b --- /dev/null +++ b/templates/gogs/0/rancher-compose.yml @@ -0,0 +1,33 @@ +.catalog: + name: "Gogs" + version: "v0.8.43" + description: "A painless self-hosted Git service" + uuid: gogs-0 + minimum_rancher_version: v0.51.0 + questions: + - variable: public_port + description: "public port to access the mysql server" + label: "Public Port" + required: true + default: "3306" + type: "int" + - variable: http_port + description: "http port to access gogs webui" + label: "Http Port" + required: true + default: "10080" + type: "int" + - variable: ssh_port + description: "ssh port to access gogs cli" + label: "Ssh Port" + required: true + default: "222" + type: "int" + - variable: mysql_password + description: "mysql root password" + label: "Mysql Password" + required: true + default: "password" + type: "string" + +gogs: diff --git a/templates/gogs/catalogIcon-gogs.png b/templates/gogs/catalogIcon-gogs.png new file mode 100644 index 0000000..efc606b Binary files /dev/null and b/templates/gogs/catalogIcon-gogs.png differ diff --git a/templates/gogs/config.yml b/templates/gogs/config.yml new file mode 100644 index 0000000..be2e008 --- /dev/null +++ b/templates/gogs/config.yml @@ -0,0 +1,5 @@ +name: Gogs +description: | + A painless self-hosted Git service +version: v0.8.43 +category: Git diff --git a/templates/janitor/0/docker-compose.yml b/templates/janitor/0/docker-compose.yml new file mode 100644 index 0000000..5cce2d9 --- /dev/null +++ b/templates/janitor/0/docker-compose.yml @@ -0,0 +1,15 @@ +cleanup: + image: meltwater/docker-cleanup:1.4.0 + environment: + CLEAN_PERIOD: ${FREQUENCY} + DELAY_TIME: "900" + KEEP_IMAGES: ${KEEP} + labels: + io.rancher.scheduler.global: "true" + io.rancher.scheduler.affinity:host_label_ne: ${EXCLUDE_LABEL} + privileged: true + tty: true + stdin_open: true + volumes: + - /var/run/docker.sock:/var/run/docker.sock + - /var/lib/docker:/var/lib/docker diff --git a/templates/janitor/0/rancher-compose.yml b/templates/janitor/0/rancher-compose.yml new file mode 100644 index 0000000..ca4ae8b --- /dev/null +++ b/templates/janitor/0/rancher-compose.yml @@ -0,0 +1,25 @@ +.catalog: + name: "Janitor" + version: "v1.4.0" + description: "Docker cleanup" + uuid: janitor-0 + questions: + - variable: "FREQUENCY" + label: "Frequency" + description: "Run the cleanup on a cycle of this many seconds" + default: 3600 + required: true + type: "int" + - variable: "EXCLUDE_LABEL" + label: "Exclude label" + description: "Specify a Rancher host label here that will be used to determine on which hosts the container should not deploy." + default: janitor.exclude=true + required: true + type: "string" + - variable: "KEEP" + label: "Keep images" + description: "A comma separated list of images that should never be removed" + default: "rancher/agent:v0.8.2,rancher/agent-instance:v0.6.0" + required: false + type: "string" + diff --git a/templates/janitor/README.md b/templates/janitor/README.md new file mode 100644 index 0000000..fdfb873 --- /dev/null +++ b/templates/janitor/README.md @@ -0,0 +1,17 @@ +# Janitor + +### Topology + +A Janitor instance will be started on every host that does not match the +scheduling rule (default is `janitor.exclude=true`). + +### Operation + +This will run a task daily (by default) that will delete any unused +image, and any orphaned volume. The rancher container images are excluded +from the list of images to clean up, and you can add your own containers to +the exclude list if you wish. + +This will halp to prevent the /var/lib/docker filesystem from filling up +with old and unused container images. + diff --git a/templates/janitor/catalogIcon-janitor.svg b/templates/janitor/catalogIcon-janitor.svg new file mode 100644 index 0000000..936390a --- /dev/null +++ b/templates/janitor/catalogIcon-janitor.svg @@ -0,0 +1,31 @@ + + + + Layer 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/templates/janitor/config.yml b/templates/janitor/config.yml new file mode 100644 index 0000000..aa8322e --- /dev/null +++ b/templates/janitor/config.yml @@ -0,0 +1,7 @@ +name: Janitor +description: | + Automatic cleanup of unused images on hosts, in order to save disk space. +version: v1.4.0 +category: monitoring +maintainer: Steve Shipway + diff --git a/templates/logspout/0/README.md b/templates/logspout/0/README.md new file mode 100644 index 0000000..c985949 --- /dev/null +++ b/templates/logspout/0/README.md @@ -0,0 +1,14 @@ +# Add Logspout Stack + +Glider Labs Logspout with Logstash adapter + +### Info: + +For any services launched from the Rancher UI to use Logspout, please make sure to disable the '-t' [tty] option in the Advanced Options of the service definition. + +### Community Version + +This version adds the Environment option, where you can specify the name of the Environment. +All Syslogs will then be sent with this as the Source Hostname rather than the hostname of +the Docker Host on which the container is running. + diff --git a/templates/logspout/0/docker-compose.yml b/templates/logspout/0/docker-compose.yml new file mode 100644 index 0000000..f6005e9 --- /dev/null +++ b/templates/logspout/0/docker-compose.yml @@ -0,0 +1,14 @@ +logspout: + restart: always + environment: + ROUTE_URIS: "${route_uri}" + LOGSPOUT: 'ignore' + SYSLOG_HOSTNAME: "${envname}" + volumes: + - '/var/run/docker.sock:/var/run/docker.sock' + labels: + io.rancher.scheduler.global: 'true' + io.rancher.container.hostname_override: container_name + tty: true + image: rancher/logspout-logstash:v0.2.0 + stdin_open: true diff --git a/templates/logspout/0/rancher-compose.yml b/templates/logspout/0/rancher-compose.yml new file mode 100644 index 0000000..027a841 --- /dev/null +++ b/templates/logspout/0/rancher-compose.yml @@ -0,0 +1,33 @@ +.catalog: + name: Logspout + version: 0.2.0-1 + description: | + Logspout is a log router for Docker containers. This community template + allows you to log against the Rancher Environment rather than the hostname for + easier analysis. + questions: + - variable: "route_uri" + label: "Logspout route for logs" + type: "string" + required: true + default: "syslog://syslog.example.com:514" + description: | + This will be the target where all logs are sent. + - variable: "envname" + label: "Environment" + type: "string" + required: true + default: "Rancher:" + description: | + This is the environment name, which will be used as the Hostname + label in Syslog instead of the Host or Container name. + - variable: "format" + label: "Format" + type: "enum" + options: + - "rfc5424" + - "rfc3164" + required: true + default: "rfc5424" + description: | + The Syslog format to use. If not certain, use rfc5424 diff --git a/templates/logspout/catalogIcon-gliderlabs.png b/templates/logspout/catalogIcon-gliderlabs.png new file mode 100644 index 0000000..5858302 Binary files /dev/null and b/templates/logspout/catalogIcon-gliderlabs.png differ diff --git a/templates/logspout/config.yml b/templates/logspout/config.yml new file mode 100644 index 0000000..d066319 --- /dev/null +++ b/templates/logspout/config.yml @@ -0,0 +1,5 @@ +name: Logspout +description: | + Glider Labs Logspout with Logstash adapter with extra options +version: 0.2.0-1 +category: Logging diff --git a/templates/minecraft/0/docker-compose.yml b/templates/minecraft/0/docker-compose.yml new file mode 100644 index 0000000..b3420a2 --- /dev/null +++ b/templates/minecraft/0/docker-compose.yml @@ -0,0 +1,24 @@ +Minecraft: + environment: + EULA: ${EULA} + VERSION: ${VERSION} + DIFFICULTY: ${DIFFICULTY} + MODE: ${MODE} + PVP: ${PVP} + WHITELIST: ${WHITELIST} + OPS: ${OPS} + MOTD: ${MOTD} + SEED: ${SEED} + WORLD: ${WORLD} + tty: true + image: itzg/minecraft-server + stdin_open: true +MinecraftLB: + ports: + - ${PORT}:25565/tcp + tty: true + image: rancher/load-balancer-service + links: + - Minecraft:Minecraft + stdin_open: true + diff --git a/templates/minecraft/0/rancher-compose.yml b/templates/minecraft/0/rancher-compose.yml new file mode 100644 index 0000000..3511458 --- /dev/null +++ b/templates/minecraft/0/rancher-compose.yml @@ -0,0 +1,92 @@ +.catalog: + name: "Minecraft" + version: "v1.8" + description: "Minecraft server" + uuid: minecraft-0 + questions: + - variable: "EULA" + label: "Accept EULA" + description: "Select TRUE to accept the Minecraft EULA" + required: true + type: "enum" + options: + - TRUE + - variable: "SCALE" + label: "Scale" + description: "How many servers to run" + default: 1 + required: true + type: "int" + - variable: "PORT" + label: "Port number" + description: "On which port should the Load Balancer listen?" + default: 25565 + required: true + type: "int" + - variable: "VERSION" + label: "Minecraft Version" + description: "Select the version of Minecraft server to run. Default is the latest available" + required: false + type: "enum" + default: LATEST + options: + - LATEST + - SNAPSHOT + - 1.8.9 + - 1.7.10 + - 1.6.4 + - variable: "DIFFICULTY" + label: "Difficulty level" + description: "Select the Minecraft difficulty level. Default is normal" + default: normal + required: true + type: "enum" + options: + - peaceful + - easy + - normal + - hard + - variable: "MODE" + label: "Default game mode" + description: "Select the game mode to connect in. Default is survival" + default: survival + required: true + type: "enum" + options: + - survival + - creative + - adventure + - spectator + - variable: "PVP" + label: "PvP mode" + description: "Check here to enable PvP mode. Default is no PvP." + default: false + type: "boolean" + required: true + - variable: "MOTD" + label: "Description" + description: "Description string for Minecraft server" + default: "A Minecraft server powered by Docker" + type: "string" + required: true + - variable: "WHITELIST" + label: "Whitelist" + description: "Player names to whitelist, comma separated" + type: "string" + - variable: "OPS" + label: "Operators" + description: "Player names to give operator privileges, comma separated" + type: "string" + - variable: "SEED" + label: "Level seed" + description: "Optional level seed number for world generation" + type: "int" + - variable: "WORLD" + label: "World URL" + description: "URL to download zipped world directory" + type: "string" +Minecraft: + scale: ${SCALE} +MinecraftLB: + load_balancer_config: {} + diff --git a/templates/minecraft/README.md b/templates/minecraft/README.md new file mode 100644 index 0000000..6f5352c --- /dev/null +++ b/templates/minecraft/README.md @@ -0,0 +1,19 @@ +# Minecraft + +### Topology + +This will start up several Minecraft servers of the specified type. If no +world seed is specified, then a random one will be used. A Load Balancer +will be created over the top so that they can be accessed. + +The servers use ephemeral disk and so will not be persistent. You can also +specify a URL from which to download an ZIP archive of a world save, which +will be used in all containers. + +### Options + +You **must** accept the [EULA](https://account.mojang.com/documents/minecraft_eula) by selecting **TRUE** in the dropdown. + +You should specify a unique port number for the load balancers to listen on. + +The other options for the server may be left as their defaults. diff --git a/templates/minecraft/catalogIcon-minecraft.svg b/templates/minecraft/catalogIcon-minecraft.svg new file mode 100644 index 0000000..68f0e53 --- /dev/null +++ b/templates/minecraft/catalogIcon-minecraft.svg @@ -0,0 +1,367 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/templates/minecraft/config.yml b/templates/minecraft/config.yml new file mode 100644 index 0000000..f106ac5 --- /dev/null +++ b/templates/minecraft/config.yml @@ -0,0 +1,6 @@ +name: Minecraft +description: | + Multiplayer block game for wasting lots of time +version: v1.8 +category: entertainment +maintainer: Steve Shipway diff --git a/templates/registry/0/docker-compose.yml b/templates/registry/0/docker-compose.yml new file mode 100644 index 0000000..dd53860 --- /dev/null +++ b/templates/registry/0/docker-compose.yml @@ -0,0 +1,99 @@ +db: + image: mysql:5.7.10 + environment: + MYSQL_DATABASE: portus + MYSQL_ROOT_PASSWORD: ${ROOTPASSWORD} + MYSQL_USER: portus + MYSQL_PASSWORD: ${DBPASSWORD} + tty: true + stdin_open: true + volumes: + - ${DIR}/db:/var/lib/mysql +sslproxy: + image: nginx:1.9.9 + tty: true + stdin_open: true + links: + - portus:portus + volumes: + - ${DIR}/certs:/etc/nginx/certs:ro + - ${DIR}/proxy:/etc/nginx/conf.d:ro +registry: + image: registry:2.1 + environment: + REGISTRY_LOG_LEVEL: warn + REGISTRY_STORAGE_DELETE_ENABLED: true + REGISTRY_AUTH_TOKEN_REALM: https://${DOMAIN}:${PPORT}/v2/token + REGISTRY_AUTH_TOKEN_SERVICE: ${DOMAIN}:${RPORT} + REGISTRY_AUTH_TOKEN_ISSUER: ${DOMAIN} + REGISTRY_AUTH_TOKEN_ROOTCERTBUNDLE: /certs/registry.crt + REGISTRY_HTTP_TLS_CERTIFICATE: /certs/registry.crt + REGISTRY_HTTP_TLS_KEY: /certs/registry.key + REGISTRY_HTTP_SECRET: httpsecret + REGISTRY_NOTIFICATIONS_ENDPOINTS: > + - name: portus + url: http://portus:3000/v2/webhooks/events + timeout: 500 + threshold: 5 + backoff: 1 + tty: true + stdin_open: true + links: + - portus:portus + volumes: + - ${DIR}/certs:/certs:ro + - ${DIR}/data:/var/lib/registry +lb: + image: rancher/load-balancer-service + tty: true + stdin_open: true + ports: + - ${RPORT}:5000/tcp + - ${PPORT}:443/tcp + labels: + io.rancher.loadbalancer.target.sslproxy: ${PPORT}=443 + io.rancher.loadbalancer.target.registry: ${RPORT}=5000 + io.rancher.scheduler.global: 'true' + io.rancher.scheduler.affinity:not_host_label: lb=0 + links: + - registry:registry + - sslproxy:sslproxy +portus: + image: sshipway/portus:2.0.3 + environment: + PORTUS_MACHINE_FQDN: ${DOMAIN} + PORTUS_PRODUCTION_HOST: db + PORTUS_PRODUCTION_DATABASE: portus + PORTUS_PRODUCTION_USERNAME: portus + PORTUS_PRODUCTION_PASSWORD: ${DBPASSWORD} + PORTUS_GRAVATAR_ENABLED: true + PORTUS_KEY_PATH: /certs/registry.key + PORTUS_PASSWORD: ${DBPASSWORD} + PORTUS_SECRET_KEY_BASE: ${ROOTPASSWORD} + PORTUS_CHECK_SSL_USAGE_ENABLED: true + PORTUS_SMTP_ENABLED: false + PORTUS_LDAP_ENABLED: ${LDAP} + PORTUS_LDAP_HOSTNAME: ${LDAPHOST} + PORTUS_LDAP_PORT: ${LDAPPORT} + PORTUS_LDAP_METHOD: ${LDAPTLS} + PORTUS_LDAP_BASE: ${LDAPBASE} + PORTUS_LDAP_UID: cn + PORTUS_LDAP_AUTHENTICATION_ENABLED: ${LDAPBIND} + PORTUS_LDAP_AUTHENTICATION_BIND_DN: ${LDAPBINDDN} + PORTUS_LDAP_AUTHENTICATION_PASSWORD: ${LDAPBINDPASS} + PORTUS_LDAP_GUESS_EMAIL_ENABLED: true + PORTUS_LDAP_GUESS_EMAIL_ATTR: mail + PORTUS_PORT: ${PPORT} + REGISTRY_SSL_ENABLED: true + REGISTRY_HOSTNAME: ${DOMAIN} + REGISTRY_PORT: ${RPORT} + REGISTRY_NAME: Registry + tty: true + stdin_open: true + volumes: + - ${DIR}/certs:/certs + - ${DIR}/proxy:/etc/nginx/conf.d + links: + - db:db + labels: + io.rancher.container.pull_image: always diff --git a/templates/registry/0/rancher-compose.yml b/templates/registry/0/rancher-compose.yml new file mode 100644 index 0000000..2634876 --- /dev/null +++ b/templates/registry/0/rancher-compose.yml @@ -0,0 +1,109 @@ +.catalog: + name: "Registry" + version: "v2.1.0-2.0" + description: "Docker Registry" + uuid: registry-2 + questions: + - variable: "RPORT" + label: "Registry Port" + description: "Port on which to run the registry service" + default: 5000 + required: true + type: "int" + - variable: "PPORT" + label: "Admin Port" + description: "Port on which to run the SSL Portus administration service and API" + default: 443 + required: true + type: "int" + - variable: "DBPASSWORD" + label: "DB Password" + description: "Password for Portus database access, must be 8 characters or longer" + required: true + default: password + type: "password" + - variable: "ROOTPASSWORD" + label: "DB Root Password" + description: "Root Password for MySQL database, must be 8 characters or longer. This is not normally used." + required: true + default: password + type: "password" + - variable: "DIR" + label: "Storage directory" + description: "Path of shared storage to use for registry, database, and certificates. This should be available on all hosts" + required: true + type: "string" + - variable: "DOMAIN" + label: "FQDN" + description: "FQDN of server. This should be the CN in the certificates and will be the URL to contact the Registry and Web interface" + required: true + type: "string" + - variable: "LDAP" + label: "LDAP Enabled" + description: "Enable LDAP authentication" + required: true + default: false + type: "boolean" + - variable: "LDAPHOST" + label: "LDAP Server" + description: "The FQDN of the LDAP server (if LDAP authentication is being used)" + required: false + default: "ldap.company.com" + type: "string" + - variable: "LDAPPORT" + label: "LDAP Server port" + description: "The port number on the LDAP server (if LDAP authentication is being used)" + required: false + default: 389 + type: "int" + - variable: "LDAPTLS" + label: "LDAP TLS" + description: "The TLS option for the LDAP server (if LDAP authentication is being used)" + required: false + default: "starttls" + type: "enum" + options: + - starttls + - simple_tls + - plain + - variable: "LDAPBASE" + label: "LDAP Base DN" + description: "The Base DN for User lookups on the LDAP server (if LDAP authentication is being used)" + required: false + default: "ou=People,dc=company,dc=com" + type: "string" + - variable: "LDAPBIND" + label: "LDAP Bind enabled" + description: "Should an authenticated Bind be used to access LDAP (if LDAP authentication is being used)" + required: false + default: false + type: "boolean" + - variable: "LDAPBINDDN" + label: "LDAP Bind DN" + description: "The DN to use for binding to the LDAP server (if LDAP authentication is being used with Bind enabled)" + required: false + default: "ou=portus,dc=company,dc=com" + type: "string" + - variable: "LDAPBINDPASS" + label: "LDAP Bind Password" + description: "The password to use for binding to the LDAP server (if LDAP authentication is being used with Bind enabled)" + required: false + default: "password" + type: "password" +db: + scale: 1 +sslproxy: + scale: 1 +lb: + load_balancer_config: + haproxy_config: {} + health_check: + port: 42 + interval: 2000 + unhealthy_threshold: 3 + healthy_threshold: 2 + response_timeout: 2000 +registry: + scale: 1 +portus: + scale: 1 diff --git a/templates/registry/README.md b/templates/registry/README.md new file mode 100644 index 0000000..7a0165f --- /dev/null +++ b/templates/registry/README.md @@ -0,0 +1,79 @@ +# Registry + +This catalogue item consists of a Registry, and the Portus web UI for +authentication. There is also a MySQL database for storage, and a nginx +proxy to provide SSL for the web frontend. + +A directory path is required for storage of the Registry data, Database, +Certificates and generated Nginx configuration files. If you have +multiple Hosts then this needs to be a shared mount across all Hosts which +will run any of these containers. + +If no certificates are provided in the /certs directory, then the system +will generate self-signed SSL certificates to use. + +Note that the containers will take a significant amount of time to initialse after +they are started. You may need to wait 15 minutes for the Portus instance +to finally spot the registry instance and perform its first synchronisation, +after which the web interface will come online. + +## Backing Store + +A persistent shared filesystem is required to host the Registry, and also the +MySQL database. This will also hold the certificates under certs/server.crt +and certs/server.key; if no certificate is present, then a self-signed +certificate will be created (valid for one year only) that can later be +replaced. + +## LDAP Authentication + +If you enable LDAP authentication, then this will be used for both the +Web interface and for Registry authentication. The LDAP configuration +may optionally have authenticated Bind credentials, and TLS options. + +## Security + +All connections are protected by SSL. A self-signed certificate is +automatically generated as certs/server.crt and certs/server.key in +the persistent shared storage; this can be replaced if necessary. + +The certificate is used for registry access, for web admin access, +and for signing API access keys. + +Registry access is controlled by the same user access as the web interface; +so if you link to LDAP then this will also lock the Registry access. + +If not using LDAP, then the 'portus' use password is the Database Password +as defined in the template options. + +## Access + +The template will create a Load Balancer for access to the Registry and +to the Web Admin interface. This will run on all Hosts with the label +LB=1, listening on the defined ports. + +To access the web UI, use https on the hostname and port you configured. + +To upload to the repository, use an SSL connection to the hostname and +registry port you configured. + +## Administration + +The first user to log in to the web interface will be granted Admin +privileges. + +## Synchronisation with Registry + +The Web interface will be initially configured to use the incorporated +registry. A periodic synchronisation task and the upload webhook will +ensure they are in synch. If, for some reason, your registry already +has items (for example, if you are recreating the stack on preexisting +shared storage) then it may take up to 5min for the Portus Web UI to +synchronise the registry content to its database. + +## Feedback + +This is a complex setup, and uses a custom build of the Portus container, +which is not yet available as an official release. You may need to +customise this heavily for your own site. Any feedback can +be logged against https://github.com/sshipway/Portus diff --git a/templates/registry/catalogIcon-registry.svg b/templates/registry/catalogIcon-registry.svg new file mode 100644 index 0000000..557f9ca --- /dev/null +++ b/templates/registry/catalogIcon-registry.svg @@ -0,0 +1,201 @@ + + + + + + + + + + + +]> + + + + + + Adobe Illustrator CS3 + 2008-05-29T17:30:37-04:00 + 2008-05-29T17:30:37-04:00 + + + + 256 + 200 + JPEG + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgAyAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYqxLzN+ankry9I8F3feveR/atLUetID4MRRFPszDMTNrsWPYnfyb8emnLkHn+p/8 5Ijky6XotV/ZluZqH6Y0U/8AE818+2P5sfm5UdB3ljt3/wA5BeeZifRisrZe3CJ2P0l3b9WY8u1c p5UG0aKHmlc/51fmTLUDVhGpFCEt7cfiYyfxyo9o5j/F9gZjSY+5CH80fzGuHoutXLPT7MYUbfJF GQOuzH+Isvy2MdFn+K/zOuUHHU9WZa9Y5Jxv80IyJ1WU/wAUvmnwsY6BprP8z9RqskWtXQYnl6gu nFT4ltsgcmQ8zL7U/ux3KGl6r5s8jeYFmCy2V6lGmtZgQksbb0df2lPj2PTfDhzTxSsLOEckafTn k7zjpHmvSE1DT3owot1asR6kMlPst7eB751Gn1EcsbDp8uIwNFPcvanYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FUt1fzJoGjJz1XULezHULLIqsf9Va8j9AyvJmhD6iAzjjlLkGJ3X55fl1BJ wS+luOtWigloKf64T8MxJdpYR1+xvGjyHonnl78w/JvmCUQ6XqcclyeltIGilP8AqpIFLf7GuX4t XjybRO7VPBOPMMizIanYq8H/ADb/ADfuLieby/5cuPTtErHe6hESGkbo0cTDog6Fh9rtt10Wv7QJ PBA7dS7PTaWvVJi/k38ote8w26X1zINN06QVilkUtJIp/aSOq/D7sR7VzVRxkuTkziOz0rS/yQ8k 2gBuln1B+/rSlFr7CL0z95OWjEHHOokWR2nkHyVagejolnVejSRLKRT3kDHJCAazkkeqZwaPpEG0 FjbxUFPgiRduvYYaDHiKLAAAAFANgBhQ3irsVYx588jWHmvSzDJxh1CEFrK7pUq38rU3KN3+/Izj bZjyGJeD6Pq3mb8vfNTMYzFdQH07u0cn05ojvSo6g9VYZDBnlhnYcucI5Ivpryn5s0nzRo8ep6a9 Ub4ZoW+3FIBUo48R+OdRgzxyx4ouny4jA0U5y5rdirsVdirsVdirsVdirsVdirsVdirsVdirH/Nv nvy35VtvV1S5AnYVhs46PPJ/qp2H+U1B75j59VDEPUfg24sMpnZ4b5t/PTzVq7PBpR/Q9iageieV ww/ypaDj/sAPmc0eftPJPaPpH2uyxaOMee5Y9pnkHznrrm6NtIqSnk13eMU5V7/FWRvmAcweGUt2 85IxT5fyau1StxqaJJ3WOIuPvLJ+rJeEw8fyY3r3knWdFrcClxbIa+vFUFad2XqvzGQMCGyMwXoP 5W/nRcW80Oi+aJzLatRLXU5DV4z0CzMftJ/lncd9um20XaJB4ch27/1uHqNJe8fknn52/mT+jbRv Leky/wCn3aA306H+6hcbIpH7Ug+5fmMv7S1nCOCPM82rSaezxHkwX8qvy/XWLldY1SPlpcDfuIGG 08g8f8hT18Tt45pMcL3c3NkrYc3vcTAKFGwGwAzIcJVxQ4kAEk0A3JOKvPfNn5z+X9Jd7XS1/St4 tQzI3G3Q+8m/P/Y7e+UzzAcnd6PsPLk3n6I/b8nn0nnj80fNc7R6YZ1jB3i05DGqV/mlHxD/AGT5 TxzlydyNBo9OLnX+d+r9itH+W35sToZZZJUcivGS8Bc/8C7D7zh8ObE9p6IbCv8AS/sSfUj+ZPlK dPrlxfWPI/u39Znhc9aVDPG3yOQPFFysX5XUj0iMvhv+t6F+XX5vtqVzFpHmDil5KQltfKAqyMei SKNlY9iNjl2PNexdJ2l2N4YM8X09R3e5lH5g/l/YebNP6iDVbdT9Tu6fT6clOqE/d1HcG2cLdFiy mJ8nh/lzzJ5k/L/zNKODJJE/pahp8hokqg9Nq+NUcfiDuNPqJYZWPiHLyY45Ivp3y15k0rzHpEOq abLzglHxoac43A+KNx2Zf7RtnUYc0ckeKLpsmMwNFNMtYOxV2KuxV2KuxV2KuxV2KuxV2Ku6Yq8h /Mb88bbTzLpfldkub4VWbUtnhiPQiIHaRvf7I981Gr7SEfTj3Pe5+DR3vLk8q0Dyn5r87alLdBnl DvW71O5LFQf9Y1LNT9kfgM0nqmbLnSnGAp7J5X/LHy35fVJRF9d1BaE3k4BIb/itN1T9fvl0YAOL PKZJ5d6haQEqzcnHVV3P9MlbEBKLrVID0jan0YLZAJc0kVzzCqRQbhvA42zeYeePKIsWbUbFONqT +/hXpGT+0P8AJP4ZTOFbhyITvZINA0+LVNatbO5m9KOZwryMdyAPsqfE0oMhEWWUjQfR+jfVrezh tbdBFBCoSKNegUCgGZQcGScRSYWCtLcwQW8lxPIsUMSl5ZHICqqipJJ7DAsYmRocy8M83+fNf87a n+gfLsUo0+Riqwx/DJcAdXlO3FPYmndvbFnkMjQeu0fZ+LSw8TKRxfd7vP8AAZX5Q/JLSrJUuvMD C/u9j9VQkW6HwJ2aT8B7HLIYAObr9Z27Oe2L0jv6/sel21rbWsCQW0SQQRikcUahEUeAVaAZeA6C UzI2TZVcUJb5i0W01rRbvTbpFaO4jZVLD7D0+Bx7q2+RlGxTfps8sWQTHR8nAkGo2I6HNe+jPpz8 t/MEuu+T7G8uG53UYNvcsepeI8eR92WjH55n45XF4HtPTjDnlEcuY+KE/Mb8vLLzVYGaELDrNup+ q3HQOBv6Un+Sex/Z+8FnC3FxZeE+Txbyh5s1/wAheY3Ekbqiv6Wp6a/wh1H4BhWqt/A46bUywyvp 1Dk5cUckX0/oGv6Xr+lw6npkwmtZhsejKw6o4/ZZe4zqMWWOSPFHk6ecDE0Uwyxg7FXYq7FXYq7F XYq7FXYqsnngt4XnnkWKGJS8kjkKqqBUkk7ADASALKQLfPf5o/nHc600uj6BI0Gj7rPdCqyXHiB3 WP26nv4Zz+t7QM/TD6fvdpp9Lw7y5qH5d/lDcasItU15Wt9NNGhtN1lnHUFu6IfvPt1zXwx3zbcu etg9xtbK1s7WO1tIkgt4V4xRRgKqgdgBl7hk2gtYu/q8HFD+9k2X2Hc4kpiEr0/SVmj9aevE/YXp X3OABmZIqTSrHiV9EfjhpFlL5tPhh5emgWvXGmQKTahZxyxvHIoeNwVdSKgg7EHA2AvGfMmiT6Jq hRCRAx9S1l70B6V8VOY8o0XJjKw9U/L/AM2jVtPUStS9t6JcL4+Dj/W/Xl0JWHHyQp6FbTh1BGTc ch5v+d3maeG1tNAt3Ki6H1i8odzGrUjX5FlJPyGUZ5dHoewNKCTlPTYfpZR+Uvle00jytbXvAG/1 ONbieY9fTf4okHgApB+eTxRoOD2xq5Zcxj/DDb9bN8tdS2MVbxVLvMV8lhoGo3rkBbe2lk37lUNB 9J2wSNBu02PjyRj3kPkzNc+kPoj8lLSS38iwyPsLqeaZP9Woj/XHmbhHpeJ7cmDqCO4Afp/SzzLX TsG/Mv8ALm380WX1qzCxa3br+5kOwmUf7qc/8RPb5ZXOFt2LLw+55F5H87a15D16WOaFzas/panp z/C3wmnJa9HXt45LS6qWGXl1DkZsIyRfTui6zputaZBqemzCezuV5RuNj4FWHZlOxGdRjyRnESjy LppwMTRRuTYuxV2KuxV2KuxV2KqN5eWtlay3d3KsFtApeaZzRVUbkknBKQiLPJIBJoPm/wDNH81b rzVOdM0vnBoUbCiHZ7lwdncD9mv2V+k79Ob1uuOU8Mfo+922n0whufqZH+Wf5SLAIta8yQ1mHx2u nSDZPB5gf2vBe3ffpiwx9SubN0D1GbV7CM09TmR2QV/HpltuMIlCyeYIQD6cTE9uVB+quC08KBht 7nUrkyy7R/tN2AH7K482V0nRjVVCqKKBQAeAyTBRdcUoW4iDLgSCk15ABWuLYCxTzRoEOq6fJbtQ SD4oJP5XHT6D0ORlGw2wlTy3SdSv/L2tCbiVlgYx3EJ25LX4l/iDmODRbyLD3ry/rNve2sNzA/OG ZQyH59j7jvmSDbhzjTzz87rOb9M6fqFKwS23oK3g8UjOa/RKMx843t6f2fyDw5R6iV/MfsYxp/5h ec9PtI7O01WWO2hAWKMhH4qNgoLqxoOwyoZJDq7LJ2bgnIylEWUfZ/m359trhJW1H6wqn4oZY4yj DwPFVb7iMkM0mmfY+mkK4a+Je++Vtei1/QLLV4kMS3SEtGTXi6MUda96Mp3zLjKxbxur05w5DA9E 1yTjvMfz18wm00O20aFqS6i/OcD/AHzCQaf7J6fccozy2p3/AGBpuLIch5R+8/seLaPpV1q2qWum 2o5XF1IsaeAr1Y+yjc5igWaeqzZhjgZy5B9W6Vp1vpmm2un2wpBaRJDH4kIKVPuepzYAUKfOs2U5 JmR5k2i8LW7FWAfmd+WcPmWA6jp4WLXIVoK7LcKvRHPZh+y30HbpXOFt2HLw7Hk8s/L38wNW8k6w 9vOjvpsknDUbB6hkYHiXQH7Mi038eh7EWaTVywy/o9Q358AyDzfTumanYapYQ39hMtxaXCh4pUOx H8COhB6Z08JiQscnTyiYmiickxdirsVdirsVdir59/P3zje3Ou/4agkMdhYqj3SKf72aRRIOXiEV hQeNfanP9qagmfAOQdposQEeLqU0/KH8trSK1tvM2p8Li4mUS6dACGSJT0kbsX8B+z/rdMDHDqyz 5egeg67dsvG2Q05DlJTw7DLC0xDdpoUPpq1wWLkVKDYD2w0gyRiaXYJuIQT/AJVW/XXGkWUSFAFA KAdAMKFN1xSluo3htysca+pO/wBlcBLIBBNZ6rNvLOIgf2U6j7qfrwbpsIS40GI/FJI7nx2/txpk JIGeyWKMIoPFeld8LIF53+YHlozRnVLZP30I/wBIUftIP2vmv6vllWSPVvxy6Jd+XXmk6dejTbl6 Wly37pj0SU7fc368jjlWyckL3euX2maZ5g0t9O1BOcL7o42dHA2dD2Irlsogii14NRPDPjjzeaan +S/maCZv0dLDfQE/AS3pSU/ylb4fubMc4D0emw9vYZD1AxPzV9D/ACP8x3Vwh1SaKxtQf3nFhLKR XooX4fpLfRjHAerHP29iiPQDI/IPb9J0yz0vTbfTrNOFtaoI4lO5oO5PcnqcygKFPJ5ssskzKXMo zC1vnz877iaXzuY3rwgtokiHahq5/wCGY5h5/qe07BiBp775FPvyG8tK8l55hnSvpH6rZk/zEBpW H0EKPmcngj1cP2g1VAYh7z+h7NmS8u7FXYq7FXnP5pfllFr1u+r6VGE1uJayRrQC5Vex/wAsD7J7 9D2pXOF7t+HNw7Hk84/LT8xr/wAm6q1reiR9Hmfje2h+1E4NDIinoy0oy9/uy3Raw4ZUfpbdRgGQ WOb6asL+y1CyhvbKZbi0uFDwzIaqynOmhMSFjk6eUSDRV8kh2KuxV2KuxV8jeYpJ/MfnLWbqA8vW nuJou/7uMn0x9KhRnIZ5ceSR8y77GOGAD1H8h/Mn1nSLnQZnrNYN61sCdzDKfiA/1ZP+JYcUtqcf Uw3tn93pk82orMCPSqpap3ovUUyymgHZNMLFrFXYqo3VxFBEZJDQDoO5PgMUgJZp9vJNK99MPif+ 6HgPH+GAMieiJnkiiXlI4QeJNMUBLZ9VsRUBi/8Aqj+tMbZAFKbq9519K3d/D/MVwWzAQE0Rki5P GULdUbFmC8h84+XW0m/9SFaWVwSYqfsN1Kf09sonGnIhK2f/AJd+bTqFmLW4et9bAByerp0D/wAD /blkJW05IU9Ls7kOo33yxxyEwikwsESpqMULsVeYfnT5JuNTtIte0+MyXVkhju4lFWaAEsGAHdCT X2PtlGaF7h6DsPXDHI45cpcvf+1lP5ZWAsvIukR8ODSQ+u1epMzGSp+hhk8QqIdd2pk49RM+dfLZ lGWOA7FXYq7FXYq8y/NX8sBrKPrWjRAarGK3Nuop9YUdx/xYP+GyrJC9w5GHNWx5MF/K/wDM678o Xp0/UA0miTyfv4qHnBIdjIg69viX+PXI0WtOI0fp+5nqNOJix9T6Wtbq3u7aK6tpFmt51EkUqGqs rCoIPvnSxkCLDqCK2KrhQ7FXYq8/83fmvplhp96umI9zcRxSBLivCNX4kKyndmo3sPnnOaj2ixCX BiBlLlfIft/G7usXYuTh45nhHOurxP8AL60rNd3ZH2VWJD/rHk3/ABEZg4g2zKro2pHyf+YUF3Up ZPJSYDobafZv+AO4/wBXH6ZMZx4ovpIEEAg1B3BGZDr2mIUFiaAbknFUrN9e3kjJYgJEuxmb+3Bb KgObf6N1Fvt3rDx41/qMaWwuj0aLmHuJWnYfzdP440vEjJmSONnb4UQVPyGFCS29t+kJXurgExV4 xR9qDIsyaRgtYI/sRqvyAwsbUZ4gynFISi8t+u2LYCxnX9Gt9RspbScfC4+Fh1Vh0YfLIkWGyMqe RxSaj5d1sMPgubV/iH7Lqe3+qwzH3iXI2Ie4+Wdet9QsobuBqxyitD1B6FT7g5kg24k40yy3mDKC MLUQjYpMLFXBxQ3irz381PzEu/LCW2m6UiDULlDIZXAYRRA8VKr0LEg0rttlOXJw7B3fZPZsdRc5 /SPtLEfy6/M3zZeebbOw1O7N7aXrNG6MkalW4kqylFWlCN/bK8eUk7uy7S7LwxwmUBwmPve5ZlPJ OxV2KuxV2KvKvzW/K4ais2v6JHTUFBe9tF/3cAN3Qf788R+18+tWSF7hycOatixT8qPzSuPLN2ml ao7SaBO25NS1s7ftoOvAn7S/SN61ytDrTjPDL6PuTqdNxix9T6RgnhnhSeB1lhlUPHIhDKysKggj YgjOjBBFh1JFL8KHYq+dvNWi3Fs+o6S9fWiLRoxHHlTdGp4MKHPLMmI6bUGMv4ZfZ3/Ld7+Mxnwc Q/iCQ+QL1AlzYMOMgb1l8SNlYfRQZ0eIvPZAr+fdO9WxivkHx27cZP8AUfb8G/XhyDa1gXrH5S+Z P015Pt1lbld6f/ok/iQgHpt9KU38QcnjlYcPPCpMk1czyLFbRA/vmozDoAKdckWuKLggjgiWJBRV H3++FbUp7+zgPGSQBv5RufwwWtIZtdsR0Dt8gP4nG08JUJGu9TZY1Qw2oNWY9Tg5p5JiY4oYQBRY 4x9wGSYpQ17f3Jb6nEBEDT1G/tyNsqCk1nqz/wB5chfZf7AMd02EJc6LKwq907ff/EnGmQkgZbL0 owlS1O564WQLBvPflk39r9bt1reWwJAHV06lfmOoyucbbscqYv5E8zNpGoi2nallcsA9eiP0DfwP 9mVwlTPJGw9x0y+BAFdjmQ4kgnkUnTC1ouN64oVRih5z+aH5aal5nvrbUtNniS4hhFvLDOWUFQ7O pVlDb1c9RlOXEZbh3nZPakNPEwmDRN7LPy3/ACnm8v6h+l9Xmjmvowy2sMJJSPkOJcsQtW4kjptg x4qNll2n2uM0eCAIj1t6Xl7oXYq7FUPdX9jaLyurmK3XrWV1Qf8ADEeGNqASk915/wDJVrX1dbsy R1Ecqyn7o+XhkeMMxikeiU3P5x/l/DULqDTkdooJv1sqj8cHiBkMEu549+Y2q+StX1H9I+X0uILq Zj9djeNUhc/79WjEhj3HHfrsetEyDycvEJAUWX/kL55v4tXTypdO01jdLI9jXcwyRqZGUf5DKrGn j8zm17L1JEvDPI8nF1uEVxDm98zfOsdirzX819G4T22rxr8Mv7i4Ip9tRVD9K1H0DOM9qNJRjmHX 0n9H48np+wNTYOM9Nx+l4jfFtF8yx3qD9zI3qEDurbSL/HMLs/NxQHfHZt12Hhme4s7uIIbyzkhY hoZ0K1G+zDqM2h3dckv5P65LoXnR9Jum4QaiTayDt66EmJvpNVH+tlWM0aXPG42+g8yHBQGqXjxK sEG9xNstOoHSuApiHWek28KAyqJZjuzNuK+wONJJRaxxr9lQPkAMLFdiqVanO1xIthbmrMf3rDoA O39cBZDvRcdukMSxIKKophRaGnurWMkPKoPhXf7sCQEFNqlgKjmW+Sn+ONsqKVXeo2pqFRz4bD+u C2YCXyqJo/UClQexFDiyDyrz35cNhdm/t1pa3DfvFHRJDv8Ac2UZI1u5EJWyb8uPNZuYBp1y/wDp VuP3THq8Y2+9cnjlezDJDq9TsLsOoFctcUhNIpMLFFI1RixXlgASTQDck4qxPW/zT8k6QzRy34up 16wWg9Y/8EP3YPzbIGYDbHDIsJ1T/nILdl0rSdv2ZbqT9ccY/wCN8gczaNN3liuofnR58u6+ndRW an9m3hT7gZPUb8cgchbRgiEobV/zA1r/AI+tSvVb9lGmZN9/sr8OC5FnwxHcut/y+853R5/o915b lpnRDv4h2DY+HJfEimlv+UPmeTeWW1hHcM7sf+FQj8cl4RY+MEyg/Jec09fVVXxCQlvxLrkvB82P jeSNH5N6YkLlr+eSQKSvFUUE08Dyw+CEeMWHflldi18/6FKTTldpF/yO/df8b5LRSrNH3stQLxn3 PrXOsdG7FUu8xaSuraLdWB+3KhMJO1JF+JDXw5Df2zD1+lGfDLH3jb39PtcnR6g4csZ933dXzd5q 05p9PduNJrUl6Eb0Gzj+P0Z5xoshhko9dntdbj48djpui/JepfW9JEDmstofTPjwO6H+H0Z0uM2H npjdJfO1nJZ6rBqVuShloea9VlipQ/dTIZBvbKG4p9DeU9ei17y7Y6qlOVxGDMo6LKvwyL9Dg5fE 2HXzjwmkXHYkX8l1I3KopGvhtjSL2X3t5FaRc33J2VB1JxKgWglOt3I5qUt0O4B60+5jjunZs6bq Em0t4ePcLX+oxpbCKtLCC1UiMVY/ac9TjSCbQ2rXEnwWkB/fTbGnZcSmIU49Fso1HJPUfuxJ/VjS eJcbO2X7MSD5KMVtTlhUrQCnyxW0pvLfrtizBY9q+mQXdtLbTryilUq4/p7jARbbEvHr211Dy7rY CMVmgYPBLTZlPQ/I9CMxiDEuQDYex+U/McGp2EV1EaE7SJ3Vx1U5kRlYcacaZra3AdQa5JoIU9c8 zaX5f0x9Q1GXhCuyIN3kc9ERe5OAypYwMjQeCeavP/mfzdem2QyRWUjcbfTLepDeHPjvI3z28AMx 5TJc2GIRRmj/AJR67dqsmoSpYRnfh/ey/SqkKP8AgskMR6qcw6Mv0/8AKjyrbAG4Wa9cdfVcqtfZ Y+H4k5YMQazlLIrLy7oNjT6pp9vCR+2sa8v+Cpy/HJiIDAyJTHJMXYq7FXYq7FXzlI0mna+zRMYp LO6JjdTQq0UmxBHhTMGRI5c3OjRq+T6s8l+aotf03lJRNQt6JdxDbc9JFH8r0/hnR9ldox1WO/4x zDrO0NEcE6/hPJkGbNwHYq8d/MjRRY+YJJlT/RtQBmXw5naUb/5XxfTnnntDpPB1HEPpnv8AHr+v 4vadjajxMPCecNvh0/V8HlejynRPM5tnNLeY+nU/yvvGfoNPxzK0mbjiC4OpxcEiGVeZtO+v6PPE orLGPVi/1k3p9IqMzJiw4sTRTD8g/MfGa98vTPtJ/pdmCf2hRZVHzHE/Qchil0a9TDq9nJABJ2A6 nL3ESm0T6/evdyCsMR4wqelR/nXAyOyakgAkmgHUnCxQsmq2EZoZgT/k1b9WC08JQ8mtwn4beN5Z D9kUoP642nhXadZSq7XVzvcSdB/KMQFJXahfJbcUVTJM/wBmMYkqAgWl1qT7MKRj36/if4YN07KL W+tN1nRR4AD/AJpx3TYQlxpmoMKtdH6Af7MaSCEDJZvHFxdzIw6scLMFh/nPy2NUsT6YH1yCrQN4 +KH/AFv15CcbDbCVME8o+YZdD1Sk1RaynhcoeqkGganivfKYSots42Htltrlra2T3k8oW2iT1Hkr UcQK7eNe2ZFuKY28Z81eZdW84a8nBHaMv6WnWS78Qxp8uTdWP8BmPKRkXJhARD0/yV5Js/L9qJZQ s2qSj99cUrxB/Yjr0Hie+XwhTTOdsoyxrdirsVdirsVdirsVdir5885Q+j5r1VPG5kf/AJGNz/42 zEnzLmQ5B6B5c1y80u6tdUtDWQKpkjJoskbAFkb59vA75oNHrJaXNxR6Hcd4d9qdNHUYuE9Xu2ka rZ6rp8N/ZtygmFQDsykbMrDsynY56Zp9RDNATjyLw2bDLHMxlzCMy5qYv+YujfpDy9JMi1uLE+uh pvwApIK+HH4vozR9v6PxtOSPqh6v1/Zv8Ha9j6nw8wB5S2/U+efONjzgjvUHxRHhIR/KTsfoP684 3s3LRMe96TtHFYEu5k3l7Uv0jpMFwTWUDhN/rrsfv650MTYdFIUWINcz+VfOkN/bCi28y3ESjblE 9Q6fIqWTKj6ZMyOKNPp21ube8tIrmBhJb3EayRuOjI4qD9IOZLrSKXxRRQxhI1CoOgGKpU5k1S5M aMVs4j8RH7Rwc2XJHRadZRiiwqfdhyP440iyrrGiCiKFHgBTChZPPHBE0shoq/j7DFQl+mwvcTPf zDdtoR4DpX+GAMj3I51woUXXFKV6pq+kaanLULyG1Vvs+s6oT8gTU/RgJAZCJPJiOofmR5IRiq6h 6h6H04pSPv40yHiBtGKSRzfmJ5UkYgTSgfzGJqfhg8QNgxlgfm6bQ7u8F9pc4Zpv96IeDoQ3845A DfvlU6O4bYX1QU3mHUZtFi0h3/0aJ+Vd6kD7Kn2U/wCe2DiNUnhF29K/KzyktnZjW7tP9Lul/wBF Vh9iE/tD3f8AV88uxQ6tOWfR6BlzS7FXYq7FXEgCp6Yqld75o8u2NRdalbxsvVPUVn/4Fat+GRMg GQiSkF7+bHlO3qIWnuz29KMqP+ShjyByhmMRSC9/Oec1Fjpip4PPIW/4VQv/ABLInMyGFIb380PN 9zUJcR2qnqsEaj7i/NvxyBylmMUUhkh1nU7l7mSOa5nlNXmYEkmlN2OY888BzIciGGR5As502KWL T7aKUcZI41Vl2NCBTtnO5pAzJHK3oMMSIAHnTLPJPmw6BqHC4c/ou6YC4HaNzsso/U3t8s3PYfah 08+CX93L7PN1na2g8aHFH6x9vk9oz0N4xplVlKsAysKMp3BB7HARag08C826AtlqV/pMg/c1IiJ3 /duOSH5gEfTnl+t050uoMR/Cdvd0e+0uUajACeo397DfJd49lqs+lzmnqkhR/wAWR16fNc32DIJC xyLos0CDR6Jh59071bGK+QfHbtxk/wBR/wCjfryzINrYQL0T8j/Mn6R8tPpUz1udKbilTuYJKsn/ AAJ5L8qYcUrDi6iFG+9nupmf6oywKWd6Lt1APXLC0hUsrZba2SIdRu58WPXCEEoa61Nlm+r2sfrT D7XgMFsgFL09dk3MkcQ8Nv6NjuuzaaQ0jh7ydpqdE3AxpeJMQoUBQKAbADwwsULqeo6fptnJe386 W1rEKvLIaAe3uT2AwE0kAnk8X85/nTd3Zez8uKbW23DXzj98/b4FNeA9z8XyymWXucvHgrmw7SvK PmrzE5u44ndJTVr25YgMT35NVn+gHICBLcZiLJLb8mNRYD6zqUMR7iONpB/wxjyYwlgcwRP/ACpX /tc/9O3/AF9w+D5o8byS7U/ylu7G0lum1W3EMS8neVXjA/4H1MBxV1ZDLfRhCQlZRUBlU9N6Gn3H KqbXrfk38wGvZo9P1KOOF2HG3njHBKgbKynYe1MyIT73HnjrcMkvfNvlmyr9Y1O3Vh1RXDsP9inI 5MzAaxAlIb382/K0FRbie7bsUTgp+mQqfwyByhmMRSC9/Oe7aostNjj/AJWmkZ/+FUJ+vInMzGFI bz8y/ON4eKXQgDfsW8ag/QSGb8crOUsxiCWzL5q1T/ehru5BO3ru5X6OZpmNPVQHOTkQ0szyivh8 oao+8hjiHcFqn/hQf15jS7RxjlZcmPZ+Q86CYQeSoRT17lm8QihfxPLMeXaZ6ByI9mjqUfD5X0aL dojIR3dj+oUGY8tdlPWm+OhxjpaLjg0y2/uo4oyP5VWv4b5TKeSXMkt8YQjyAC9r+3HQlvkP65EY iy8QIu3stZu6fVNLupwehSJyPvAOZOPs/NPlGR9wLjz1mOPOQHxCc6P+XvmjVL6CO+s2sdO5BriS QhW4DcgLXlyI6bZtdF2DmlMcUeGPUl1+q7XxRieE3J7fnfvHuxVgH5r6MZLa21eNatCfQuCK/YY1 Q+FA1R9Ocn7UaS4xzD+HY+7p9v3vRdgampHGeu49/X8eTwjzRbyWeowanB8LMQS3hIm4+8ZpOzc1 x4e52PaOKpcXezJGttW0kH/dN3FQjw5Ch+lTm75h0/IsY/LjXJPLPneBbhuEEzmyva9ArsAG37K4 Vq+GUwNFlljxRfS+ZLr0Hql2be3on97IeMdOvucBSA3p1kttAKisz7yN7+H0YgKSisKHYqw/zv8A mXoflhGgLC81Uj4LKM7rXoZW34D8fbISmA248Rl7nher695q87auiyl7qZifq9nECIogevFa0Huz fScoJMi5sYxgGe+VPyssLHhd6zxvLsbi36wofcH7Z+e3tl0cVc2qeW+TPAAAABQDYAZa0t4q7FXn P5n6nJNcQ6XGaRRASzAd3b7IP+qu/wBOU5D0b8Q6sBFtv0yum1DX06qnoIasftkdvbIkpCMsPKl3 dQRzvKkUcg5KKFmoem2w/HNdm7QjAkAWQ5+LQSkAbq00h8mWK09aeSQ/5NEH/G2Ysu0pnkAHKj2d EcySj4PLujw0pbKxHdyX/AmmY0tZlPVyI6TGOiLUWduOKBIh/KoA/AZSeKXOy3ARjy2aF4juEiRp XbZVUVJ/jko4ZHZjLKAm1l5W85X9Pqukyop6PMPSFPGshTNlh7G1E+UD8dvvcLL2phhzkPv+5PrP 8o/NM9DeXtvaKf2U5SOPoAUf8Nm0w+zGQ/UYj7XAydvQH0gn7E8s/wAl9GWhvtQubph1CcYlJ+R9 Q/jmzxezeIfVIn3UP1uBk7cyH6QB9qe2f5beS7WhXTllYdWmZ5K/Qx4/hmwx9jaaH8F++y4c+088 v4q9yeWmk6VZU+p2cFtTp6UaJ/xEDM7Hgxw+mIHuDiTzTl9RJ+KKy1rdirsVdiqF1bTodS025sZv sXEZTlSvEn7LU/yTQ5RqsAzY5YzykG7BmOOYmOhfOvmLSZZLa6sJV43MLMvHwljJFPvFM8vxmWDL UuYNF7zLEZsW3UWEu8g6kWim06Q/FGfViB/lOzD6Dv8ATnT4j0ebmEv896d6OoJeIPguVo/+um34 imDIN0wL3n8tvMf6f8o2V278ruAfVrzep9WIAcj7uvFvpy6ErDg5YcMk+msVlvI7hmNIh8Mfavjh phaKwoUrm4t7aB7i4lWGCIFpJZGCqqjqSx2AxUB4158/OuSX1NO8sMY491k1Mijt4+ip+z/rHfwp 1yiWTucvHp+smF+V/I2s+Y5vrUxaCxZi0t5LUtIa78Aftn36ZGMCW6UxF7BoPl3SdDtBb2EISv8A eTNvI58Xbv8ALpmRGIDjykTzTPJMXYqh76/srC2e5vJkt4E+1I5oPl7n2wE0kC3mfmf82ppedtoK GKPob2QfGf8AUQ/Z+Z+4ZTLL3N8cXewI6nqIld5ZXkkc8nMpLEk9yW3ykSbuFp7+9nPBerfsoNz/ ABxMu9RFNtG8rXEsizXymKEb+kdnb5jsM1up14AqG5dhp9CSbnsGXgAAACgGwAzSu4W2sV9qOow6 dpsfq3EzcV+fc17AdScy9NpJZZCIFyLj59RHHEyPIM50/wDJrUZaNquqLGO8Vupf/hm4Af8AAnOn wezB/jkB7t/tLoc3bw/hiT72Tad+VXk6zoZLd7xx+3cOT/wqcF/DNvh7D00OY4vef7HW5O1s8uR4 fcyay0zTbFOFlaw2y0oRCip9/EDNnjwwx7RAj7g4M8sp/USUTlrW7FXYq7FXYq7FXYq7FXYq7FXk /wCaGjfVNZTUI1pDfrVqdpY6BunitD865wXtLpPDzDIOU/vH4+96/sLU8eIwPOH3F47eltF8yx3i CkLt6hA7q20i/ryGgzcUB3jZhrsPDM9xZZ5lsF1HRJRH8boBNARvUqK7fNajNnMWHXxNFr8i/Mf1 HzDNo8zUg1NKxA9BPECR/wAEnIfdleKW9MdRCxfc97zIcJIvNfnPQ/LFl9Y1Gb964P1e1TeWUj+V fDxY7ZGUgGcMZlyeA+bvPvmPzjerbkNHZs9LbTIKsCa7cqbyP7/cBmPKRk5sMYgyfyh+VccXC918 CSXZksAaov8AxlI+1/qjb55bDF3sZ5e56QiKihEAVFACqBQADoAMuaG8VcSAKnpirCfNH5oaVpnO 203jf3o2LA/uUPuw+18l+/KpZQOTbHETzeaXV35j80Xnq3MjT8TsT8MMYPYAbD6N8ws+pjDeRc3B ppT2iE90vy1ZWdJJf39wN+TD4Qf8lf45pc+tlPYbB3ODRRhudymktvby/wB7EklOnJQf15iRmRyL lSgDzDooIIv7qNY/9UAfqxlMnmVjEDkG5Jo4xV2A9u+ARJ5JJAVNL0rWvMFz9U0q3Zx0klOyKPF3 6L+vNjo+z8maVQF/cHC1OshiFyNfe9j8leRbDy1bl6i41KUUnuiOg/kjHZf1/gO77N7Mhpo3zmeZ /QHkddr5Zz3RHT9bJ82jgOxV2KuxV2KuxV2KuxV2KuxV2KuxV2KpD530Y6r5duIUXlcQf6Rbjepe MGoAHdlJAzV9s6Tx9PKI+obj3j9Y2dh2ZqfBzAnkdj8Xzz5psPrOmmVRWS2+Mf6v7X4b/Rnn+gy8 M66Seu12LihfUI3yVqX1vSRA5rLaH0z48Duh/h9GdNjNh56Y3YpqsdxoXmQT2p4PBKl1aN2FG5r9 xFMqkKLMbh6z5n/PHTrfSoBoaC41O5hV5C4PpWzOoJVunN16UG3v2y2WXucWGnN78nlun6V5m85a tJOzvczOwNzezE8EHuf1KuVAGRckkRD1zyt5L0ny9CDCvrXrCkt44+I+IUb8F9h9NcyIwAceUyWQ ZNg7FUk8xecdE0GP/TJudyRVLSOjSnwqP2R7nISmAzjAl5P5i89eYPMUptYgbezfZbOCpLD/AIsY bt+r2zGyZtrOwcnHh3oblrSvKPSXUD7iBT/xJh/DNRn7R6Q+btsHZ/WfyZIiQW8QVFWKJeigAAZq yTI2dy7MARFDYOtI9R1O6Wz0u3e4nboFFdvE9gPc5lafRzyS4Yiy0ZtTGAsmgze0/KDXZbdHutUi t5mFWhWP1Avtyqu+dFj9l5EXKQB+bpJ9vxB2iSEXF+S7mnr627DuqQcfxMh/VmRH2Xj1n/sf2tMu 3z0j9v7E1038ofK1q4kuTPfONysrhUr/AKqBT95zPw+z+nhvK5e/l9jiZe2c0uVRZlaWdpZwLb2k KQQJskUahVH0DNzjxxgKiKDq5zMjZNlWybF2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV4f510R dL1+6tgtLab99AKbenJX4R7Kar9GeZdsaT8vqJAfSfUPcf1HZ7vs3UeNgBPMbF5vo0x0TzObdzS3 lb0iT/K+6N9BpXNppc3HES73U6nFwSMUx/MKCP0rOen7zkyE+K0BzJytEEu8h+WLfzDrTW1y7JbQ RGaUJ1ajKoSvavLrkIRspySoPcbGwsrC1S1s4Vgt4xRI0FB/affMoCnFJtEYUIbUdSsNOtWur6dL eBeruab+AHUn2GAmkgW8w8z/AJs3dxzttDU20PQ3bgeq3+ou4X9fyyiWXub44u9ith5f1LUpDc3b siSHk80lWkcnvvv9JzWajXRhsN5OywaKU9zsGV2GmWVhHwt46E/akO7N8zmny55ZDci7fFgjjGwX y3ihhHEPUkJoAN9z22wQxEspZAGX+Wvyr1fVCl3rbtY2h3WAAeuw+R2j+nf2zp+z/Z+c/Vk9Ee7+ I/q/GzodZ2zGO0PUfs/a9W0fQ9J0e1Ftp1slvH+0V3Zj4ux+Jj8867T6XHhjwwFB5zNnnlNyNo7L 2l2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVhP5paP9Z0iLUo1/e2TUkPjFIQD86N T8c5r2m0nHhGQc4fcf219rvOwtTw5TA8pfeHg3nGx5RRXqD4ozwkI/lP2T9B/XnL9m5aJh3u87Rx WBJR8w6mNQ8vabMWrMHZJh35ooBP07H6c3cjYDpoiinf5NITrV+/7ItgD8zIv9Mlh5sM3J60zBQW YgKBUk9AMyHHYN5o/NPTNP522khb67Gxlr+4Q/Mfb+jb3yqWUDk2xxE83m083mHzNeme5ke4Ybc3 +GKMeCgbL8gMws+pjDeRc3BppT2iGQaV5asrKkkg9e4G/Nh8IP8Akr/HNLn1s57DYO5waOMNzuUz mnjiFXO/ZR1OYkYkuUZAJh5f8qeYfM0n+iRehYVpJdyVEY8QD1c+y/Tm40HZOTObiPT/ADjydbrO 0YYhud+5615W8g6F5fVZIo/rN/T4ryUAsP8AUXog+W/vnaaHsrFp9wOKfef0dzy2q7QyZtjtHuZL mzcF2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVSuraK6tZraYVhnRo5B0qri h/A5DLjE4mMuUhTPHMwkJDmN3z7r2jvBPe6VdD4kLRMaUr/K4r47MM8ry45afMYnnA/j5voEJxz4 gRykPx8nmE6zws9rIaem5qvYMNifwzoIyEgCORdBKJiSCyj8v/M+n+XpNQu7vk7SRIkECD4nbkT1 OwA71y3HKmnJElQ8w+dvMHmSX6sKw2jn4LKCtD/rnq/07e2RyZtrOwZY8O9DcrtK8ogUl1A17iBT /wASYfwzT5+0ekPm7fB2f1n8mSpHDBEERVjiQbKNgBmsJMjZ3LsgBEUOSy3F9qF0tnpkD3FxJsqo Kn5+w9zmTg0sskuECz3NGbURgLJoPSfKn5R28BS88wMLm4+0LJTWNT1+Nv2/l0+edjoPZ+Mall3P 83p8e/8AHN5rWdsSltj2Hf1ejRRRxRrFEixxoAqIoAUAdAAOmdJGIAocnRkkmyuwodirsVdirsVd irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVeZfmto3pXlvq0a0S4Ho3BH+/EFUJ/wBZ Nv8AY5xPtRo6nHMP4tj7+n2fc9T2BqbicZ6bj3dft+94j5v08x3S3iL+7mHGQjs4/qM13Z2a48J5 hyu0MVS4h1Q+leWby8pJNWC3P7TD4mHsv8TlmfXRhsNy14NFKe52DLrDTLOxj4W8YUn7Tndm+ZzT Zc8shuRdtiwxxiohUnuo4tvtP/KP45GMCWcpgMg8r/l5rnmEpdXhNjpZ3EjD43H/ABWh8f5jt886 Hs7sOeb1H0w7+p9zptb2rDHsPVL8c3r2g+W9H0K1+r6dAIwf7yU/FI58Xc7n5dPDOz0ujx4I1AV9 5eX1GpnlNyKZ5lNDsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdiq V+Z9HGr6HdWQAMrrygO20qfEm56VIofbMHtLSfmMEodSNvf0cvQ6jwcsZ9OvueEMu/FhuDuD4jPL eT3/ADaZlVSzGgHc4gWpK2wtdV1m8FlpMDTSt1I7D+ZmOyj3OZul0U8suGIsuLqNVHHG5Gg9U8o/ lZpmlFLzVON/qA+IKRWGM/5Kn7R92+7O27P7Dx4qlk9U/sDy2s7Wnk2h6Y/aWdZvXUOxV2KuxV2K uxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV5B+YfljULDVLjUbW1e awuX9QNEOXCR93DgbgFqkGlN84LtrsnJHNLJEfu5b+49ftev7L7RhLEISPrigvK35ba1rrrdanzs NOrsGFJXH+Qh6D/Kb8cn2d2FPLvP0Q+0sdb2tHHtH1S+wPXtG0PS9GsxaadAsEQ+0Ruzn+Z2O7HO z0+mx4Y8MBQeYzZ55ZcUjaOy9pdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV dirsVf/Z + + + + + + + 300.000000 + 90.000000 + Pixels + + 1 + True + False + + + Cyan + Magenta + Yellow + Black + + + + + + Default Swatch Group + 0 + + + + + + image/svg+xml + + + uuid:E5D4E60BC42DDD1197D69574EC258430 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/templates/registry/config.yml b/templates/registry/config.yml new file mode 100644 index 0000000..b48856a --- /dev/null +++ b/templates/registry/config.yml @@ -0,0 +1,7 @@ +name: Registry +description: | + Secure Docker registry. Web based administration. Optional LDAP authentication. +version: v2.1.0-2.0 +category: Applications +maintainer: Steve Shipway +