diff --git a/apps/flagsmith/2.257.0/.env.sample b/apps/flagsmith/2.257.0/.env.sample new file mode 100644 index 000000000..451b1f4d9 --- /dev/null +++ b/apps/flagsmith/2.257.0/.env.sample @@ -0,0 +1,13 @@ +CONTAINER_NAME="flagsmith" +PANEL_APP_BIND_ADDRESS="127.0.0.1" +PANEL_APP_PORT_HTTP="8000" +PANEL_DB_TYPE="postgresql" +PANEL_DB_HOST="postgresql" +PANEL_DB_PORT="5432" +PANEL_DB_NAME="flagsmith" +PANEL_DB_USER="flagsmith" +PANEL_DB_USER_PASSWORD="change-me" +DJANGO_SECRET_KEY="generate" +FLAGSMITH_DOMAIN="localhost:8000" +FLAGSMITH_ALLOWED_HOSTS="*" +PREVENT_SIGNUP="false" diff --git a/apps/flagsmith/2.257.0/data.yml b/apps/flagsmith/2.257.0/data.yml new file mode 100644 index 000000000..ab06122ed --- /dev/null +++ b/apps/flagsmith/2.257.0/data.yml @@ -0,0 +1,208 @@ +additionalProperties: + formFields: + - default: 127.0.0.1 + edit: true + envKey: PANEL_APP_BIND_ADDRESS + labelEn: Bind Address + labelZh: 绑定地址 + label: + en: Bind Address + zh: 绑定地址 + zh-Hant: 綁定位址 + ja: バインドアドレス + ko: 바인드 주소 + ru: Адрес привязки + ms: Alamat ikatan + pt-br: Endereco de vinculacao + required: true + type: text + - default: 8000 + edit: true + envKey: PANEL_APP_PORT_HTTP + labelEn: HTTP Port + labelZh: HTTP 端口 + label: + en: HTTP Port + zh: HTTP 端口 + zh-Hant: HTTP 連接埠 + ja: HTTP ポート + ko: HTTP 포트 + ru: HTTP-порт + ms: Port HTTP + pt-br: Porta HTTP + required: true + rule: paramPort + type: number + - default: postgresql + envKey: PANEL_DB_TYPE + labelEn: Database Runtime + labelZh: 数据库运行环境 + label: + en: Database Runtime + zh: 数据库运行环境 + zh-Hant: 資料庫執行環境 + ja: データベース実行環境 + ko: 데이터베이스 런타임 + ru: Среда базы данных + ms: Masa jalan pangkalan data + pt-br: Ambiente de banco de dados + required: true + type: apps + values: + - label: PostgreSQL + value: postgresql + child: + default: "" + envKey: PANEL_DB_HOST + labelEn: PostgreSQL Service + labelZh: PostgreSQL 服务 + label: + en: PostgreSQL Service + zh: PostgreSQL 服务 + zh-Hant: PostgreSQL 服務 + ja: PostgreSQL サービス + ko: PostgreSQL 서비스 + ru: Сервис PostgreSQL + ms: Perkhidmatan PostgreSQL + pt-br: Servico PostgreSQL + required: true + type: service + - default: 5432 + edit: true + envKey: PANEL_DB_PORT + labelEn: Database Port + labelZh: 数据库端口 + label: + en: Database Port + zh: 数据库端口 + zh-Hant: 資料庫連接埠 + ja: データベースポート + ko: 데이터베이스 포트 + ru: Порт базы данных + ms: Port pangkalan data + pt-br: Porta do banco de dados + required: true + rule: paramPort + type: number + - default: flagsmith + edit: true + envKey: PANEL_DB_NAME + labelEn: Database Name + labelZh: 数据库名称 + label: + en: Database Name + zh: 数据库名称 + zh-Hant: 資料庫名稱 + ja: データベース名 + ko: 데이터베이스 이름 + ru: Имя базы данных + ms: Nama pangkalan data + pt-br: Nome do banco de dados + random: true + required: true + rule: paramCommon + type: text + - default: flagsmith + edit: true + envKey: PANEL_DB_USER + labelEn: Database User + labelZh: 数据库用户 + label: + en: Database User + zh: 数据库用户 + zh-Hant: 資料庫使用者 + ja: データベースユーザー + ko: 데이터베이스 사용자 + ru: Пользователь базы данных + ms: Pengguna pangkalan data + pt-br: Usuario do banco de dados + random: true + required: true + rule: paramCommon + type: text + - default: "" + edit: true + envKey: PANEL_DB_USER_PASSWORD + labelEn: Database Password + labelZh: 数据库密码 + label: + en: Database Password + zh: 数据库密码 + zh-Hant: 資料庫密碼 + ja: データベースパスワード + ko: 데이터베이스 비밀번호 + ru: Пароль базы данных + ms: Kata laluan pangkalan data + pt-br: Senha do banco de dados + required: true + rule: paramComplexity + type: password + - default: generate + edit: true + envKey: DJANGO_SECRET_KEY + labelEn: Application Secret + labelZh: 应用密钥 + label: + en: Application Secret + zh: 应用密钥 + zh-Hant: 應用程式密鑰 + ja: アプリケーションシークレット + ko: 애플리케이션 비밀 키 + ru: Секрет приложения + ms: Rahsia aplikasi + pt-br: Segredo do aplicativo + required: true + type: password + - default: localhost:8000 + edit: true + envKey: FLAGSMITH_DOMAIN + labelEn: Public Host + labelZh: 公开访问主机 + label: + en: Public Host + zh: 公开访问主机 + zh-Hant: 公開存取主機 + ja: 公開ホスト + ko: 공개 호스트 + ru: Публичный хост + ms: Hos awam + pt-br: Host publico + required: true + type: text + - default: "*" + edit: true + envKey: FLAGSMITH_ALLOWED_HOSTS + labelEn: Allowed Hosts + labelZh: 允许的主机 + label: + en: Allowed Hosts + zh: 允许的主机 + zh-Hant: 允許的主機 + ja: 許可するホスト + ko: 허용된 호스트 + ru: Разрешенные хосты + ms: Hos yang dibenarkan + pt-br: Hosts permitidos + required: true + type: text + - default: "false" + edit: true + envKey: PREVENT_SIGNUP + labelEn: Prevent New Signups + labelZh: 禁止新用户注册 + label: + en: Prevent New Signups + zh: 禁止新用户注册 + zh-Hant: 禁止新使用者註冊 + ja: 新規登録を禁止 + ko: 신규 가입 방지 + ru: Запретить новые регистрации + ms: Halang pendaftaran baharu + pt-br: Impedir novos cadastros + required: true + type: select + values: + - label: "false" + value: "false" + - label: "true" + value: "true" diff --git a/apps/flagsmith/2.257.0/data/.gitkeep b/apps/flagsmith/2.257.0/data/.gitkeep new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/apps/flagsmith/2.257.0/data/.gitkeep @@ -0,0 +1 @@ + diff --git a/apps/flagsmith/2.257.0/docker-compose.yml b/apps/flagsmith/2.257.0/docker-compose.yml new file mode 100644 index 000000000..3b8c38dd3 --- /dev/null +++ b/apps/flagsmith/2.257.0/docker-compose.yml @@ -0,0 +1,104 @@ +services: + flagsmith-migrate: + image: "flagsmith/flagsmith:2.257.0@sha256:e3b2cfca0dd268cc7af320becfd3a3ed928a58ae424c5c69b00a600bdf2a36b3" + container_name: ${CONTAINER_NAME}-migrate + restart: unless-stopped + entrypoint: ["/bin/sh", "-c"] + command: + - flagsmith migrate && touch /tmp/flagsmith-migration-complete && exec sleep infinity + networks: + - 1panel-network + environment: + DJANGO_DB_HOST: ${PANEL_DB_HOST} + DJANGO_DB_PORT: ${PANEL_DB_PORT} + DJANGO_DB_NAME: ${PANEL_DB_NAME} + DJANGO_DB_USER: ${PANEL_DB_USER} + DJANGO_DB_PASSWORD: ${PANEL_DB_USER_PASSWORD} + USE_POSTGRES_FOR_ANALYTICS: "true" + ENVIRONMENT: production + DJANGO_ALLOWED_HOSTS: ${FLAGSMITH_ALLOWED_HOSTS} + FLAGSMITH_DOMAIN: ${FLAGSMITH_DOMAIN} + DJANGO_SECRET_KEY: ${DJANGO_SECRET_KEY} + PREVENT_SIGNUP: ${PREVENT_SIGNUP} + TASK_RUN_METHOD: TASK_PROCESSOR + PROMETHEUS_ENABLED: "true" + healthcheck: + test: ["CMD-SHELL", "test -f /tmp/flagsmith-migration-complete"] + interval: 5s + timeout: 2s + start_period: 20s + retries: 60 + security_opt: + - no-new-privileges:true + labels: + createdBy: "Apps" + + flagsmith: + image: "flagsmith/flagsmith:2.257.0@sha256:e3b2cfca0dd268cc7af320becfd3a3ed928a58ae424c5c69b00a600bdf2a36b3" + container_name: ${CONTAINER_NAME} + restart: unless-stopped + command: ["serve"] + depends_on: + flagsmith-migrate: + condition: service_healthy + networks: + - 1panel-network + ports: + - "${PANEL_APP_BIND_ADDRESS}:${PANEL_APP_PORT_HTTP}:8000" + environment: + DJANGO_DB_HOST: ${PANEL_DB_HOST} + DJANGO_DB_PORT: ${PANEL_DB_PORT} + DJANGO_DB_NAME: ${PANEL_DB_NAME} + DJANGO_DB_USER: ${PANEL_DB_USER} + DJANGO_DB_PASSWORD: ${PANEL_DB_USER_PASSWORD} + USE_POSTGRES_FOR_ANALYTICS: "true" + ENVIRONMENT: production + DJANGO_ALLOWED_HOSTS: ${FLAGSMITH_ALLOWED_HOSTS} + FLAGSMITH_DOMAIN: ${FLAGSMITH_DOMAIN} + DJANGO_SECRET_KEY: ${DJANGO_SECRET_KEY} + PREVENT_SIGNUP: ${PREVENT_SIGNUP} + TASK_RUN_METHOD: TASK_PROCESSOR + PROMETHEUS_ENABLED: "true" + healthcheck: + test: ["CMD", "flagsmith", "healthcheck", "tcp"] + interval: 10s + timeout: 5s + start_period: 60s + retries: 6 + security_opt: + - no-new-privileges:true + labels: + createdBy: "Apps" + + flagsmith-task-processor: + image: "flagsmith/flagsmith:2.257.0@sha256:e3b2cfca0dd268cc7af320becfd3a3ed928a58ae424c5c69b00a600bdf2a36b3" + container_name: ${CONTAINER_NAME}-task-processor + restart: unless-stopped + command: ["run-task-processor"] + depends_on: + flagsmith-migrate: + condition: service_healthy + networks: + - 1panel-network + environment: + DJANGO_DB_HOST: ${PANEL_DB_HOST} + DJANGO_DB_PORT: ${PANEL_DB_PORT} + DJANGO_DB_NAME: ${PANEL_DB_NAME} + DJANGO_DB_USER: ${PANEL_DB_USER} + DJANGO_DB_PASSWORD: ${PANEL_DB_USER_PASSWORD} + USE_POSTGRES_FOR_ANALYTICS: "true" + ENVIRONMENT: production + DJANGO_ALLOWED_HOSTS: ${FLAGSMITH_ALLOWED_HOSTS} + FLAGSMITH_DOMAIN: ${FLAGSMITH_DOMAIN} + DJANGO_SECRET_KEY: ${DJANGO_SECRET_KEY} + PREVENT_SIGNUP: ${PREVENT_SIGNUP} + TASK_RUN_METHOD: TASK_PROCESSOR + PROMETHEUS_ENABLED: "true" + security_opt: + - no-new-privileges:true + labels: + createdBy: "Apps" + +networks: + 1panel-network: + external: true diff --git a/apps/flagsmith/2.257.0/scripts/init.sh b/apps/flagsmith/2.257.0/scripts/init.sh new file mode 100755 index 000000000..3f3cb2225 --- /dev/null +++ b/apps/flagsmith/2.257.0/scripts/init.sh @@ -0,0 +1,67 @@ +#!/usr/bin/env bash +set -euo pipefail + +ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd -P)" +ENV_FILE="${ENV_FILE:-${ROOT_DIR}/.env}" + +fail() { + printf '%s\n' "$1" >&2 + exit 1 +} + +read_env_value() { + local key="$1" + local value="" + value="$(sed -n "s/^${key}=//p" "$ENV_FILE" | tail -n 1)" + case "$value" in + \"*\") value="${value#\"}"; value="${value%\"}" ;; + \'*\') value="${value#\'}"; value="${value%\'}" ;; + esac + printf '%s\n' "$value" +} + +set_env_value() { + local key="$1" + local value="$2" + local temp_file + temp_file="$(mktemp "${ROOT_DIR}/.flagsmith-env.tmp.XXXXXX")" + awk -v key="$key" -v value="$value" ' + BEGIN { written = 0 } + $0 ~ "^" key "=" { + if (!written) { + print key "=" value + written = 1 + } + next + } + { print } + END { + if (!written) print key "=" value + } + ' "$ENV_FILE" > "$temp_file" + chmod 600 "$temp_file" + mv -f -- "$temp_file" "$ENV_FILE" +} + +[[ -f "$ENV_FILE" ]] || fail "$ENV_FILE not found" +[[ ! -L "$ENV_FILE" ]] || fail "$ENV_FILE must not be a symbolic link" + +domain="$(read_env_value FLAGSMITH_DOMAIN)" +[[ "$domain" =~ ^[A-Za-z0-9._:-]+$ ]] || fail "FLAGSMITH_DOMAIN must be a host with an optional port and no scheme or path" + +allowed_hosts="$(read_env_value FLAGSMITH_ALLOWED_HOSTS)" +[[ "$allowed_hosts" =~ ^[A-Za-z0-9.*_:-]+(,[A-Za-z0-9.*_:-]+)*$ ]] || fail "FLAGSMITH_ALLOWED_HOSTS must be a comma-separated host list" + +prevent_signup="$(read_env_value PREVENT_SIGNUP)" +[[ "$prevent_signup" == "true" || "$prevent_signup" == "false" ]] || fail "PREVENT_SIGNUP must be true or false" + +secret="$(read_env_value DJANGO_SECRET_KEY)" +if [[ -z "$secret" || "$secret" == "generate" ]]; then + command -v openssl >/dev/null 2>&1 || fail "openssl is required to generate DJANGO_SECRET_KEY" + secret="$(openssl rand -hex 32)" +fi +[[ ${#secret} -ge 50 ]] || fail "DJANGO_SECRET_KEY must contain at least 50 characters" +[[ "$secret" =~ ^[A-Za-z0-9._~!@%+=:,/-]+$ ]] || fail "DJANGO_SECRET_KEY contains unsupported dotenv characters" + +chmod 600 "$ENV_FILE" +set_env_value DJANGO_SECRET_KEY "$secret" diff --git a/apps/flagsmith/2.257.0/scripts/uninstall.sh b/apps/flagsmith/2.257.0/scripts/uninstall.sh new file mode 100755 index 000000000..5c199242b --- /dev/null +++ b/apps/flagsmith/2.257.0/scripts/uninstall.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash +set -euo pipefail + +if command -v docker-compose >/dev/null 2>&1; then + docker-compose down --remove-orphans +else + docker compose down --remove-orphans +fi diff --git a/apps/flagsmith/2.257.0/scripts/upgrade.sh b/apps/flagsmith/2.257.0/scripts/upgrade.sh new file mode 100755 index 000000000..593b31667 --- /dev/null +++ b/apps/flagsmith/2.257.0/scripts/upgrade.sh @@ -0,0 +1,5 @@ +#!/usr/bin/env bash +set -euo pipefail + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd -P)" +exec bash "${SCRIPT_DIR}/init.sh" diff --git a/apps/flagsmith/README.md b/apps/flagsmith/README.md new file mode 100644 index 000000000..842a3a04f --- /dev/null +++ b/apps/flagsmith/README.md @@ -0,0 +1,52 @@ +# Flagsmith + +## 产品介绍 + +Flagsmith 是开源的功能标志与远程配置平台,可集中管理功能开关、环境、身份和分段规则,并通过 SDK 或 API 向应用提供配置。 + +## 主要功能 + +- 为多个项目和环境管理功能标志 +- 按身份、特征和分段规则逐步发布功能 +- 通过客户端、服务端 SDK 和 REST API 获取标志 +- 记录标志分析数据并运行后台任务 + +## 访问说明 + +- 安装前需在 1Panel 中准备一个正在运行的 PostgreSQL 服务,并在表单中选择它。1Panel 会创建并关联 Flagsmith 使用的数据库和用户。 +- 安装后访问 `http://<服务器 IP>:8000`,实际端口以 `PANEL_APP_PORT_HTTP` 为准,然后创建首个账户。 +- `FLAGSMITH_DOMAIN` 填写浏览器实际访问的主机和可选端口,不包含 `http://` 或路径。例如 `flags.example.com` 或 `192.0.2.10:8000`。 +- 公网部署应通过 HTTPS 反向代理访问,并将 `FLAGSMITH_ALLOWED_HOSTS` 限制为实际域名。 + +## 拓扑和数据 + +本包保留官方 Compose 的完整应用拓扑:独立数据库迁移门禁、Web/API 主服务和独立任务处理器。三个角色使用同一官方镜像,迁移成功后门禁容器进入空闲状态,另外两个服务才会启动。迁移容器保持运行是为了兼容 1Panel 将成功退出的一次性容器仍标记为异常的状态模型;它不对外提供服务或重复执行任务。Redis 仅用于可选的高级缓存或事件摄取配置,不是官方基础 Compose 的必需依赖。 + +业务数据保存在所选 PostgreSQL 服务中。升级或卸载前请备份该数据库;卸载应用不会删除外部 PostgreSQL 服务本身。1Panel 当前可能将关联 PostgreSQL 用户创建为超级用户,因此共享实例上的关联用户不是强隔离边界。面向不受信任用户或高价值数据时,应使用专用 PostgreSQL 实例。 + +## 安全说明 + +- `DJANGO_SECRET_KEY` 在首次安装时生成并保存在应用 `.env` 中,升级时保持不变。不要提交或共享安装后的 `.env`。 +- 默认允许首个及后续用户注册。完成管理员初始化后,可将 `PREVENT_SIGNUP` 改为 `true`。 +- Google OAuth、SAML、SMTP、Webhook 和其他外部集成均为可选功能。启用时应使用最小权限凭据,并在升级前重新检查镜像安全公告。 +- 应用镜像以非 root 用户运行,只有 Web/API 主服务向主机发布端口;迁移和任务处理器不发布主机端口。 + +## Introduction + +Flagsmith is an open-source feature flag and remote configuration platform. This package preserves the official migration gate, Web/API service, and task-processor topology while using a 1Panel-managed PostgreSQL service. The migration container stays idle after a successful migration because 1Panel otherwise treats a successfully exited one-shot Compose container as unhealthy. + +## Features + +- Manage feature flags across projects and environments +- Target identities and segments for gradual releases +- Serve configuration through client SDKs, server SDKs, and REST APIs +- Store flag analytics and process background tasks + +Choose a running PostgreSQL service during installation. Back up the linked database before upgrades or uninstalling. A 1Panel-linked PostgreSQL role may currently be a superuser, so use a dedicated PostgreSQL instance where stronger isolation is required. Set `FLAGSMITH_DOMAIN` to the public host with an optional port, and use an HTTPS reverse proxy for Internet-facing deployments. + +## References + +- Website: +- Source: +- Documentation: +- License: BSD-3-Clause diff --git a/apps/flagsmith/data.yml b/apps/flagsmith/data.yml new file mode 100644 index 000000000..ae41e635a --- /dev/null +++ b/apps/flagsmith/data.yml @@ -0,0 +1,33 @@ +name: Flagsmith +tags: + - 开发工具 + - 项目管理 +title: 开源功能标志和远程配置平台 +description: 开源功能标志和远程配置平台 +additionalProperties: + key: flagsmith + name: Flagsmith + tags: + - DevTool + - Tool + shortDescZh: 开源功能标志和远程配置平台 + shortDescEn: Open-source feature flag and remote configuration platform + description: + en: Open-source feature flag and remote configuration platform + zh: 开源功能标志和远程配置平台 + zh-Hant: 開源功能旗標與遠端設定平台 + ja: オープンソースの機能フラグおよびリモート設定プラットフォーム + ko: 오픈 소스 기능 플래그 및 원격 구성 플랫폼 + ru: Платформа с открытым исходным кодом для флагов функций и удаленной конфигурации + ms: Platform sumber terbuka untuk bendera ciri dan konfigurasi jauh + pt-br: Plataforma de codigo aberto para sinalizadores de recursos e configuracao remota + type: tool + crossVersionUpdate: true + limit: 0 + recommend: 0 + website: https://www.flagsmith.com/ + github: https://github.com/Flagsmith/flagsmith + document: https://docs.flagsmith.com/deployment-self-hosting/hosting-guides/docker + architectures: + - amd64 + - arm64 diff --git a/apps/flagsmith/latest/.env.sample b/apps/flagsmith/latest/.env.sample new file mode 100644 index 000000000..451b1f4d9 --- /dev/null +++ b/apps/flagsmith/latest/.env.sample @@ -0,0 +1,13 @@ +CONTAINER_NAME="flagsmith" +PANEL_APP_BIND_ADDRESS="127.0.0.1" +PANEL_APP_PORT_HTTP="8000" +PANEL_DB_TYPE="postgresql" +PANEL_DB_HOST="postgresql" +PANEL_DB_PORT="5432" +PANEL_DB_NAME="flagsmith" +PANEL_DB_USER="flagsmith" +PANEL_DB_USER_PASSWORD="change-me" +DJANGO_SECRET_KEY="generate" +FLAGSMITH_DOMAIN="localhost:8000" +FLAGSMITH_ALLOWED_HOSTS="*" +PREVENT_SIGNUP="false" diff --git a/apps/flagsmith/latest/data.yml b/apps/flagsmith/latest/data.yml new file mode 100644 index 000000000..ab06122ed --- /dev/null +++ b/apps/flagsmith/latest/data.yml @@ -0,0 +1,208 @@ +additionalProperties: + formFields: + - default: 127.0.0.1 + edit: true + envKey: PANEL_APP_BIND_ADDRESS + labelEn: Bind Address + labelZh: 绑定地址 + label: + en: Bind Address + zh: 绑定地址 + zh-Hant: 綁定位址 + ja: バインドアドレス + ko: 바인드 주소 + ru: Адрес привязки + ms: Alamat ikatan + pt-br: Endereco de vinculacao + required: true + type: text + - default: 8000 + edit: true + envKey: PANEL_APP_PORT_HTTP + labelEn: HTTP Port + labelZh: HTTP 端口 + label: + en: HTTP Port + zh: HTTP 端口 + zh-Hant: HTTP 連接埠 + ja: HTTP ポート + ko: HTTP 포트 + ru: HTTP-порт + ms: Port HTTP + pt-br: Porta HTTP + required: true + rule: paramPort + type: number + - default: postgresql + envKey: PANEL_DB_TYPE + labelEn: Database Runtime + labelZh: 数据库运行环境 + label: + en: Database Runtime + zh: 数据库运行环境 + zh-Hant: 資料庫執行環境 + ja: データベース実行環境 + ko: 데이터베이스 런타임 + ru: Среда базы данных + ms: Masa jalan pangkalan data + pt-br: Ambiente de banco de dados + required: true + type: apps + values: + - label: PostgreSQL + value: postgresql + child: + default: "" + envKey: PANEL_DB_HOST + labelEn: PostgreSQL Service + labelZh: PostgreSQL 服务 + label: + en: PostgreSQL Service + zh: PostgreSQL 服务 + zh-Hant: PostgreSQL 服務 + ja: PostgreSQL サービス + ko: PostgreSQL 서비스 + ru: Сервис PostgreSQL + ms: Perkhidmatan PostgreSQL + pt-br: Servico PostgreSQL + required: true + type: service + - default: 5432 + edit: true + envKey: PANEL_DB_PORT + labelEn: Database Port + labelZh: 数据库端口 + label: + en: Database Port + zh: 数据库端口 + zh-Hant: 資料庫連接埠 + ja: データベースポート + ko: 데이터베이스 포트 + ru: Порт базы данных + ms: Port pangkalan data + pt-br: Porta do banco de dados + required: true + rule: paramPort + type: number + - default: flagsmith + edit: true + envKey: PANEL_DB_NAME + labelEn: Database Name + labelZh: 数据库名称 + label: + en: Database Name + zh: 数据库名称 + zh-Hant: 資料庫名稱 + ja: データベース名 + ko: 데이터베이스 이름 + ru: Имя базы данных + ms: Nama pangkalan data + pt-br: Nome do banco de dados + random: true + required: true + rule: paramCommon + type: text + - default: flagsmith + edit: true + envKey: PANEL_DB_USER + labelEn: Database User + labelZh: 数据库用户 + label: + en: Database User + zh: 数据库用户 + zh-Hant: 資料庫使用者 + ja: データベースユーザー + ko: 데이터베이스 사용자 + ru: Пользователь базы данных + ms: Pengguna pangkalan data + pt-br: Usuario do banco de dados + random: true + required: true + rule: paramCommon + type: text + - default: "" + edit: true + envKey: PANEL_DB_USER_PASSWORD + labelEn: Database Password + labelZh: 数据库密码 + label: + en: Database Password + zh: 数据库密码 + zh-Hant: 資料庫密碼 + ja: データベースパスワード + ko: 데이터베이스 비밀번호 + ru: Пароль базы данных + ms: Kata laluan pangkalan data + pt-br: Senha do banco de dados + required: true + rule: paramComplexity + type: password + - default: generate + edit: true + envKey: DJANGO_SECRET_KEY + labelEn: Application Secret + labelZh: 应用密钥 + label: + en: Application Secret + zh: 应用密钥 + zh-Hant: 應用程式密鑰 + ja: アプリケーションシークレット + ko: 애플리케이션 비밀 키 + ru: Секрет приложения + ms: Rahsia aplikasi + pt-br: Segredo do aplicativo + required: true + type: password + - default: localhost:8000 + edit: true + envKey: FLAGSMITH_DOMAIN + labelEn: Public Host + labelZh: 公开访问主机 + label: + en: Public Host + zh: 公开访问主机 + zh-Hant: 公開存取主機 + ja: 公開ホスト + ko: 공개 호스트 + ru: Публичный хост + ms: Hos awam + pt-br: Host publico + required: true + type: text + - default: "*" + edit: true + envKey: FLAGSMITH_ALLOWED_HOSTS + labelEn: Allowed Hosts + labelZh: 允许的主机 + label: + en: Allowed Hosts + zh: 允许的主机 + zh-Hant: 允許的主機 + ja: 許可するホスト + ko: 허용된 호스트 + ru: Разрешенные хосты + ms: Hos yang dibenarkan + pt-br: Hosts permitidos + required: true + type: text + - default: "false" + edit: true + envKey: PREVENT_SIGNUP + labelEn: Prevent New Signups + labelZh: 禁止新用户注册 + label: + en: Prevent New Signups + zh: 禁止新用户注册 + zh-Hant: 禁止新使用者註冊 + ja: 新規登録を禁止 + ko: 신규 가입 방지 + ru: Запретить новые регистрации + ms: Halang pendaftaran baharu + pt-br: Impedir novos cadastros + required: true + type: select + values: + - label: "false" + value: "false" + - label: "true" + value: "true" diff --git a/apps/flagsmith/latest/data/.gitkeep b/apps/flagsmith/latest/data/.gitkeep new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/apps/flagsmith/latest/data/.gitkeep @@ -0,0 +1 @@ + diff --git a/apps/flagsmith/latest/docker-compose.yml b/apps/flagsmith/latest/docker-compose.yml new file mode 100644 index 000000000..de86bfbd0 --- /dev/null +++ b/apps/flagsmith/latest/docker-compose.yml @@ -0,0 +1,104 @@ +services: + flagsmith-migrate: + image: "flagsmith/flagsmith:latest@sha256:e3b2cfca0dd268cc7af320becfd3a3ed928a58ae424c5c69b00a600bdf2a36b3" + container_name: ${CONTAINER_NAME}-migrate + restart: unless-stopped + entrypoint: ["/bin/sh", "-c"] + command: + - flagsmith migrate && touch /tmp/flagsmith-migration-complete && exec sleep infinity + networks: + - 1panel-network + environment: + DJANGO_DB_HOST: ${PANEL_DB_HOST} + DJANGO_DB_PORT: ${PANEL_DB_PORT} + DJANGO_DB_NAME: ${PANEL_DB_NAME} + DJANGO_DB_USER: ${PANEL_DB_USER} + DJANGO_DB_PASSWORD: ${PANEL_DB_USER_PASSWORD} + USE_POSTGRES_FOR_ANALYTICS: "true" + ENVIRONMENT: production + DJANGO_ALLOWED_HOSTS: ${FLAGSMITH_ALLOWED_HOSTS} + FLAGSMITH_DOMAIN: ${FLAGSMITH_DOMAIN} + DJANGO_SECRET_KEY: ${DJANGO_SECRET_KEY} + PREVENT_SIGNUP: ${PREVENT_SIGNUP} + TASK_RUN_METHOD: TASK_PROCESSOR + PROMETHEUS_ENABLED: "true" + healthcheck: + test: ["CMD-SHELL", "test -f /tmp/flagsmith-migration-complete"] + interval: 5s + timeout: 2s + start_period: 20s + retries: 60 + security_opt: + - no-new-privileges:true + labels: + createdBy: "Apps" + + flagsmith: + image: "flagsmith/flagsmith:latest@sha256:e3b2cfca0dd268cc7af320becfd3a3ed928a58ae424c5c69b00a600bdf2a36b3" + container_name: ${CONTAINER_NAME} + restart: unless-stopped + command: ["serve"] + depends_on: + flagsmith-migrate: + condition: service_healthy + networks: + - 1panel-network + ports: + - "${PANEL_APP_BIND_ADDRESS}:${PANEL_APP_PORT_HTTP}:8000" + environment: + DJANGO_DB_HOST: ${PANEL_DB_HOST} + DJANGO_DB_PORT: ${PANEL_DB_PORT} + DJANGO_DB_NAME: ${PANEL_DB_NAME} + DJANGO_DB_USER: ${PANEL_DB_USER} + DJANGO_DB_PASSWORD: ${PANEL_DB_USER_PASSWORD} + USE_POSTGRES_FOR_ANALYTICS: "true" + ENVIRONMENT: production + DJANGO_ALLOWED_HOSTS: ${FLAGSMITH_ALLOWED_HOSTS} + FLAGSMITH_DOMAIN: ${FLAGSMITH_DOMAIN} + DJANGO_SECRET_KEY: ${DJANGO_SECRET_KEY} + PREVENT_SIGNUP: ${PREVENT_SIGNUP} + TASK_RUN_METHOD: TASK_PROCESSOR + PROMETHEUS_ENABLED: "true" + healthcheck: + test: ["CMD", "flagsmith", "healthcheck", "tcp"] + interval: 10s + timeout: 5s + start_period: 60s + retries: 6 + security_opt: + - no-new-privileges:true + labels: + createdBy: "Apps" + + flagsmith-task-processor: + image: "flagsmith/flagsmith:latest@sha256:e3b2cfca0dd268cc7af320becfd3a3ed928a58ae424c5c69b00a600bdf2a36b3" + container_name: ${CONTAINER_NAME}-task-processor + restart: unless-stopped + command: ["run-task-processor"] + depends_on: + flagsmith-migrate: + condition: service_healthy + networks: + - 1panel-network + environment: + DJANGO_DB_HOST: ${PANEL_DB_HOST} + DJANGO_DB_PORT: ${PANEL_DB_PORT} + DJANGO_DB_NAME: ${PANEL_DB_NAME} + DJANGO_DB_USER: ${PANEL_DB_USER} + DJANGO_DB_PASSWORD: ${PANEL_DB_USER_PASSWORD} + USE_POSTGRES_FOR_ANALYTICS: "true" + ENVIRONMENT: production + DJANGO_ALLOWED_HOSTS: ${FLAGSMITH_ALLOWED_HOSTS} + FLAGSMITH_DOMAIN: ${FLAGSMITH_DOMAIN} + DJANGO_SECRET_KEY: ${DJANGO_SECRET_KEY} + PREVENT_SIGNUP: ${PREVENT_SIGNUP} + TASK_RUN_METHOD: TASK_PROCESSOR + PROMETHEUS_ENABLED: "true" + security_opt: + - no-new-privileges:true + labels: + createdBy: "Apps" + +networks: + 1panel-network: + external: true diff --git a/apps/flagsmith/latest/scripts/init.sh b/apps/flagsmith/latest/scripts/init.sh new file mode 100755 index 000000000..3f3cb2225 --- /dev/null +++ b/apps/flagsmith/latest/scripts/init.sh @@ -0,0 +1,67 @@ +#!/usr/bin/env bash +set -euo pipefail + +ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd -P)" +ENV_FILE="${ENV_FILE:-${ROOT_DIR}/.env}" + +fail() { + printf '%s\n' "$1" >&2 + exit 1 +} + +read_env_value() { + local key="$1" + local value="" + value="$(sed -n "s/^${key}=//p" "$ENV_FILE" | tail -n 1)" + case "$value" in + \"*\") value="${value#\"}"; value="${value%\"}" ;; + \'*\') value="${value#\'}"; value="${value%\'}" ;; + esac + printf '%s\n' "$value" +} + +set_env_value() { + local key="$1" + local value="$2" + local temp_file + temp_file="$(mktemp "${ROOT_DIR}/.flagsmith-env.tmp.XXXXXX")" + awk -v key="$key" -v value="$value" ' + BEGIN { written = 0 } + $0 ~ "^" key "=" { + if (!written) { + print key "=" value + written = 1 + } + next + } + { print } + END { + if (!written) print key "=" value + } + ' "$ENV_FILE" > "$temp_file" + chmod 600 "$temp_file" + mv -f -- "$temp_file" "$ENV_FILE" +} + +[[ -f "$ENV_FILE" ]] || fail "$ENV_FILE not found" +[[ ! -L "$ENV_FILE" ]] || fail "$ENV_FILE must not be a symbolic link" + +domain="$(read_env_value FLAGSMITH_DOMAIN)" +[[ "$domain" =~ ^[A-Za-z0-9._:-]+$ ]] || fail "FLAGSMITH_DOMAIN must be a host with an optional port and no scheme or path" + +allowed_hosts="$(read_env_value FLAGSMITH_ALLOWED_HOSTS)" +[[ "$allowed_hosts" =~ ^[A-Za-z0-9.*_:-]+(,[A-Za-z0-9.*_:-]+)*$ ]] || fail "FLAGSMITH_ALLOWED_HOSTS must be a comma-separated host list" + +prevent_signup="$(read_env_value PREVENT_SIGNUP)" +[[ "$prevent_signup" == "true" || "$prevent_signup" == "false" ]] || fail "PREVENT_SIGNUP must be true or false" + +secret="$(read_env_value DJANGO_SECRET_KEY)" +if [[ -z "$secret" || "$secret" == "generate" ]]; then + command -v openssl >/dev/null 2>&1 || fail "openssl is required to generate DJANGO_SECRET_KEY" + secret="$(openssl rand -hex 32)" +fi +[[ ${#secret} -ge 50 ]] || fail "DJANGO_SECRET_KEY must contain at least 50 characters" +[[ "$secret" =~ ^[A-Za-z0-9._~!@%+=:,/-]+$ ]] || fail "DJANGO_SECRET_KEY contains unsupported dotenv characters" + +chmod 600 "$ENV_FILE" +set_env_value DJANGO_SECRET_KEY "$secret" diff --git a/apps/flagsmith/latest/scripts/uninstall.sh b/apps/flagsmith/latest/scripts/uninstall.sh new file mode 100755 index 000000000..5c199242b --- /dev/null +++ b/apps/flagsmith/latest/scripts/uninstall.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash +set -euo pipefail + +if command -v docker-compose >/dev/null 2>&1; then + docker-compose down --remove-orphans +else + docker compose down --remove-orphans +fi diff --git a/apps/flagsmith/latest/scripts/upgrade.sh b/apps/flagsmith/latest/scripts/upgrade.sh new file mode 100755 index 000000000..593b31667 --- /dev/null +++ b/apps/flagsmith/latest/scripts/upgrade.sh @@ -0,0 +1,5 @@ +#!/usr/bin/env bash +set -euo pipefail + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd -P)" +exec bash "${SCRIPT_DIR}/init.sh" diff --git a/apps/flagsmith/logo.png b/apps/flagsmith/logo.png new file mode 100644 index 000000000..474900986 Binary files /dev/null and b/apps/flagsmith/logo.png differ