From 24d80f79b7a1c26671553cbca4e997e468154332 Mon Sep 17 00:00:00 2001 From: Tristan Holl Date: Thu, 23 Jun 2016 01:01:56 +0200 Subject: [PATCH] Sentry 8.5.0 (#175) * added sentry 8.4.1 * upgrade to version 8.5.0 --- templates/sentry/0/README.md | 20 ++++++ templates/sentry/0/docker-compose.yml | 91 ++++++++++++++++++++++++ templates/sentry/0/rancher-compose.yml | 65 +++++++++++++++++ templates/sentry/catalogIcon-sentry.png | Bin 0 -> 12098 bytes templates/sentry/config.yml | 4 ++ 5 files changed, 180 insertions(+) create mode 100644 templates/sentry/0/README.md create mode 100644 templates/sentry/0/docker-compose.yml create mode 100644 templates/sentry/0/rancher-compose.yml create mode 100644 templates/sentry/catalogIcon-sentry.png create mode 100644 templates/sentry/config.yml diff --git a/templates/sentry/0/README.md b/templates/sentry/0/README.md new file mode 100644 index 0000000..c35b928 --- /dev/null +++ b/templates/sentry/0/README.md @@ -0,0 +1,20 @@ +# Sentry + + +### Info: + This templates creates a complete [sentry](https://github.com/getsentry/sentry) setup including postgres and redis servers. + + Images are the offical images from: + * Sentry: [https://hub.docker.com/_/sentry/](https://hub.docker.com/_/sentry/) + * Postgres: [https://hub.docker.com/_/postgres/](https://hub.docker.com/_/postgres/) + * Redis: [https://hub.docker.com/_/redis/](https://hub.docker.com/_/redis/) + +### Usage: + + * Select Sentry from catalog. + + * Required: Enter a sentry secret + + * Optional: Email configuration + + * Click deploy. diff --git a/templates/sentry/0/docker-compose.yml b/templates/sentry/0/docker-compose.yml new file mode 100644 index 0000000..ee4aced --- /dev/null +++ b/templates/sentry/0/docker-compose.yml @@ -0,0 +1,91 @@ +sentry-postgres: + environment: + POSTGRES_USER: sentry + POSTGRES_PASSWORD: secret + PGDATA: /data/postgres/data + log_driver: '' + labels: + io.rancher.scheduler.global: 'true' + io.rancher.container.pull_image: always + tty: true + log_opt: {} + image: postgres:9.5.3 + stdin_open: true +sentry-cron: + environment: + SENTRY_EMAIL_HOST: ${sentry_email_host} + SENTRY_EMAIL_PASSWORD: ${sentry_email_password} + SENTRY_EMAIL_PORT: '${sentry_email_port}' + SENTRY_EMAIL_USER: ${sentry_email_user} + SENTRY_SECRET_KEY: ${sentry_secret_key} + SENTRY_SERVER_EMAIL: ${sentry_server_email} + log_driver: '' + labels: + io.rancher.scheduler.global: 'true' + io.rancher.container.pull_image: always + tty: true + command: + - run + - cron + log_opt: {} + image: sentry:8.5.0 + links: + - sentry-postgres:postgres + - sentry-redis:redis + stdin_open: true +sentry-redis: + log_driver: '' + labels: + io.rancher.scheduler.global: 'true' + io.rancher.container.pull_image: always + tty: true + log_opt: {} + image: redis:3.2.0-alpine + stdin_open: true +sentry: + ports: + - ${sentry_public_port}:9000/tcp + environment: + SENTRY_EMAIL_HOST: ${sentry_email_host} + SENTRY_EMAIL_PASSWORD: ${sentry_email_password} + SENTRY_EMAIL_PORT: '${sentry_email_port}' + SENTRY_EMAIL_USER: ${sentry_email_user} + SENTRY_SECRET_KEY: ${sentry_secret_key} + SENTRY_SERVER_EMAIL: ${sentry_server_email} + log_driver: '' + labels: + io.rancher.scheduler.global: 'true' + io.rancher.container.pull_image: always + tty: true + command: + - /bin/bash + - -c + - sentry upgrade --noinput && sentry createuser --email ${sentry_inital_user_email} --password ${sentry_inital_user_password} --superuser && /entrypoint.sh run web || /entrypoint.sh run web + log_opt: {} + image: sentry:8.5.0 + links: + - sentry-postgres:postgres + - sentry-redis:redis + stdin_open: true +sentry-worker: + environment: + SENTRY_EMAIL_HOST: ${sentry_email_host} + SENTRY_EMAIL_PASSWORD: ${sentry_email_password} + SENTRY_EMAIL_PORT: '${sentry_email_port}' + SENTRY_EMAIL_USER: ${sentry_email_user} + SENTRY_SECRET_KEY: ${sentry_secret_key} + SENTRY_SERVER_EMAIL: ${sentry_server_email} + log_driver: '' + labels: + io.rancher.scheduler.global: 'true' + io.rancher.container.pull_image: always + tty: true + command: + - run + - worker + log_opt: {} + image: sentry:8.5.0 + links: + - sentry-postgres:postgres + - sentry-redis:redis + stdin_open: true diff --git a/templates/sentry/0/rancher-compose.yml b/templates/sentry/0/rancher-compose.yml new file mode 100644 index 0000000..412d1c3 --- /dev/null +++ b/templates/sentry/0/rancher-compose.yml @@ -0,0 +1,65 @@ +.catalog: + name: Sentry + version: 8.5.0 + description: Sentry is a realtime event logging and aggregation platform + + questions: + - variable: "sentry_secret_key" + type: "password" + required: true + label: "SENTRY_SECRET_KEY" + description: "A secret key used for cryptographic functions within Sentry. see https://hub.docker.com/_/sentry/ for more info" + + - variable: "sentry_public_port" + type: "int" + required: false + label: "Sentry public port" + description: "Port that Sentry will listen on. Alternatively you could point a load balancer to the port 9000 of this container" + + - variable: "sentry_inital_user_email" + type: "string" + required: true + label: "SENTRY_INITAL_USER_EMAIL" + description: "The initial superuser email" + + - variable: "sentry_inital_user_password" + type: "password" + required: true + label: "SENTRY_INITAL_USER_PASSWORD" + description: "The initial superuser password. Please use a simple intial password and change it afterwards in the Sentry interface" + + - variable: "sentry_server_email" + type: "string" + required: false + label: "SENTRY_SERVER_EMAIL" + description: "The smtp server address. see https://hub.docker.com/_/sentry/ for more info" + + - variable: "sentry_email_host" + type: "string" + required: false + label: "SENTRY_EMAIL_HOST" + description: "The smtp server address. see https://hub.docker.com/_/sentry/ for more info" + + - variable: "sentry_email_user" + type: "string" + required: false + label: "SENTRY_EMAIL_USER" + description: "The username for the email account. see https://hub.docker.com/_/sentry/ for more info" + + - variable: "sentry_email_password" + type: "password" + required: false + label: "SENTRY_EMAIL_PASSWORD" + description: "The password for the email account. see https://hub.docker.com/_/sentry/ for more info" + + - variable: "sentry_email_password" + type: "string" + required: false + label: "SENTRY_EMAIL_PASSWORD" + description: "The password for the email account. see https://hub.docker.com/_/sentry/ for more info" + + - variable: "sentry_email_port" + type: "int" + required: false + label: "SENTRY_EMAIL_PORT" + description: "Port of the smtp server. see https://hub.docker.com/_/sentry/ for more info" diff --git a/templates/sentry/catalogIcon-sentry.png b/templates/sentry/catalogIcon-sentry.png new file mode 100644 index 0000000000000000000000000000000000000000..8c71e8178c08a399f23d05a9a86d9a093866f735 GIT binary patch literal 12098 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