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