# yaml-language-server: $schema=https://schema.zeabur.app/template.json
apiVersion: zeabur.com/v1
kind: Template
metadata:
    name: Open Mercato
spec:
    description: An AI-supportive CRM/ERP foundation framework — built to power R&D, operations, and growth.
    coverImage: https://raw.githubusercontent.com/open-mercato/open-mercato/main/apps/docs/static/img/open-mercato-homepage.jpg
    icon: https://avatars.githubusercontent.com/u/208587498
    variables:
        - key: PUBLIC_DOMAIN
          type: DOMAIN
          name: Domain
          description: The domain name for your Open Mercato instance.
    tags:
        - CRM
        - ERP
        - Tool
        - Website
    readme: |-
        # Open Mercato

        [Open Mercato](https://github.com/open-mercato/open-mercato) is an open-source, AI-supportive CRM/ERP foundation framework built with Next.js, TypeScript, and MikroORM. It provides modular, extensible building blocks for enterprise-grade business applications.

        ## Features

        - **Multi-tenant** with strict organization/tenant scoping
        - **Custom entities** and dynamic forms
        - **RBAC** with feature flags
        - **Field-level data encryption** (tenant-scoped)
        - **Hybrid search** with Meilisearch integration
        - **AI Assistant** with MCP (Model Context Protocol) integration
        - **Event subscribers** and workflow orchestration

        ## Deployment on Zeabur

        1. Click deploy and select your region.
        2. Wait for all services (PostgreSQL, Redis, Meilisearch, App) to start.
        3. The app will automatically run database initialization on first start.
        4. Bind a domain to access the application.
        5. Default credentials: Superadmin `superadmin@acme.com` / Admin `admin@acme.com` / Employee `employee@acme.com`, all with password `secret` — **change these immediately after first login**.

        ## Configuration

        - To enable AI features, add `OPENAI_API_KEY` or `ANTHROPIC_API_KEY` in the app's environment variables.
        - To configure email, set `RESEND_API_KEY` and `EMAIL_FROM` in the app's environment variables.

        ## License & Attribution

        Open Mercato is licensed under the [MIT License](https://github.com/open-mercato/open-mercato/blob/develop/LICENSE).

        - **Repository**: https://github.com/open-mercato/open-mercato
        - **Documentation**: https://docs.openmercato.com
        - **Demo**: https://demo.openmercato.com
    services:
        - name: postgresql
          icon: https://cdn.zeabur.com/marketplace/postgresql.svg
          template: PREBUILT
          spec:
            id: postgresql
            source:
                image: pgvector/pgvector:pg17-trixie
                command:
                    - docker-entrypoint.sh
                    - -c
                    - config_file=/etc/postgresql/postgresql.conf
            ports:
                - id: database
                  port: 5432
                  type: TCP
            volumes:
                - id: data
                  dir: /var/lib/postgresql/data
            instructions:
                - title: Connection String
                  content: postgresql://${POSTGRES_USERNAME}:${POSTGRES_PASSWORD}@${PORT_FORWARDED_HOSTNAME}:${DATABASE_PORT_FORWARDED_PORT}/${POSTGRES_DATABASE}
                - title: PostgreSQL username
                  content: ${POSTGRES_USERNAME}
                - title: PostgreSQL password
                  content: ${POSTGRES_PASSWORD}
                - title: PostgreSQL database
                  content: ${POSTGRES_DATABASE}
                - title: PostgreSQL host
                  content: ${PORT_FORWARDED_HOSTNAME}
                - title: PostgreSQL port
                  content: ${DATABASE_PORT_FORWARDED_PORT}
            env:
                PGDATA:
                    default: /var/lib/postgresql/data/pgdata
                POSTGRES_CONNECTION_STRING:
                    default: postgresql://${POSTGRES_USERNAME}:${POSTGRES_PASSWORD}@${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DATABASE}
                    expose: true
                POSTGRES_DATABASE:
                    default: ${POSTGRES_DB}
                    expose: true
                POSTGRES_DB:
                    default: zeabur
                POSTGRES_HOST:
                    default: ${CONTAINER_HOSTNAME}
                    expose: true
                POSTGRES_PASSWORD:
                    default: ${PASSWORD}
                    expose: true
                POSTGRES_PORT:
                    default: ${DATABASE_PORT}
                    expose: true
                POSTGRES_URI:
                    default: ${POSTGRES_CONNECTION_STRING}
                    expose: true
                POSTGRES_USER:
                    default: root
                POSTGRES_USERNAME:
                    default: ${POSTGRES_USER}
                    expose: true
            configs:
                - path: /etc/postgresql/postgresql.conf
                  template: |
                    listen_addresses = '*'
                    max_connections = 100
                    shared_buffers = 128MB
                    dynamic_shared_memory_type = posix
                    max_wal_size = 1GB
                    min_wal_size = 80MB
                    log_timezone = 'Etc/UTC'
                    datestyle = 'iso, mdy'
                    timezone = 'Etc/UTC'
                    lc_messages = 'en_US.utf8'
                    lc_monetary = 'en_US.utf8'
                    lc_numeric = 'en_US.utf8'
                    lc_time = 'en_US.utf8'
                    default_text_search_config = 'pg_catalog.english'
                  permission: null
                  envsubst: null
        - name: redis
          icon: https://raw.githubusercontent.com/zeabur/service-icons/main/marketplace/redis.svg
          template: PREBUILT
          spec:
            id: redis
            source:
                image: redis/redis-stack-server:latest
            ports:
                - id: database
                  port: 6379
                  type: TCP
            volumes:
                - id: data
                  dir: /data
            instructions:
                - title: Redis Connection String
                  content: redis://:${REDIS_PASSWORD}@${PORT_FORWARDED_HOSTNAME}:${DATABASE_PORT_FORWARDED_PORT}
                - title: Redis password
                  content: ${REDIS_PASSWORD}
                - title: Redis host
                  content: ${PORT_FORWARDED_HOSTNAME}
                - title: Redis port
                  content: ${DATABASE_PORT_FORWARDED_PORT}
            env:
                CONFFILE:
                    default: /etc/redis-stack.conf
                REDIS_ARGS:
                    default: --requirepass ${REDIS_PASSWORD}
                REDIS_CONNECTION_STRING:
                    default: redis://:${REDIS_PASSWORD}@${REDIS_HOST}:${REDIS_PORT}
                    expose: true
                REDIS_HOST:
                    default: ${CONTAINER_HOSTNAME}
                    expose: true
                REDIS_PASSWORD:
                    default: ${PASSWORD}
                    expose: true
                REDIS_PORT:
                    default: ${DATABASE_PORT}
                    expose: true
                REDIS_URI:
                    default: ${REDIS_CONNECTION_STRING}
                    expose: true
            configs:
                - path: /etc/redis-stack.conf
                  template: |
                    port 6379
                    daemonize no
                  permission: null
                  envsubst: null
        - name: meilisearch
          icon: https://www.meilisearch.com/favicon.svg
          template: PREBUILT
          spec:
            id: meilisearch
            source:
                image: getmeili/meilisearch:v1.11
            ports:
                - id: web
                  port: 7700
                  type: HTTP
            volumes:
                - id: data
                  dir: /meili_data
            instructions:
                - title: Meilisearch Master Key
                  content: ${MEILI_MASTER_KEY}
            env:
                MEILI_ENV:
                    default: production
                MEILI_MASTER_KEY:
                    default: ${PASSWORD}
                    expose: true
                MEILI_NO_ANALYTICS:
                    default: "true"
                MEILISEARCH_INTERNAL_HOST:
                    default: ${CONTAINER_HOSTNAME}
                    expose: true
        - name: Open Mercato
          icon: https://avatars.githubusercontent.com/u/208587498
          dependencies:
            - postgresql
            - redis
            - meilisearch
          template: PREBUILT_V2
          spec:
            id: open-mercato
            source:
                image: zeabur/open-mercato:latest
                command:
                    - /bin/sh
                args:
                    - -c
                    - |
                      echo "Waiting for PostgreSQL..."
                      while ! nc -z ${POSTGRES_HOST} ${POSTGRES_PORT} 2>/dev/null; do sleep 2; done
                      echo "PostgreSQL is ready!"
                      echo "Waiting for Redis..."
                      while ! nc -z ${REDIS_HOST} ${REDIS_PORT} 2>/dev/null; do sleep 2; done
                      echo "Redis is ready!"
                      cd /app
                      if [ ! -f /app/apps/mercato/storage/.initialized ]; then
                        echo "First run: full initialization..."
                        yarn mercato init && mkdir -p /app/apps/mercato/storage && touch /app/apps/mercato/storage/.initialized
                      else
                        echo "Subsequent run: migrations only..."
                        yarn db:migrate
                      fi
                      cd /app/apps/mercato
                      exec /app/node_modules/.bin/next start -p 3000
            ports:
                - id: web
                  port: 3000
                  type: HTTP
            volumes:
                - id: storage
                  dir: /app/apps/mercato/storage
            env:
                APP_URL:
                    default: ${ZEABUR_WEB_URL}
                AUTO_SPAWN_SCHEDULER:
                    default: "true"
                AUTO_SPAWN_WORKERS:
                    default: "true"
                CACHE_REDIS_URL:
                    default: ${REDIS_CONNECTION_STRING}
                CACHE_STRATEGY:
                    default: redis
                DATABASE_URL:
                    default: postgres://${POSTGRES_USERNAME}:${POSTGRES_PASSWORD}@${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DATABASE}
                DEMO_MODE:
                    default: "false"
                ENABLE_CRUD_API_CACHE:
                    default: "true"
                JWT_SECRET:
                    default: ${PASSWORD}
                MEILISEARCH_API_KEY:
                    default: ${MEILI_MASTER_KEY}
                MEILISEARCH_HOST:
                    default: http://${MEILISEARCH_INTERNAL_HOST}:7700
                NEW_RELIC_ENABLED:
                    default: "false"
                NODE_ENV:
                    default: production
                OM_SEARCH_ENABLED:
                    default: "true"
                PORT:
                    default: "3000"
                QUEUE_REDIS_URL:
                    default: ${REDIS_CONNECTION_STRING}
                REDIS_URL:
                    default: ${REDIS_CONNECTION_STRING}
                SELF_SERVICE_ONBOARDING_ENABLED:
                    default: "true"
                TENANT_DATA_ENCRYPTION:
                    default: "true"
                TENANT_DATA_ENCRYPTION_FALLBACK_KEY:
                    default: ${PASSWORD}
          domainKey: PUBLIC_DOMAIN
localization:
    zh-CN:
        description: 一个 AI 支持的 CRM/ERP 基础框架 — 用于驱动研发、运营和增长。
        readme: |-
            # Open Mercato

            [Open Mercato](https://github.com/open-mercato/open-mercato) 是一个开源、AI 支持的 CRM/ERP 基础框架，使用 Next.js、TypeScript 和 MikroORM 构建。它提供模块化、可扩展的企业级业务应用构建模块。

            ## 功能特点

            - **多租户** 严格的组织/租户隔离
            - **自定义实体** 和动态表单
            - **RBAC** 角色权限控制与功能开关
            - **字段级数据加密**（租户范围）
            - **混合搜索** 集成 Meilisearch
            - **AI 助手** 集成 MCP（模型上下文协议）
            - **事件订阅** 和工作流编排

            ## 在 Zeabur 上部署

            1. 点击部署并选择您的区域。
            2. 等待所有服务（PostgreSQL、Redis、Meilisearch、App）启动。
            3. 应用会在首次启动时自动运行数据库初始化。
            4. 绑定域名来访问应用。
            5. 默认凭据：超级管理员 `superadmin@acme.com` / 管理员 `admin@acme.com` / 员工 `employee@acme.com`，密码均为 `secret` — **首次登录后请立即修改**。

            ## 配置

            - 要启用 AI 功能，请在应用的环境变量中添加 `OPENAI_API_KEY` 或 `ANTHROPIC_API_KEY`。
            - 要配置邮件，请在应用的环境变量中设置 `RESEND_API_KEY` 和 `EMAIL_FROM`。

            ## 许可证与归属

            Open Mercato 采用 [MIT 许可证](https://github.com/open-mercato/open-mercato/blob/develop/LICENSE)。

            - **仓库**: https://github.com/open-mercato/open-mercato
            - **文档**: https://docs.openmercato.com
            - **演示**: https://demo.openmercato.com
    zh-TW:
        description: 一個 AI 支持的 CRM/ERP 基礎框架 — 用於驅動研發、營運和成長。
        readme: |-
            # Open Mercato

            [Open Mercato](https://github.com/open-mercato/open-mercato) 是一個開源、AI 支持的 CRM/ERP 基礎框架，使用 Next.js、TypeScript 和 MikroORM 建構。它提供模組化、可擴展的企業級商業應用程式建構模組。

            ## 功能特點

            - **多租戶** 嚴格的組織/租戶隔離
            - **自訂實體** 和動態表單
            - **RBAC** 角色權限控制與功能開關
            - **欄位級資料加密**（租戶範圍）
            - **混合搜尋** 整合 Meilisearch
            - **AI 助手** 整合 MCP（模型上下文協議）
            - **事件訂閱** 和工作流程編排

            ## 在 Zeabur 上部署

            1. 點擊部署並選擇您的區域。
            2. 等待所有服務（PostgreSQL、Redis、Meilisearch、App）啟動。
            3. 應用程式會在首次啟動時自動執行資料庫初始化。
            4. 綁定網域來存取應用程式。
            5. 預設帳密：超級管理員 `superadmin@acme.com` / 管理員 `admin@acme.com` / 員工 `employee@acme.com`，密碼皆為 `secret` — **首次登入後請立即修改**。

            ## 設定

            - 要啟用 AI 功能，請在應用程式的環境變數中新增 `OPENAI_API_KEY` 或 `ANTHROPIC_API_KEY`。
            - 要設定郵件，請在應用程式的環境變數中設置 `RESEND_API_KEY` 和 `EMAIL_FROM`。

            ## 授權與歸屬

            Open Mercato 採用 [MIT 授權條款](https://github.com/open-mercato/open-mercato/blob/develop/LICENSE)。

            - **儲存庫**: https://github.com/open-mercato/open-mercato
            - **文件**: https://docs.openmercato.com
            - **展示**: https://demo.openmercato.com
