From 108df8f4ff35f294e92f37dd817f27155db209da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=87a=C4=9Fda=C5=9F=20Karademir?= Date: Sun, 25 May 2025 02:50:26 +0300 Subject: [PATCH] feat: add Flagsmith Blueprint (#147) * feat(blueprints): add Flagsmith blueprint * Update blueprints/flagsmith/docker-compose.yml * Update blueprints/flagsmith/docker-compose.yml * Update blueprints/flagsmith/docker-compose.yml * Update blueprints/flagsmith/docker-compose.yml --------- Co-authored-by: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com> --- blueprints/flagsmith/docker-compose.yml | 76 ++++++++++++++++++++++++ blueprints/flagsmith/flagsmith.png | Bin 0 -> 16660 bytes blueprints/flagsmith/template.toml | 17 ++++++ meta.json | 20 ++++++- 4 files changed, 112 insertions(+), 1 deletion(-) create mode 100644 blueprints/flagsmith/docker-compose.yml create mode 100644 blueprints/flagsmith/flagsmith.png create mode 100644 blueprints/flagsmith/template.toml diff --git a/blueprints/flagsmith/docker-compose.yml b/blueprints/flagsmith/docker-compose.yml new file mode 100644 index 00000000..126051f7 --- /dev/null +++ b/blueprints/flagsmith/docker-compose.yml @@ -0,0 +1,76 @@ +# See https://docs.flagsmith.com/deployment/docker for more information on running Flagsmith in Docker +# This Docker Compose file will run the entire Flagsmith Platform + +volumes: + pgdata: + + +services: + postgres: + image: postgres:15.5-alpine + environment: + POSTGRES_PASSWORD: ${DATABASE_PASSWORD} + POSTGRES_DB: flagsmith + volumes: + - pgdata:/var/lib/postgresql/data + healthcheck: + test: ["CMD-SHELL", "pg_isready -d flagsmith -U postgres"] + interval: 2s + timeout: 2s + retries: 20 + start_period: 20s + + flagsmith: + image: docker.flagsmith.com/flagsmith/flagsmith:2.177.1 + environment: + # All environments variables are available here: + # API: https://docs.flagsmith.com/deployment/locally-api#environment-variables + # UI: https://docs.flagsmith.com/deployment/locally-frontend#environment-variables + + DATABASE_URL: postgresql://postgres:${DATABASE_PASSWORD}@postgres:5432/flagsmith + USE_POSTGRES_FOR_ANALYTICS: "true" # Store API and Flag Analytics data in Postgres + + ENVIRONMENT: production # set to 'production' in production. + DJANGO_ALLOWED_HOSTS: "*" # Change this in production + FLAGSMITH_DOMAIN: ${FLAGSMITH_DOMAIN:-localhost:8000} # Change this in production + DJANGO_SECRET_KEY: ${DJANGO_SECRET_KEY} # Change this in production + # PREVENT_SIGNUP: 'true' # Uncomment to prevent additional signups + # ALLOW_REGISTRATION_WITHOUT_INVITE: 'true' + + # Enable Task Processor + TASK_RUN_METHOD: TASK_PROCESSOR # other options are: SYNCHRONOUSLY, SEPARATE_THREAD (default) + PROMETHEUS_ENABLED: "true" + + # Uncomment if you want to enable Google OAuth. Note this does not turn Google OAuth on. You still need to use + # Flagsmith on Flagsmith to enable it - https://docs.flagsmith.com/deployment/#oauth_google + # DJANGO_SECURE_CROSS_ORIGIN_OPENER_POLICY: 'same-origin-allow-popups' + + # For more info on configuring E-Mails - https://docs.flagsmith.com/deployment/locally-api#environment-variables + # Example SMTP: + # EMAIL_BACKEND: django.core.mail.backends.smtp.EmailBackend + # EMAIL_HOST: mail.example.com + # SENDER_EMAIL: flagsmith@example.com + # EMAIL_HOST_USER: flagsmith@example.com + # EMAIL_HOST_PASSWORD: smtp_account_password + # EMAIL_PORT: 587 # optional + # EMAIL_USE_TLS: 'true' # optional + ports: + - 8000 + depends_on: + postgres: + condition: service_healthy + + # The flagsmith_processor service is only needed if TASK_RUN_METHOD set to TASK_PROCESSOR + # in the application environment + flagsmith-task-processor: + image: docker.flagsmith.com/flagsmith/flagsmith:2.177.1 + environment: + DATABASE_URL: postgresql://postgres:${DATABASE_PASSWORD}@postgres:5432/flagsmith + USE_POSTGRES_FOR_ANALYTICS: "true" + DJANGO_ALLOWED_HOSTS: "*" + PROMETHEUS_ENABLED: "true" + ports: + - 8000 + depends_on: + - flagsmith + command: run-task-processor diff --git a/blueprints/flagsmith/flagsmith.png b/blueprints/flagsmith/flagsmith.png new file mode 100644 index 0000000000000000000000000000000000000000..26ac1f6d5d9c76c8fd2c9722bcd3e5d24bdf37b2 GIT binary patch literal 16660 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