From 4e5d74b6f715c8d7c2622415ff4aa482d6a04576 Mon Sep 17 00:00:00 2001 From: xinity Date: Sun, 28 Feb 2016 16:21:46 +0100 Subject: [PATCH 01/12] initial release of gogs for Rancher Community Catalog --- templates/gogs/0/docker-compose.yml | 14 ++++++++++++ templates/gogs/0/rancher-compose.yml | 33 +++++++++++++++++++++++++++ templates/gogs/catalogIcon-gogs.png | Bin 0 -> 32973 bytes templates/gogs/config.yml | 5 ++++ 4 files changed, 52 insertions(+) create mode 100644 templates/gogs/0/docker-compose.yml create mode 100644 templates/gogs/0/rancher-compose.yml create mode 100644 templates/gogs/catalogIcon-gogs.png create mode 100644 templates/gogs/config.yml 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 0000000000000000000000000000000000000000..efc606b0062dfa5b9906b4e409b2302d8b69ad79 GIT binary patch literal 32973 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 literal 0 HcmV?d00001 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 From 9ae372829adb36ea4757e30faa2cccf5c62e7d0c Mon Sep 17 00:00:00 2001 From: Dominik Hahn Date: Tue, 1 Mar 2016 10:27:58 +0100 Subject: [PATCH 02/12] Update MongoDB image to 3.2 --- templates/MongoDB/1/README.md | 18 +++++++++++++ templates/MongoDB/1/docker-compose.yml | 35 +++++++++++++++++++++++++ templates/MongoDB/1/rancher-compose.yml | 19 ++++++++++++++ templates/MongoDB/config.yml | 2 +- 4 files changed, 73 insertions(+), 1 deletion(-) create mode 100644 templates/MongoDB/1/README.md create mode 100644 templates/MongoDB/1/docker-compose.yml create mode 100644 templates/MongoDB/1/rancher-compose.yml 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..1d4652f --- /dev/null +++ b/templates/MongoDB/1/rancher-compose.yml @@ -0,0 +1,19 @@ +.catalog: + name: "MongoDB" + version: "3.0.1-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..d826382 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.0.1-rancher1 category: Database From 8a9df1927760e67c404a22ebd5d0fddf4f732c31 Mon Sep 17 00:00:00 2001 From: Dominik Hahn Date: Tue, 1 Mar 2016 13:24:35 +0100 Subject: [PATCH 03/12] Fix rancher version --- templates/MongoDB/1/rancher-compose.yml | 2 +- templates/MongoDB/config.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/templates/MongoDB/1/rancher-compose.yml b/templates/MongoDB/1/rancher-compose.yml index 1d4652f..f52c0cb 100644 --- a/templates/MongoDB/1/rancher-compose.yml +++ b/templates/MongoDB/1/rancher-compose.yml @@ -1,6 +1,6 @@ .catalog: name: "MongoDB" - version: "3.0.1-rancher1" + version: "3.2-rancher1" description: "MongoDB Replica Set" uuid: mongodb-1 minimum_rancher_version: v0.46.0 diff --git a/templates/MongoDB/config.yml b/templates/MongoDB/config.yml index d826382..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.1-rancher1 +version: 3.2-rancher1 category: Database From 4e5eefe245abb5fe1f1e6da365135db4a31fe44e Mon Sep 17 00:00:00 2001 From: Steve Shipway Date: Fri, 4 Mar 2016 01:35:43 +0000 Subject: [PATCH 04/12] Add Minecraft template --- templates/minecraft/0/docker-compose.yml | 24 ++ templates/minecraft/0/rancher-compose.yml | 92 +++++ templates/minecraft/README.md | 18 + templates/minecraft/catalogIcon-minecraft.svg | 367 ++++++++++++++++++ templates/minecraft/config.yml | 6 + 5 files changed, 507 insertions(+) create mode 100644 templates/minecraft/0/docker-compose.yml create mode 100644 templates/minecraft/0/rancher-compose.yml create mode 100644 templates/minecraft/README.md create mode 100644 templates/minecraft/catalogIcon-minecraft.svg create mode 100644 templates/minecraft/config.yml 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..d4a1773 --- /dev/null +++ b/templates/minecraft/README.md @@ -0,0 +1,18 @@ +# 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 load balancers will run on every host with the label **LB=1**. If +no hosts match this, then you will get no load balancers! + +### 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 From ffc90ce0c55c63a2bfe3c177dac20bdff8cd4586 Mon Sep 17 00:00:00 2001 From: Steve Shipway Date: Fri, 4 Mar 2016 01:43:07 +0000 Subject: [PATCH 05/12] Updates to README --- templates/minecraft/README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/templates/minecraft/README.md b/templates/minecraft/README.md index d4a1773..6f5352c 100644 --- a/templates/minecraft/README.md +++ b/templates/minecraft/README.md @@ -6,8 +6,9 @@ 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 load balancers will run on every host with the label **LB=1**. If -no hosts match this, then you will get no load balancers! +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 From aa7337cfebfff3f5c0326451049bb39fbda77ab5 Mon Sep 17 00:00:00 2001 From: Steve Shipway Date: Fri, 4 Mar 2016 01:45:37 +0000 Subject: [PATCH 06/12] Add Janitor container definition --- templates/janitor/0/docker-compose.yml | 15 +++++++++++ templates/janitor/0/rancher-compose.yml | 25 ++++++++++++++++++ templates/janitor/README.md | 16 ++++++++++++ templates/janitor/catalogIcon-janitor.svg | 31 +++++++++++++++++++++++ templates/janitor/config.yml | 7 +++++ 5 files changed, 94 insertions(+) create mode 100644 templates/janitor/0/docker-compose.yml create mode 100644 templates/janitor/0/rancher-compose.yml create mode 100644 templates/janitor/README.md create mode 100644 templates/janitor/catalogIcon-janitor.svg create mode 100644 templates/janitor/config.yml 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..df71318 --- /dev/null +++ b/templates/janitor/README.md @@ -0,0 +1,16 @@ +# 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. + +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 + From 49f47f67cd763c5f7550a1e545b262e628e43f0e Mon Sep 17 00:00:00 2001 From: sshipway Date: Fri, 4 Mar 2016 02:06:56 +0000 Subject: [PATCH 07/12] More text --- templates/janitor/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/templates/janitor/README.md b/templates/janitor/README.md index df71318..fdfb873 100644 --- a/templates/janitor/README.md +++ b/templates/janitor/README.md @@ -9,7 +9,8 @@ scheduling rule (default is `janitor.exclude=true`). 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. +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. From c7e967f6b26a02378f799e5e17d039422e3bb4af Mon Sep 17 00:00:00 2001 From: Jan Broer Date: Mon, 7 Mar 2016 22:07:07 +0100 Subject: [PATCH 08/12] Add DataDog template --- templates/datadog/0/README.md | 13 +++++++ templates/datadog/0/docker-compose.yml | 14 ++++++++ templates/datadog/0/rancher-compose.yml | 42 +++++++++++++++++++++++ templates/datadog/catalogIcon-datadog.svg | 39 +++++++++++++++++++++ templates/datadog/config.yml | 8 +++++ 5 files changed, 116 insertions(+) create mode 100644 templates/datadog/0/README.md create mode 100755 templates/datadog/0/docker-compose.yml create mode 100755 templates/datadog/0/rancher-compose.yml create mode 100644 templates/datadog/catalogIcon-datadog.svg create mode 100755 templates/datadog/config.yml 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 From b85c3e22205f8023fd58ced099ae35b3863223f6 Mon Sep 17 00:00:00 2001 From: sshipway Date: Fri, 4 Mar 2016 03:34:25 +0000 Subject: [PATCH 09/12] Add community logspout template --- templates/logspout/0/README.md | 14 ++++++++ templates/logspout/0/docker-compose.yml | 14 ++++++++ templates/logspout/0/rancher-compose.yml | 33 ++++++++++++++++++ templates/logspout/catalogIcon-gliderlabs.png | Bin 0 -> 19599 bytes templates/logspout/config.yml | 5 +++ 5 files changed, 66 insertions(+) create mode 100644 templates/logspout/0/README.md create mode 100644 templates/logspout/0/docker-compose.yml create mode 100644 templates/logspout/0/rancher-compose.yml create mode 100644 templates/logspout/catalogIcon-gliderlabs.png create mode 100644 templates/logspout/config.yml 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..f4e0ad4 --- /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: "" + 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 0000000000000000000000000000000000000000..585830245cb3c6b30b6d0c76f24c5a94c1cec1b2 GIT binary patch literal 19599 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 Date: Fri, 4 Mar 2016 03:54:01 +0000 Subject: [PATCH 10/12] Add registry template (using registry:2 and Portus) --- templates/logspout/0/rancher-compose.yml | 2 +- templates/registry/0/docker-compose.yml | 99 ++++++++++ templates/registry/0/rancher-compose.yml | 109 +++++++++++ templates/registry/README.md | 79 ++++++++ templates/registry/catalogIcon-registry.svg | 201 ++++++++++++++++++++ templates/registry/config.yml | 7 + 6 files changed, 496 insertions(+), 1 deletion(-) create mode 100644 templates/registry/0/docker-compose.yml create mode 100644 templates/registry/0/rancher-compose.yml create mode 100644 templates/registry/README.md create mode 100644 templates/registry/catalogIcon-registry.svg create mode 100644 templates/registry/config.yml diff --git a/templates/logspout/0/rancher-compose.yml b/templates/logspout/0/rancher-compose.yml index f4e0ad4..027a841 100644 --- a/templates/logspout/0/rancher-compose.yml +++ b/templates/logspout/0/rancher-compose.yml @@ -28,6 +28,6 @@ - "rfc5424" - "rfc3164" required: true - default: "" + default: "rfc5424" description: | The Syslog format to use. If not certain, use rfc5424 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 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 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 + From 94290f426c248cdccc5297de67460d38a136e38d Mon Sep 17 00:00:00 2001 From: Sebastien Langoureaux Date: Tue, 8 Mar 2016 10:00:44 +0100 Subject: [PATCH 11/12] Add Alfresco template --- templates/alfresco/0/README.md | 33 +++++++++++++++ templates/alfresco/0/docker-compose.yml | 24 +++++++++++ templates/alfresco/0/rancher-compose.yml | 45 +++++++++++++++++++++ templates/alfresco/catalogIcon-alfresco.svg | 21 ++++++++++ templates/alfresco/config.yml | 5 +++ 5 files changed, 128 insertions(+) create mode 100644 templates/alfresco/0/README.md create mode 100644 templates/alfresco/0/docker-compose.yml create mode 100644 templates/alfresco/0/rancher-compose.yml create mode 100644 templates/alfresco/catalogIcon-alfresco.svg create mode 100644 templates/alfresco/config.yml 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 From 7b1a8ef5a35515699afc8afded2f592a65ad9c34 Mon Sep 17 00:00:00 2001 From: Edward Marshall Date: Fri, 4 Mar 2016 19:25:35 +0000 Subject: [PATCH 12/12] Updated to work with Prometheus 0.17 and DNS based service discovery --- templates/Prometheus/0/docker-compose.yml | 25 ++++++++++------------ templates/Prometheus/0/rancher-compose.yml | 2 +- templates/Prometheus/config.yml | 2 +- 3 files changed, 13 insertions(+), 16 deletions(-) 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