From 3a562d6e5a3df5426c17896049e8973ded558fee Mon Sep 17 00:00:00 2001 From: Ronald Loyko <108372764+ronaldloyko@users.noreply.github.com> Date: Wed, 19 Oct 2022 07:01:31 +0300 Subject: [PATCH] feat: add redash (#772) --- public/v4/apps/redash.yml | 181 +++++++++++++++++++++++++++++++++++++ public/v4/logos/redash.png | Bin 0 -> 14738 bytes 2 files changed, 181 insertions(+) create mode 100644 public/v4/apps/redash.yml create mode 100644 public/v4/logos/redash.png diff --git a/public/v4/apps/redash.yml b/public/v4/apps/redash.yml new file mode 100644 index 0000000..977f806 --- /dev/null +++ b/public/v4/apps/redash.yml @@ -0,0 +1,181 @@ +captainVersion: 4 +services: + $$cap_appname: + caproverExtra: + containerHttpPort: 5000 + dockerfileLines: + - FROM redash/redash:$$cap_REDASH_VERSION + - CMD ["server"] + environment: + REDASH_WEB_WORKERS: $$cap_REDASH_WEB_WORKERS + REDASH_HOST: http://$$cap_appname.$$cap_root_domain + REDASH_COOKIE_SECRET: $$cap_REDASH_COOKIE_SECRET + REDASH_SECRET_KEY: $$cap_REDASH_SECRET_KEY + REDASH_MAIL_SERVER: $$cap_REDASH_MAIL_SERVER + REDASH_MAIL_PORT: $$cap_REDASH_MAIL_PORT + REDASH_MAIL_USE_TLS: $$cap_REDASH_MAIL_USE_TLS + REDASH_MAIL_USE_SSL: $$cap_REDASH_MAIL_USE_SSL + REDASH_MAIL_USERNAME: $$cap_REDASH_MAIL_USERNAME + REDASH_MAIL_PASSWORD: $$cap_REDASH_MAIL_PASSWORD + REDASH_MAIL_DEFAULT_SENDER: $$cap_REDASH_MAIL_DEFAULT_SENDER + REDASH_REDIS_URL: redis://srv-captain--$$cap_appname-queue + REDASH_DATABASE_URL: postgresql://$$cap_POSTGRES_USER:$$cap_POSTGRES_PASSWORD@srv-captain--$$cap_appname-db/$$cap_POSTGRES_DB + depends_on: + - $$cap_appname-db + - $$cap_appname-queue + $$cap_appname-scheduler: + caproverExtra: + notExposeAsWebApp: 'true' + dockerfileLines: + - FROM redash/redash:$$cap_REDASH_VERSION + - CMD ["scheduler"] + environment: + QUEUES: celery + WORKERS_COUNT: $$cap_REDASH_SCHEDULER_WORKERS + depends_on: + - $$cap_appname-db + - $$cap_appname-queue + $$cap_appname-scheduled-worker: + caproverExtra: + notExposeAsWebApp: 'true' + dockerfileLines: + - FROM redash/redash:$$cap_REDASH_VERSION + - CMD ["worker"] + environment: + QUEUES: scheduled_queries,schemas + WORKERS_COUNT: $$cap_REDASH_SCHEDULED_WORKERS + depends_on: + - $$cap_appname-db + - $$cap_appname-queue + $$cap_appname-adhoc-worker: + caproverExtra: + notExposeAsWebApp: 'true' + dockerfileLines: + - FROM redash/redash:$$cap_REDASH_VERSION + - CMD ["worker"] + environment: + QUEUES: queries + WORKERS_COUNT: $$cap_REDASH_ADHOC_WORKERS + depends_on: + - $$cap_appname-db + - $$cap_appname-queue + $$cap_appname-queue: + caproverExtra: + notExposeAsWebApp: 'true' + image: redis:$$cap_REDIS_VERSION + $$cap_appname-db: + caproverExtra: + notExposeAsWebApp: 'true' + image: postgres:$$cap_POSTGRES_VERSION + environment: + POSTGRES_DB: $$cap_POSTGRES_DB + POSTGRES_USER: $$cap_POSTGRES_USER + POSTGRES_PASSWORD: $$cap_POSTGRES_PASSWORD + volumes: + - $$cap_appname-db:/var/lib/postgresql/data +caproverOneClickApp: + displayName: Redash + description: Connect to any data source, easily visualize and share your data + documentation: https://redash.io/help + isOfficial: true + instructions: + start: |- + Redash helps you make sense of your data. + Connect and query your data sources, build dashboards to visualize data and share them with your company. + + **You will need access to your server via SSH to perform a command after deployment. This needs to be done only once.** + end: |- + Redash has been successfully deployed! It might take few moments before it's fully started. + + Please execute the following command on your server in order to trigger database migrations: + `docker exec -it $(docker ps --filter name=srv-captain--$$cap_appname -q) sh -c "/app/bin/docker-entrypoint create_db"` + + You can access your Redash instance at `http://$$cap_appname.$$cap_root_domain`. + variables: + - id: $$cap_REDASH_VERSION + label: Application | Version + description: Redash version. Check out their valid tags at https://hub.docker.com/r/redash/redash/tags + defaultValue: '10.1.0.b50633' + validRegex: /.{1,}/ + - id: $$cap_REDASH_WEB_WORKERS + label: Application | Web Worker Count + description: Amount of web workers. + defaultValue: 4 + validRegex: /.{1,}/ + - id: $$cap_REDASH_SCHEDULER_WORKERS + label: Application | Scheduler Worker Count + description: Amount of workers for scheduler. + defaultValue: 1 + validRegex: /.{1,}/ + - id: $$cap_REDASH_SCHEDULED_WORKERS + label: Application | Scheduled Worker Count + description: Amount of scheduled workers. + defaultValue: 1 + validRegex: /.{1,}/ + - id: $$cap_REDASH_ADHOC_WORKERS + label: Application | Ad-Hoc Worker Count + description: Amount of ad-hoc workers. + defaultValue: 2 + validRegex: /.{1,}/ + - id: $$cap_REDASH_COOKIE_SECRET + label: Application | Cookie Secret + description: Secret for signing cookies. + defaultValue: $$cap_gen_random_hex(64) + validRegex: /.{1,}/ + - id: $$cap_REDASH_SECRET_KEY + label: Application | Application Secret + description: Secret for encrypting settings. + defaultValue: $$cap_gen_random_hex(64) + validRegex: /.{1,}/ + - id: $$cap_REDASH_MAIL_SERVER + label: Application | SMTP Host + description: SMTP server for system mail delivery. This is optional. + - id: $$cap_REDASH_MAIL_PORT + label: Application | SMTP Port + description: SMTP port for system mail delivery. + defaultValue: 25 + validRegex: /.{1,}/ + - id: $$cap_REDASH_MAIL_USERNAME + label: Application | SMTP Username + description: SMTP user name for system mail delivery. This is optional. + - id: $$cap_REDASH_MAIL_PASSWORD + label: Application | SMTP Password + description: SMTP password for system mail delivery. This is optional. + - id: $$cap_REDASH_MAIL_DEFAULT_SENDER + label: Application | SMTP Default Sender + description: Mail address to send from. This is optional. + - id: $$cap_REDASH_MAIL_USE_TLS + label: Application | SMTP Use TLS + description: Whether to use TLS for system mail delivery through SMTP. + defaultValue: 'false' + validRegex: /^(true|false)$/ + - id: $$cap_REDASH_MAIL_USE_SSL + label: Application | SMTP Use SSL + description: Whether to use SSL for system mail delivery through SMTP. + defaultValue: 'false' + validRegex: /^(true|false)$/ + - id: $$cap_REDIS_VERSION + label: Queue | Version + description: Redis version. Check out their valid tags at https://hub.docker.com/_/redis/tags + defaultValue: '7.0-alpine' + validRegex: /.{1,}/ + - id: $$cap_POSTGRES_VERSION + label: Database | Version + description: PostgreSQL version. Check out their valid tags at https://hub.docker.com/_/postgres/tags + defaultValue: '15.0-alpine' + validRegex: /.{1,}/ + - id: $$cap_POSTGRES_DB + label: Database | Name + description: Name of the PostgreSQL database. + defaultValue: redash + validRegex: /.{1,}/ + - id: $$cap_POSTGRES_USER + label: Database | User Name + description: Name of the PostgreSQL user. + defaultValue: redash + validRegex: /.{1,}/ + - id: $$cap_POSTGRES_PASSWORD + label: Database | User Password + description: Password of the PostgreSQL user. + defaultValue: $$cap_gen_random_hex(16) + validRegex: /.{1,}/ diff --git a/public/v4/logos/redash.png b/public/v4/logos/redash.png new file mode 100644 index 0000000000000000000000000000000000000000..2a71b8c61b59c0e7ca3ab742427601ecccfe44df GIT binary patch literal 14738 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