# yaml-language-server: $schema=https://schema.zeabur.app/template.json
apiVersion: zeabur.com/v1
kind: Template
metadata:
    name: RAGFlow
spec:
    description: An open-source RAG (Retrieval-Augmented Generation) engine based on deep document understanding.
    icon: https://avatars.githubusercontent.com/u/69962740?s=200&v=4
    variables:
        - key: PUBLIC_DOMAIN
          type: DOMAIN
          name: Domain
          description: What is the domain you want for your RAGFlow?
    tags:
        - AI/ML
        - RAG
        - Knowledge Base
    readme: |-
        ## What is RAGFlow?

        RAGFlow is an open-source RAG (Retrieval-Augmented Generation) engine based on deep document understanding. It offers a streamlined RAG workflow that is meticulously designed for businesses of any scale.

        ## Features

        - **Deep Document Understanding**: Advanced document parsing and chunking capabilities
        - **Template-based Chunking**: Intelligent content segmentation
        - **Grounded Citations**: Trustworthy question-answering with verifiable sources
        - **Multiple Document Formats**: Support for PDF, DOCX, PPT, Excel, images, and more
        - **Compatibility**: Works with heterogeneous model ecosystems including Ollama
        - **Modular Architecture**: Core service with optional additional components

        ## Architecture

        This template includes:
        - **RAGFlow Core**: Main application service (required)
        - **MySQL**: Database for storing metadata and configurations (required)
        - **Optional Services**: Redis, MinIO, Elasticsearch, OpenSearch, and Infinity (can be deployed separately if needed)

        ## Environment Variables

        The following environment variables will be automatically configured:

        - `${RAGFLOW_URL}`: The URL of the RAGFlow service
        - `${MYSQL_CONNECTION_STRING}`: MySQL database connection string
        - `${REDIS_CONNECTION_STRING}`: Redis connection string
        - `${MINIO_ENDPOINT}`: MinIO object storage endpoint
        - `${ELASTICSEARCH_URL}`: Elasticsearch search engine URL
        - `${OPENSEARCH_URL}`: OpenSearch alternative search engine URL
        - `${INFINITY_URL}`: Infinity vector database URL

        ## Getting Started

        1. After deployment, access RAGFlow through the provided URL
        2. Create your first knowledge base
        3. Upload documents (PDF, DOCX, images, etc.)
        4. Start asking questions based on your documents

        ## Default Credentials

        - RAGFlow admin interface will be accessible without initial authentication
        - Database and storage credentials are automatically generated and configured
    services:
        - name: ragflow
          icon: https://avatars.githubusercontent.com/u/69962740?s=200&v=4
          dependencies:
            - mysql
          template: PREBUILT
          spec:
            id: ragflow
            source:
                image: infiniflow/ragflow:v0.20.3-slim
            ports:
                - id: web
                  port: 80
                  type: HTTP
            volumes:
                - id: logs
                  dir: /ragflow/logs
            env:
                DOC_ENGINE:
                    default: elasticsearch
                ELASTIC_PASSWORD:
                    default: ${ZEABUR_ELASTICSEARCH_PASSWORD}
                ES_HOST:
                    default: elasticsearch.zeabur.internal
                ES_PORT:
                    default: "9200"
                HF_ENDPOINT:
                    default: https://hf-mirror.com
                INFINITY_HOST:
                    default: infinity.zeabur.internal
                INFINITY_HTTP_PORT:
                    default: "23820"
                INFINITY_PSQL_PORT:
                    default: "5432"
                INFINITY_THRIFT_PORT:
                    default: "23817"
                MINIO_HOST:
                    default: minio.zeabur.internal
                MINIO_PASSWORD:
                    default: ${ZEABUR_MINIO_PASSWORD}
                MINIO_PORT:
                    default: "9000"
                MINIO_USER:
                    default: minio
                MYSQL_DBNAME:
                    default: ${ZEABUR_MYSQL_DATABASE}
                MYSQL_HOST:
                    default: ${ZEABUR_MYSQL_HOST}
                MYSQL_PASSWORD:
                    default: ${ZEABUR_MYSQL_PASSWORD}
                MYSQL_PORT:
                    default: ${ZEABUR_MYSQL_PORT}
                OPENSEARCH_HOST:
                    default: opensearch.zeabur.internal
                OPENSEARCH_PASSWORD:
                    default: ${ZEABUR_OPENSEARCH_PASSWORD}
                OPENSEARCH_PORT:
                    default: "9201"
                REDIS_HOST:
                    default: redis.zeabur.internal
                REDIS_PASSWORD:
                    default: ${ZEABUR_REDIS_PASSWORD}
                REDIS_PORT:
                    default: "6379"
                SVR_HTTP_PORT:
                    default: "9380"
                TZ:
                    default: Asia/Shanghai
            configs:
                - path: /etc/nginx/proxy.conf
                  template: |
                    proxy_set_header Host $host;
                    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                    proxy_set_header X-Forwarded-Proto $scheme;
                    proxy_http_version 1.1;
                    proxy_set_header Connection "";
                    proxy_buffering off;
                    proxy_read_timeout 3600s;
                    proxy_send_timeout 3600s;
                    proxy_buffer_size 1024k;
                    proxy_buffers 16 1024k;
                    proxy_busy_buffers_size 2048k;
                    proxy_temp_file_write_size 2048k;
                  permission: null
                  envsubst: null
                - path: /etc/nginx/conf.d/ragflow.conf
                  template: |
                    server {
                        listen 80;
                        server_name _;
                        root /ragflow/web/dist;

                        gzip on;
                        gzip_min_length 1k;
                        gzip_comp_level 9;
                        gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
                        gzip_vary on;
                        gzip_disable "MSIE [1-6]\.";

                        location ~ ^/(v1|api) {
                            proxy_pass http://127.0.0.1:9380;
                            include proxy.conf;
                        }

                        location / {
                            index index.html;
                            try_files $uri $uri/ /index.html;
                        }

                        # Cache-Control: max-age~@~AExpires
                        location ~ ^/static/(css|js|media)/ {
                            expires 10y;
                            access_log off;
                        }
                    }
                  permission: null
                  envsubst: null
                - path: /etc/nginx/nginx.conf
                  template: |
                    user  root;
                    worker_processes  auto;

                    error_log  /var/log/nginx/error.log notice;
                    pid        /var/run/nginx.pid;

                    events {
                        worker_connections  1024;
                    }

                    http {
                        include       /etc/nginx/mime.types;
                        default_type  application/octet-stream;

                        log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                                          '$status $body_bytes_sent "$http_referer" '
                                          '"$http_user_agent" "$http_x_forwarded_for"';

                        access_log  /var/log/nginx/access.log  main;

                        sendfile        on;
                        keepalive_timeout  65;
                        client_max_body_size 1024M;

                        include /etc/nginx/conf.d/ragflow.conf;
                    }
                  permission: null
                  envsubst: null
                - path: /ragflow/conf/service_conf.yaml
                  template: "ragflow:\n  host: 0.0.0.0\n  http_port: 9380\n  \nmysql:\n  name: ${ZEABUR_MYSQL_DATABASE}\n  user: root\n  password: ${ZEABUR_MYSQL_PASSWORD}\n  host: ${ZEABUR_MYSQL_HOST}\n  port: ${ZEABUR_MYSQL_PORT}\n  max_connections: 900\n  stale_timeout: 300\n  max_allowed_packet: 1073741824\n  \nminio:\n  user: ${MINIO_USER}\n  password: ${MINIO_PASSWORD}\n  host: ${MINIO_HOST}:${MINIO_PORT}\n  \nes:\n  hosts: http://${ES_HOST}:${ES_PORT}\n  username: elastic\n  password: ${ELASTIC_PASSWORD}\n  \nos:\n  hosts: http://${OPENSEARCH_HOST}:${OPENSEARCH_PORT}\n  username: admin\n  password: ${OPENSEARCH_PASSWORD}\n  \ninfinity:\n  uri: ${INFINITY_HOST}:${INFINITY_THRIFT_PORT}\n  db_name: default_db\n  \nredis:\n  db: 1\n  password: ${REDIS_PASSWORD}\n  host: ${REDIS_HOST}:${REDIS_PORT}\n"
                  permission: null
                  envsubst: true
                - path: /ragflow/entrypoint.sh
                  template: |
                    #!/bin/bash
                    set -e

                    # Remove default nginx config
                    rm -f /etc/nginx/conf.d/default.conf

                    # Start nginx
                    nginx -g "daemon on;"

                    # Wait for nginx to start
                    sleep 2

                    # Start RAGFlow
                    cd /ragflow
                    exec python api/ragflow_server.py
                  permission: 493
                  envsubst: null
          domainKey: PUBLIC_DOMAIN
        - name: mysql
          icon: https://raw.githubusercontent.com/zeabur/service-icons/main/marketplace/mysql.svg
          template: PREBUILT
          spec:
            id: mysql
            source:
                image: mysql:8.0
            ports:
                - id: database
                  port: 3306
                  type: TCP
            volumes:
                - id: data
                  dir: /var/lib/mysql
            instructions:
                - title: Command to connect to your MySQL
                  content: mysqlsh --sql --host=${PORT_FORWARDED_HOSTNAME} --port=${DATABASE_PORT_FORWARDED_PORT} --user=${MYSQL_USERNAME} --password=${MYSQL_PASSWORD} --schema=${MYSQL_DATABASE}
                - title: MySQL username
                  content: ${MYSQL_USERNAME}
                - title: MySQL password
                  content: ${MYSQL_PASSWORD}
                - title: MySQL database
                  content: ${MYSQL_DATABASE}
                - title: MySQL host
                  content: ${PORT_FORWARDED_HOSTNAME}
                - title: MySQL port
                  content: ${DATABASE_PORT_FORWARDED_PORT}
            env:
                MYSQL_DATABASE:
                    default: zeabur
                    expose: true
                MYSQL_HOST:
                    default: ${CONTAINER_HOSTNAME}
                    expose: true
                MYSQL_PASSWORD:
                    default: ${MYSQL_ROOT_PASSWORD}
                    expose: true
                MYSQL_PORT:
                    default: ${DATABASE_PORT}
                    expose: true
                MYSQL_ROOT_PASSWORD:
                    default: ${PASSWORD}
                MYSQL_USERNAME:
                    default: root
                    expose: true
                ZEABUR_MYSQL_DATABASE:
                    default: ${MYSQL_DATABASE}
                    expose: true
                ZEABUR_MYSQL_HOST:
                    default: ${MYSQL_HOST}
                    expose: true
                ZEABUR_MYSQL_PASSWORD:
                    default: ${MYSQL_PASSWORD}
                    expose: true
                ZEABUR_MYSQL_PORT:
                    default: ${MYSQL_PORT}
                    expose: true
            configs:
                - path: /etc/my.cnf
                  template: |
                    [mysqld]
                    default-authentication-plugin=mysql_native_password
                    host-cache-size=0
                    skip-name-resolve
                    datadir=/var/lib/mysql
                    socket=/var/run/mysqld/mysqld.sock
                    secure-file-priv=/var/lib/mysql-files
                    user=mysql
                    max_allowed_packet=10M
                    max_connections=1000
                    character-set-server=utf8mb4
                    collation-server=utf8mb4_unicode_ci
                    tls_version=TLSv1.2,TLSv1.3
                    binlog_expire_logs_seconds=604800
                    performance_schema=off

                    pid-file=/var/run/mysqld/mysqld.pid
                    [client]
                    socket=/var/run/mysqld/mysqld.sock

                    !includedir /etc/mysql/conf.d/
                  permission: null
                  envsubst: null
                - path: /data/application/init.sql
                  template: |
                    -- RAGFlow initialization SQL
                    CREATE DATABASE IF NOT EXISTS ragflow CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
                  permission: null
                  envsubst: null
            healthCheck:
                type: TCP
                port: database
        - name: redis
          icon: https://raw.githubusercontent.com/zeabur/service-icons/main/marketplace/redis.svg
          template: PREBUILT
          spec:
            id: redis
            source:
                image: valkey/valkey:8
                command:
                    - redis-server
                    - --requirepass
                    - ${REDIS_PASSWORD}
                    - --maxmemory
                    - 128mb
                    - --maxmemory-policy
                    - allkeys-lru
            ports:
                - id: database
                  port: 6379
                  type: TCP
            volumes:
                - id: data
                  dir: /data
            instructions:
                - title: Command to connect to your Redis
                  content: redis-cli -h ${PORT_FORWARDED_HOSTNAME} -p ${DATABASE_PORT_FORWARDED_PORT} -a ${REDIS_PASSWORD}
                - 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:
                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
                ZEABUR_REDIS_PASSWORD:
                    default: ${REDIS_PASSWORD}
                    expose: true
            healthCheck:
                type: TCP
                port: database
        - name: minio
          icon: https://raw.githubusercontent.com/zeabur/service-icons/main/marketplace/minio.svg
          template: PREBUILT
          spec:
            id: minio
            source:
                image: quay.io/minio/minio:latest
                command:
                    - /bin/sh
                args:
                    - -c
                    - |
                      minio server /data --console-address :9090 &
                      MINIO_PID=$!
                      while ! curl -s http://localhost:9000/minio/health/live; do
                        echo 'Waiting for MinIO to start...'
                        sleep 1
                      done
                      sleep 5
                      mc alias set myminio http://localhost:9000 $MINIO_USERNAME $MINIO_PASSWORD
                      echo "Creating bucket '$MINIO_DEFAULT_BUCKET'"
                      mc mb myminio/$MINIO_DEFAULT_BUCKET
                      wait $MINIO_PID
            ports:
                - id: web
                  port: 9000
                  type: HTTP
                - id: console
                  port: 9001
                  type: HTTP
            volumes:
                - id: data
                  dir: /data
            instructions:
                - title: Go to MinIO Console
                  content: ${MINIO_CONSOLE_URL}
                - title: Default Username (S3 Access Key ID)
                  content: ${MINIO_USERNAME}
                - title: Default Password (S3 Secret Access Key)
                  content: ${MINIO_PASSWORD}
                - title: Default Bucket
                  content: ${MINIO_DEFAULT_BUCKET}
            env:
                MINIO_BROWSER_REDIRECT:
                    default: "false"
                MINIO_CONSOLE_PORT:
                    default: ${CONSOLE_PORT}
                    expose: true
                MINIO_CONSOLE_URL:
                    default: ${ZEABUR_CONSOLE_URL}
                    expose: true
                MINIO_DEFAULT_BUCKET:
                    default: ragflow
                MINIO_HOST:
                    default: ${CONTAINER_HOSTNAME}
                MINIO_PASSWORD:
                    default: ${MINIO_ROOT_PASSWORD}
                    expose: true
                MINIO_ROOT_PASSWORD:
                    default: ${PASSWORD}
                MINIO_ROOT_USER:
                    default: minio
                MINIO_S3_PORT:
                    default: ${WEB_PORT}
                MINIO_USERNAME:
                    default: ${MINIO_ROOT_USER}
                    expose: true
                ZEABUR_MINIO_PASSWORD:
                    default: ${MINIO_ROOT_PASSWORD}
                    expose: true
        - name: elasticsearch
          icon: https://cdn.worldvectorlogo.com/logos/elasticsearch.svg
          template: PREBUILT
          spec:
            id: elasticsearch
            source:
                image: docker.elastic.co/elasticsearch/elasticsearch:8.19.3
                runAsUserID: 1000
            ports:
                - id: http
                  port: 9200
                  type: HTTP
            volumes:
                - id: certs
                  dir: /usr/share/elasticsearch/config/certs
                - id: esdata
                  dir: /usr/share/elasticsearch/data
            env:
                ELASTIC_PASSWORD:
                    default: ${PASSWORD}
                ES_PORT:
                    default: "9200"
                MEM_LIMIT:
                    default: "1073741824"
                ZEABUR_ELASTICSEARCH_PASSWORD:
                    default: ${ELASTIC_PASSWORD}
                    expose: true
                action.destructive_requires_name:
                    default: "false"
                bootstrap.memory_lock:
                    default: "true"
                cluster.routing.allocation.disk.watermark.flood_stage:
                    default: 2gb
                cluster.routing.allocation.disk.watermark.high:
                    default: 3gb
                cluster.routing.allocation.disk.watermark.low:
                    default: 5gb
                discovery.type:
                    default: single-node
                node.name:
                    default: elasticsearch
                xpack.license.self_generated.type:
                    default: basic
                xpack.ml.use_auto_machine_memory_percent:
                    default: "true"
                xpack.security.enabled:
                    default: "true"
                xpack.security.http.ssl.enabled:
                    default: "false"
                xpack.security.transport.ssl.enabled:
                    default: "false"
        - name: infinity
          icon: https://avatars.githubusercontent.com/u/69962740?s=200&v=4
          template: PREBUILT
          spec:
            id: infinity
            source:
                image: infiniflow/infinity:v0.6.0-dev5
            ports:
                - id: thrift
                  port: 23817
                  type: TCP
                - id: http
                  port: 23820
                  type: HTTP
                - id: psql
                  port: 5432
                  type: TCP
            volumes:
                - id: infinity-data
                  dir: /var/infinity
            env:
                MEM_LIMIT:
                    default: "1073741824"
                TZ:
                    default: Asia/Shanghai
            configs:
                - path: /infinity_conf.toml
                  template: |
                    [general]
                    version = "0.6.0-dev5"
                    timezone = "Asia/Shanghai"

                    [network]
                    server_address = "0.0.0.0"
                    postgres_port = 5432
                    http_port = 23820
                    sdk_port = 23817

                    [log]
                    log_filename = "infinity.log"
                    log_dir = "/var/infinity/log"
                    log_to_stdout = true
                    log_level = "info"

                    [storage]
                    data_dir = "/var/infinity/data"
                    default_row_size = 8192
                  permission: null
                  envsubst: null
        - name: opensearch
          icon: https://avatars.githubusercontent.com/u/80134844?s=200&v=4
          template: PREBUILT
          spec:
            id: opensearch
            source:
                image: opensearchproject/opensearch:2.19.1
                runAsUserID: 1000
            ports:
                - id: http
                  port: 9201
                  type: HTTP
            volumes:
                - id: osdata
                  dir: /usr/share/opensearch/data
            env:
                MEM_LIMIT:
                    default: "1073741824"
                OPENSEARCH_INITIAL_ADMIN_PASSWORD:
                    default: ${PASSWORD}
                OPENSEARCH_PASSWORD:
                    default: ${PASSWORD}
                    expose: true
                TZ:
                    default: Asia/Shanghai
                ZEABUR_OPENSEARCH_PASSWORD:
                    default: ${OPENSEARCH_PASSWORD}
                    expose: true
                bootstrap.memory_lock:
                    default: "false"
                cluster.routing.allocation.disk.watermark.flood_stage:
                    default: 2gb
                cluster.routing.allocation.disk.watermark.high:
                    default: 3gb
                cluster.routing.allocation.disk.watermark.low:
                    default: 5gb
                discovery.type:
                    default: single-node
                http.port:
                    default: "9201"
                node.name:
                    default: opensearch
                plugins.security.disabled:
                    default: "false"
                plugins.security.ssl.http.enabled:
                    default: "false"
                plugins.security.ssl.transport.enabled:
                    default: "true"
localization:
    zh-CN:
        description: 基于深度文档理解的开源 RAG（检索增强生成）引擎，提供精简的 RAG 工作流程，专为各种规模的企业设计。
        readme: |-
            ## 什么是 RAGFlow？

            RAGFlow 是一个基于深度文档理解的开源 RAG（检索增强生成）引擎，提供精简的 RAG 工作流程，专为各种规模的企业设计。

            ## 功能特色

            - **深度文档理解**：先进的文档解析和分块功能
            - **基于模板的分块**：智能内容分段
            - **可信引用**：具有可验证来源的可信问答
            - **多种文档格式**：支持 PDF、DOCX、PPT、Excel、图片等格式
            - **兼容性**：与包括 Ollama 在内的异构模型生态系统兼容
            - **模块化架构**：核心服务与可选附加组件

            ## 架构

            本模板包含：
            - **RAGFlow 核心**：主要应用服务（必需）
            - **MySQL**：用于存储元数据和配置的数据库（必需）
            - **可选服务**：Redis、MinIO、Elasticsearch、OpenSearch 和 Infinity（可根据需要单独部署）

            ## 环境变量

            部署完成后，以下环境变量将自动配置：

            - `${RAGFLOW_URL}`：RAGFlow 服务的 URL
            - `${MYSQL_CONNECTION_STRING}`：MySQL 数据库连接字符串
            - `${REDIS_CONNECTION_STRING}`：Redis 连接字符串
            - `${MINIO_ENDPOINT}`：MinIO 对象存储端点
            - `${ELASTICSEARCH_URL}`：Elasticsearch 搜索引擎 URL
            - `${OPENSEARCH_URL}`：OpenSearch 替代搜索引擎 URL
            - `${INFINITY_URL}`：Infinity 向量数据库 URL

            ## 开始使用

            1. 部署完成后，通过提供的 URL 访问 RAGFlow
            2. 创建您的第一个知识库
            3. 上传文档（PDF、DOCX、图片等）
            4. 开始基于您的文档进行问答

            ## 默认凭证

            - RAGFlow 管理界面无需初始认证即可访问
            - 数据库和存储凭证将自动生成和配置
    zh-TW:
        description: 基於深度文檔理解的開源 RAG（檢索增強生成）引擎，提供精簡的 RAG 工作流程，專為各種規模的企業設計。
        readme: |-
            ## 什麼是 RAGFlow？

            RAGFlow 是一個基於深度文檔理解的開源 RAG（檢索增強生成）引擎，提供精簡的 RAG 工作流程，專為各種規模的企業設計。

            ## 功能特色

            - **深度文檔理解**：先進的文檔解析和分塊功能
            - **基於模板的分塊**：智慧內容分段
            - **可信引用**：具有可驗證來源的可信問答
            - **多種文檔格式**：支援 PDF、DOCX、PPT、Excel、圖片等格式
            - **相容性**：與包括 Ollama 在內的異構模型生態系統兼容
            - **模組化架構**：核心服務與可選附加元件

            ## 架構

            本模板包含：
            - **RAGFlow 核心**：主要應用服務（必需）
            - **MySQL**：用於存儲元數據和配置的資料庫（必需）
            - **可選服務**：Redis、MinIO、Elasticsearch、OpenSearch 和 Infinity（可根據需要單獨部署）

            ## 環境變數

            部署完成後，以下環境變數將自動配置：

            - `${RAGFLOW_URL}`：RAGFlow 服務的 URL
            - `${MYSQL_CONNECTION_STRING}`：MySQL 資料庫連接字串
            - `${REDIS_CONNECTION_STRING}`：Redis 連接字串
            - `${MINIO_ENDPOINT}`：MinIO 物件存儲端點
            - `${ELASTICSEARCH_URL}`：Elasticsearch 搜尋引擎 URL
            - `${OPENSEARCH_URL}`：OpenSearch 替代搜尋引擎 URL
            - `${INFINITY_URL}`：Infinity 向量資料庫 URL

            ## 開始使用

            1. 部署完成後，透過提供的 URL 存取 RAGFlow
            2. 建立您的第一個知識庫
            3. 上傳文檔（PDF、DOCX、圖片等）
            4. 開始基於您的文檔進行問答

            ## 預設憑證

            - RAGFlow 管理介面無需初始認證即可存取
            - 資料庫和存儲憑證將自動產生和配置
