# yaml-language-server: $schema=https://schema.zeabur.app/template.json
apiVersion: zeabur.com/v1
kind: Template
metadata:
    name: openim-complete
spec:
    description: OpenIM 即时通讯完整部署方案，包含服务器、聊天服务、Web前端、管理后台及所有依赖组件（MongoDB、Redis、Kafka、Etcd、MinIO）
    coverImage: https://docs.openim.io/img/logo.png
    icon: https://docs.openim.io/img/logo.png
    variables:
        - key: MONGO_ROOT_PASSWORD
          type: PASSWORD
          name: MongoDB Root 密码
          description: MongoDB 数据库 root 用户密码
        - key: MONGO_OPENIM_PASSWORD
          type: PASSWORD
          name: MongoDB OpenIM 用户密码
          description: MongoDB OpenIM 应用用户密码
        - key: REDIS_PASSWORD
          type: PASSWORD
          name: Redis 密码
          description: Redis 缓存服务密码
        - key: MINIO_SECRET_ACCESS_KEY
          type: PASSWORD
          name: MinIO 访问密钥
          description: MinIO 对象存储访问密钥
        - key: OPENIM_SECRET
          type: PASSWORD
          name: OpenIM 密钥
          description: OpenIM 系统认证密钥
        - key: OPENIM_WEB_DOMAIN
          type: DOMAIN
          name: Web 前端域名
          description: OpenIM Web 前端访问域名
        - key: OPENIM_ADMIN_DOMAIN
          type: DOMAIN
          name: 管理后台域名
          description: OpenIM 管理后台访问域名
        - key: MINIO_EXTERNAL_DOMAIN
          type: DOMAIN
          name: MinIO 外部访问域名
          description: MinIO 对象存储外部访问域名
    tags:
        - IM
        - Chat
        - Communication
        - Database
        - Storage
    readme: |-
        # OpenIM 完整部署方案

        一键部署 OpenIM 即时通讯系统，包含:

        ## 核心服务
        - **OpenIM Server** - 核心即时通讯服务器
        - **OpenIM Chat** - 聊天业务服务
        - **Web Frontend** - Web 用户端界面
        - **Admin Frontend** - 管理后台界面

        ## 基础设施
        - **MongoDB** - 数据存储
        - **Redis** - 缓存服务
        - **Kafka** - 消息队列
        - **Etcd** - 服务发现与配置中心
        - **MinIO** - 对象存储服务

        ## 部署后配置

        1. 访问 Web 前端进行用户注册和登录
        2. 访问管理后台进行系统配置
        3. 根据需要调整 MinIO 和 API 的外部访问地址

        ## 端口说明

        - **10001** - OpenIM 消息网关
        - **10002** - OpenIM API
        - **10008** - Chat API
        - **10009** - Admin API
        - **11001** - Web 前端
        - **11002** - Admin 前端
        - **10005** - MinIO 对象存储
        - **10004** - MinIO 控制台
    services:
        - name: mongodb
          icon: https://cdn.icon-icons.com/icons2/2415/PNG/512/mongodb_original_wordmark_logo_icon_146425.png
          template: PREBUILT
          spec:
            source:
                image: mongo:7.0
            ports:
                - id: mongodb
                  port: 27017
                  type: TCP
            volumes:
                - id: data
                  dir: /data/db
            env:
                MONGO_INITDB_DATABASE:
                    default: openim_v3
                MONGO_INITDB_ROOT_PASSWORD:
                    default: ${MONGO_ROOT_PASSWORD}
                MONGO_INITDB_ROOT_USERNAME:
                    default: root
                MONGO_OPENIM_PASSWORD:
                    default: ${MONGO_OPENIM_PASSWORD}
                MONGO_OPENIM_USERNAME:
                    default: openIM
                TZ:
                    default: Asia/Shanghai
                wiredTigerCacheSizeGB:
                    default: "1"
        - name: redis
          icon: https://cdn.icon-icons.com/icons2/2415/PNG/512/redis_original_wordmark_logo_icon_146369.png
          template: PREBUILT
          spec:
            source:
                image: redis:7.0.0
            ports:
                - id: redis
                  port: 6379
                  type: TCP
            volumes:
                - id: data
                  dir: /data
            env:
                REDIS_PASSWORD:
                    default: ${REDIS_PASSWORD}
                    expose: true
                TZ:
                    default: Asia/Shanghai
        - name: etcd
          icon: https://cdn.icon-icons.com/icons2/2699/PNG/512/etcd_logo_icon_167964.png
          template: PREBUILT
          spec:
            source:
                image: bitnamilegacy/etcd:3.5.13
            ports:
                - id: client
                  port: 2379
                  type: TCP
                - id: peer
                  port: 2380
                  type: TCP
            volumes:
                - id: data
                  dir: /etcd-data
            env:
                ALLOW_NONE_AUTHENTICATION:
                    default: "yes"
                ETCD_ADVERTISE_CLIENT_URLS:
                    default: http://0.0.0.0:2379
                ETCD_DATA_DIR:
                    default: /etcd-data
                ETCD_INITIAL_ADVERTISE_PEER_URLS:
                    default: http://0.0.0.0:2380
                ETCD_INITIAL_CLUSTER:
                    default: s1=http://0.0.0.0:2380
                ETCD_INITIAL_CLUSTER_STATE:
                    default: new
                ETCD_INITIAL_CLUSTER_TOKEN:
                    default: tkn
                ETCD_LISTEN_CLIENT_URLS:
                    default: http://0.0.0.0:2379
                ETCD_LISTEN_PEER_URLS:
                    default: http://0.0.0.0:2380
                ETCD_NAME:
                    default: s1
        - name: kafka
          icon: https://cdn.icon-icons.com/icons2/2699/PNG/512/apache_kafka_logo_icon_170097.png
          template: PREBUILT
          spec:
            source:
                image: bitnamilegacy/kafka:3.5.1
            ports:
                - id: internal
                  port: 9092
                  type: TCP
                - id: controller
                  port: 9093
                  type: TCP
                - id: external
                  port: 9094
                  type: TCP
            volumes:
                - id: data
                  dir: /bitnami/kafka
            env:
                KAFKA_CFG_ADVERTISED_LISTENERS:
                    default: INTERNAL://kafka:9092,EXTERNAL://kafka:9094
                KAFKA_CFG_AUTO_CREATE_TOPICS_ENABLE:
                    default: "true"
                KAFKA_CFG_CONTROLLER_LISTENER_NAMES:
                    default: CONTROLLER
                KAFKA_CFG_CONTROLLER_QUORUM_VOTERS:
                    default: 0@kafka:9093
                KAFKA_CFG_INTER_BROKER_LISTENER_NAME:
                    default: INTERNAL
                KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP:
                    default: CONTROLLER:PLAINTEXT,EXTERNAL:PLAINTEXT,INTERNAL:PLAINTEXT
                KAFKA_CFG_LISTENERS:
                    default: INTERNAL://:9092,CONTROLLER://:9093,EXTERNAL://:9094
                KAFKA_CFG_NODE_ID:
                    default: "0"
                KAFKA_CFG_PROCESS_ROLES:
                    default: controller,broker
                KAFKA_NUM_PARTITIONS:
                    default: "8"
                TZ:
                    default: Asia/Shanghai
        - name: minio
          icon: https://cdn.icon-icons.com/icons2/2699/PNG/512/minio_logo_icon_170603.png
          template: PREBUILT
          spec:
            source:
                image: minio/minio:RELEASE.2024-01-11T07-46-16Z
            ports:
                - id: api
                  port: 9000
                  type: HTTP
                - id: console
                  port: 9090
                  type: HTTP
            volumes:
                - id: data
                  dir: /data
            env:
                MINIO_ROOT_PASSWORD:
                    default: ${MINIO_SECRET_ACCESS_KEY}
                MINIO_ROOT_USER:
                    default: root
                TZ:
                    default: Asia/Shanghai
        - name: openimserver
          icon: https://docs.openim.io/img/logo.png
          template: PREBUILT
          spec:
            source:
                image: openim/openim-server:v3.8.3-patch.9
            ports:
                - id: gateway
                  port: 10001
                  type: TCP
                - id: api
                  port: 10002
                  type: HTTP
            env:
                IMENV_DISCOVERY_ETCD_ADDRESS:
                    default: etcd:2379
                IMENV_KAFKA_ADDRESS:
                    default: kafka:9094
                IMENV_LOG_ISSTDOUT:
                    default: "true"
                IMENV_LOG_REMAINLOGLEVEL:
                    default: "3"
                IMENV_MINIO_ACCESSKEYID:
                    default: root
                IMENV_MINIO_EXTERNALADDRESS:
                    default: http://${MINIO_EXTERNAL_DOMAIN}:9000
                IMENV_MINIO_INTERNALADDRESS:
                    default: minio:9000
                IMENV_MINIO_SECRETACCESSKEY:
                    default: ${MINIO_SECRET_ACCESS_KEY}
                IMENV_MONGODB_ADDRESS:
                    default: mongodb:27017
                IMENV_MONGODB_PASSWORD:
                    default: ${MONGO_OPENIM_PASSWORD}
                IMENV_MONGODB_USERNAME:
                    default: openIM
                IMENV_REDIS_ADDRESS:
                    default: redis:6379
                IMENV_REDIS_PASSWORD:
                    default: ${REDIS_PASSWORD}
                IMENV_SHARE_SECRET:
                    default: ${OPENIM_SECRET}
        - name: openimchat
          icon: https://docs.openim.io/img/logo.png
          template: PREBUILT
          spec:
            source:
                image: openim/openim-chat:v1.8.4-patch.2
            ports:
                - id: chatapi
                  port: 10008
                  type: HTTP
                - id: adminapi
                  port: 10009
                  type: HTTP
            env:
                CHATENV_DISCOVERY_ETCD_ADDRESS:
                    default: etcd:2379
                CHATENV_LOG_ISSTDOUT:
                    default: "true"
                CHATENV_LOG_REMAINLOGLEVEL:
                    default: "3"
                CHATENV_MONGODB_ADDRESS:
                    default: mongodb:27017
                CHATENV_MONGODB_PASSWORD:
                    default: ${MONGO_OPENIM_PASSWORD}
                CHATENV_MONGODB_USERNAME:
                    default: openIM
                CHATENV_REDIS_ADDRESS:
                    default: redis:6379
                CHATENV_REDIS_PASSWORD:
                    default: ${REDIS_PASSWORD}
                CHATENV_SHARE_OPENIM_APIURL:
                    default: http://openimserver:10002
                CHATENV_SHARE_OPENIM_SECRET:
                    default: ${OPENIM_SECRET}
        - name: openimweb
          icon: https://docs.openim.io/img/logo.png
          template: PREBUILT
          spec:
            source:
                image: openim/openim-web-front:release-v3.8.3
            ports:
                - id: web
                  port: 80
                  type: HTTP
          domainKey: OPENIM_WEB_DOMAIN
        - name: openimadmin
          icon: https://docs.openim.io/img/logo.png
          template: PREBUILT
          spec:
            source:
                image: openim/openim-admin-front:release-v1.8.4
            ports:
                - id: admin
                  port: 80
                  type: HTTP
          domainKey: OPENIM_ADMIN_DOMAIN
localization:
    en-US:
        description: Complete OpenIM deployment solution including server, chat service, web frontend, admin panel and all dependencies
        variables:
            - key: MONGO_ROOT_PASSWORD
              type: STRING
              name: MongoDB Root Password
              description: MongoDB database root user password
            - key: MONGO_OPENIM_PASSWORD
              type: STRING
              name: MongoDB OpenIM Password
              description: MongoDB OpenIM application user password
            - key: REDIS_PASSWORD
              type: STRING
              name: Redis Password
              description: Redis cache service password
            - key: MINIO_SECRET_ACCESS_KEY
              type: STRING
              name: MinIO Access Key
              description: MinIO object storage access key
            - key: OPENIM_SECRET
              type: STRING
              name: OpenIM Secret
              description: OpenIM system authentication secret
            - key: OPENIM_WEB_DOMAIN
              type: STRING
              name: Web Frontend Domain
              description: OpenIM web frontend access domain
            - key: OPENIM_ADMIN_DOMAIN
              type: STRING
              name: Admin Panel Domain
              description: OpenIM admin panel access domain
            - key: MINIO_EXTERNAL_DOMAIN
              type: STRING
              name: MinIO External Domain
              description: MinIO object storage external access domain
        readme: |-
            # OpenIM Complete Deployment

            Deploy OpenIM instant messaging system with one click.

            ## Post-deployment Configuration

            1. Wait for all services to start
            2. Access web frontend domain for user registration
            3. Access admin panel domain for system configuration
            4. Update MinIO external address according to actual domain

            ## Notes

            - MongoDB and Redis passwords will be auto-generated
            - Keep all password information safe
            - MinIO external domain must be correctly configured for file upload/download
    zh-CN:
        description: OpenIM 即时通讯完整部署方案，包含服务器、聊天服务、Web前端、管理后台及所有依赖组件
        variables:
            - key: MONGO_ROOT_PASSWORD
              type: STRING
              name: MongoDB Root 密码
              description: MongoDB 数据库 root 用户密码
            - key: MONGO_OPENIM_PASSWORD
              type: STRING
              name: MongoDB OpenIM 用户密码
              description: MongoDB OpenIM 应用用户密码
            - key: REDIS_PASSWORD
              type: STRING
              name: Redis 密码
              description: Redis 缓存服务密码
            - key: MINIO_SECRET_ACCESS_KEY
              type: STRING
              name: MinIO 访问密钥
              description: MinIO 对象存储访问密钥
            - key: OPENIM_SECRET
              type: STRING
              name: OpenIM 密钥
              description: OpenIM 系统认证密钥
            - key: OPENIM_WEB_DOMAIN
              type: STRING
              name: Web 前端域名
              description: OpenIM Web 前端访问域名
            - key: OPENIM_ADMIN_DOMAIN
              type: STRING
              name: 管理后台域名
              description: OpenIM 管理后台访问域名
            - key: MINIO_EXTERNAL_DOMAIN
              type: STRING
              name: MinIO 外部访问域名
              description: MinIO 对象存储外部访问域名
        readme: |-
            # OpenIM 完整部署方案

            一键部署 OpenIM 即时通讯系统。

            ## 部署后配置

            1. 等待所有服务启动完成
            2. 访问 Web 前端域名进行用户注册
            3. 访问管理后台域名进行系统配置
            4. 根据实际域名更新 MinIO 外部访问地址

            ## 注意事项

            - MongoDB 和 Redis 密码会自动生成
            - 请妥善保管所有密码信息
            - MinIO 外部访问域名需要正确配置才能上传/下载文件
