# yaml-language-server: $schema=https://schema.zeabur.app/template.json
apiVersion: zeabur.com/v1
kind: Template
metadata:
    name: Clipable
spec:
    description: A simple, self-hosted video sharing platform.
    coverImage: https://raw.githubusercontent.com/clipable/clipable/master/.assets/preview.png
    icon: https://raw.githubusercontent.com/clipable/clipable/4c85ea55055ca9b573a1c94c5115de1410b4647a/.assets/logo.svg
    variables:
        - key: PUBLIC_DOMAIN
          type: DOMAIN
          name: Domain
          description: The domain you want to bind to Clipable.
    tags:
        - Media
        - Video
        - Entertainment
    readme: |-
        # Clipable

        [Clipable](https://github.com/clipable/clipable) is a simple, self-hosted video sharing platform that provides an easy and efficient way for individuals and organizations to host, share, and manage their video content. Inspired by Streamable and YouTube, Clipable offers a clean and intuitive user interface.

        ## Features

        - Responsive, in-browser upload
        - Configurable video quality profiles
        - S3 compatible video storage (MinIO)
        - User accounts
        - Fuzzy video searching
        - FFmpeg based encoding accepts all well known video formats
        - Well-documented and accessible REST API

        ## Configuration

        All environment variables are documented in the [Clipable Wiki](https://github.com/clipable/clipable/wiki/Environment-Variables). Key settings include:

        - `MAX_UPLOAD_SIZE` — Maximum video upload size (default: 5GB)
        - `FFMPEG_PRESET` — Compression speed/efficiency balance (default: medium)
        - `FFMPEG_CONCURRENCY` — Number of concurrent FFmpeg processes (default: 1)
        - `ALLOW_REGISTRATION` — Whether new users can register (default: true)
    services:
        - name: PostgreSQL
          icon: https://raw.githubusercontent.com/zeabur/service-icons/main/marketplace/postgresql.svg
          template: PREBUILT
          spec:
            id: postgresql
            source:
                image: postgres:14
            ports:
                - id: database
                  port: 5432
                  type: TCP
            volumes:
                - id: data
                  dir: /var/lib/postgresql/data
            instructions:
                - title: Connection String
                  content: postgres://${POSTGRES_USERNAME}:${POSTGRES_PASSWORD}@${PORT_FORWARDED_HOSTNAME}:${DATABASE_PORT_FORWARDED_PORT}/${POSTGRES_DATABASE}
                - title: PostgreSQL Connect Command
                  content: psql "postgres://${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: postgres://${POSTGRES_USERNAME}:${POSTGRES_PASSWORD}@${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DATABASE}
                    expose: true
                POSTGRES_DATABASE:
                    default: ${POSTGRES_DB}
                    expose: true
                POSTGRES_DB:
                    default: clipable
                POSTGRES_HOST:
                    default: ${CONTAINER_HOSTNAME}
                    expose: true
                POSTGRES_HOST_AUTH_METHOD:
                    default: trust
                POSTGRES_PASSWORD:
                    default: ${PASSWORD}
                    expose: true
                POSTGRES_PORT:
                    default: "5432"
                    expose: true
                POSTGRES_URI:
                    default: ${POSTGRES_CONNECTION_STRING}
                    expose: true
                POSTGRES_USER:
                    default: clipable
                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
            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: minio/minio:latest
                command:
                    - /bin/sh
                args:
                    - -c
                    - |
                      minio server /data --console-address :9001 &
                      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 clipable http://localhost:9000 $MINIO_ROOT_USER $MINIO_ROOT_PASSWORD
                      echo "Creating bucket 'clips'"
                      mc mb clipable/clips
                      wait $MINIO_PID
            ports:
                - id: web
                  port: 9000
                  type: HTTP
                - id: console
                  port: 9001
                  type: HTTP
            volumes:
                - id: data
                  dir: /data
            instructions:
                - title: MinIO Username
                  content: ${MINIO_USERNAME}
                - title: MinIO Password
                  content: ${MINIO_PASSWORD}
            env:
                MINIO_HOST:
                    default: ${CONTAINER_HOSTNAME}
                    expose: true
                MINIO_PASSWORD:
                    default: ${MINIO_ROOT_PASSWORD}
                    expose: true
                MINIO_PORT:
                    default: "9000"
                    expose: true
                MINIO_ROOT_PASSWORD:
                    default: ${PASSWORD}
                MINIO_ROOT_USER:
                    default: minio
                MINIO_USERNAME:
                    default: ${MINIO_ROOT_USER}
                    expose: true
            healthCheck:
                type: TCP
                port: web
        - name: Clipable
          icon: https://raw.githubusercontent.com/clipable/clipable/4c85ea55055ca9b573a1c94c5115de1410b4647a/.assets/logo.svg
          dependencies:
            - PostgreSQL
            - MinIO
          template: PREBUILT
          spec:
            id: clipable
            source:
                image: ghcr.io/clipable/clipable:latest
            ports:
                - id: web
                  port: 80
                  type: HTTP
            env:
                ALLOW_REGISTRATION:
                    default: "true"
                COOKIE_KEY:
                    default: ${PASSWORD}
                DB_HOST:
                    default: ${POSTGRES_HOST}
                DB_IDHASHKEY:
                    default: ${PASSWORD}
                DB_NAME:
                    default: ${POSTGRES_DATABASE}
                DB_PASSWORD:
                    default: ${POSTGRES_PASSWORD}
                DB_PORT:
                    default: ${POSTGRES_PORT}
                DB_USER:
                    default: ${POSTGRES_USERNAME}
                FFMPEG_CONCURRENCY:
                    default: "1"
                FFMPEG_PRESET:
                    default: veryfast
                FFMPEG_THREADS:
                    default: "1"
                FFMPEG_TUNE:
                    default: film
                MAX_UPLOAD_SIZE:
                    default: 5GB
                S3_ACCESS:
                    default: ${MINIO_USERNAME}
                S3_ADDRESS:
                    default: ${MINIO_HOST}:${MINIO_PORT}
                S3_BUCKET:
                    default: clips
                S3_SECRET:
                    default: ${MINIO_PASSWORD}
                S3_SECURE:
                    default: "false"
          domainKey: PUBLIC_DOMAIN
localization:
    zh-CN:
        description: 简单的自托管视频分享平台。
        variables:
            - key: PUBLIC_DOMAIN
              type: DOMAIN
              name: 域名
              description: 你想要绑定 Clipable 的域名。
        readme: |-
            # Clipable

            [Clipable](https://github.com/clipable/clipable) 是一个简单的自托管视频分享平台，为个人和组织提供轻松高效的方式来托管、分享和管理视频内容。灵感来自 Streamable 和 YouTube，Clipable 提供简洁直观的用户界面。

            ## 功能特色

            - 响应式浏览器内上传
            - 可配置的视频质量配置文件
            - S3 兼容的视频存储（MinIO）
            - 用户账号管理
            - 模糊视频搜索
            - FFmpeg 编码支持所有常见视频格式
            - 完整文档化的 REST API

            ## 配置

            所有环境变量均记载于 [Clipable Wiki](https://github.com/clipable/clipable/wiki/Environment-Variables)。主要设置包括：

            - `MAX_UPLOAD_SIZE` — 最大视频上传大小（默认：5GB）
            - `FFMPEG_PRESET` — 压缩速度/效率平衡（默认：medium）
            - `FFMPEG_CONCURRENCY` — 同时运行的 FFmpeg 进程数量（默认：1）
            - `ALLOW_REGISTRATION` — 是否允许新用户注册（默认：true）
    zh-TW:
        description: 簡單的自架影片分享平台。
        variables:
            - key: PUBLIC_DOMAIN
              type: DOMAIN
              name: 網域
              description: 你想要綁定 Clipable 的網域。
        readme: |-
            # Clipable

            [Clipable](https://github.com/clipable/clipable) 是一個簡單的自架影片分享平台，為個人與組織提供輕鬆高效的方式來託管、分享和管理影片內容。靈感來自 Streamable 和 YouTube，Clipable 提供簡潔直覺的使用者介面。

            ## 功能特色

            - 響應式瀏覽器內上傳
            - 可設定的影片品質設定檔
            - S3 相容的影片儲存（MinIO）
            - 使用者帳號管理
            - 模糊影片搜尋
            - FFmpeg 編碼支援所有常見影片格式
            - 完整文件化的 REST API

            ## 設定

            所有環境變數皆記載於 [Clipable Wiki](https://github.com/clipable/clipable/wiki/Environment-Variables)。主要設定包含：

            - `MAX_UPLOAD_SIZE` — 最大影片上傳大小（預設：5GB）
            - `FFMPEG_PRESET` — 壓縮速度/效率平衡（預設：medium）
            - `FFMPEG_CONCURRENCY` — 同時執行的 FFmpeg 處理程序數量（預設：1）
            - `ALLOW_REGISTRATION` — 是否允許新使用者註冊（預設：true）
