# yaml-language-server: $schema=https://schema.zeabur.app/template.json
apiVersion: zeabur.com/v1
kind: Template
metadata:
    name: AI-Finance-Management
spec:
    description: |
        Taiwan SME Agent-First finance platform. FastAPI + React + PostgreSQL.
        LINE/Telegram agent interface, Web Dashboard for management.
    variables:
        - key: PUBLIC_DOMAIN
          type: DOMAIN
          name: Client Domain
          description: The domain for the web dashboard.
        - key: API_DOMAIN
          type: DOMAIN
          name: API Domain
          description: The domain for the API server.
        - key: GCR_JSON_KEY
          type: STRING
          name: GCR Service Account Key
          description: GCP service account JSON key for pulling images from Artifact Registry.
    tags:
        - Tool
        - SaaS
        - Finance
        - Taiwan
    readme: |-
        # AI Finance Management

        Taiwan SME Agent-First finance platform.
        Inventory + Invoice + CRM + Procurement + E-Signature + Dual Payment (ECPay/Stripe).

        ## Services

        - **Server**: FastAPI + PostgreSQL (auto-runs migrations on startup)
        - **Client**: React SPA served via Nginx
        - **PostgreSQL**: Database

        ## Post-Deploy

        1. Set `SECRET_KEY` and `REFRESH_SECRET_KEY` to random 64-char hex strings
        2. Set `ALLOWED_ORIGINS_STR` to your client domain
        3. Set `VITE_API_URL` on the client service to your API domain
        4. Configure LINE / Telegram / ECPay / Stripe credentials as needed
    services:
        - name: postgresql
          icon: https://raw.githubusercontent.com/zeabur/service-icons/main/marketplace/postgresql.svg
          template: PREBUILT
          spec:
            source:
                image: postgres:16-alpine
            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}
            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: ai_finance_management
                POSTGRES_HOST:
                    default: ${CONTAINER_HOSTNAME}
                    expose: true
                POSTGRES_PASSWORD:
                    default: ${PASSWORD}
                    expose: true
                POSTGRES_PORT:
                    default: ${DATABASE_PORT}
                    expose: true
                POSTGRES_USER:
                    default: saas_user
                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 = 'Asia/Taipei'
                    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: server
          icon: https://service-icons.zeabur.com/git/python/fastapi.svg
          dependencies:
            - postgresql
          template: PREBUILT
          spec:
            source:
                image: asia-east1-docker.pkg.dev/common-411213/dev-app/finance-mgr-server:dev
            ports:
                - id: web
                  port: 8080
                  type: HTTP
            env:
                ACCESS_TOKEN_EXPIRE_MINUTES:
                    default: "15"
                AI_PARSER_MODEL:
                    default: claude-sonnet-4-20250514
                ALGORITHM:
                    default: HS256
                ALLOWED_ORIGINS_STR:
                    default: https://${PUBLIC_DOMAIN}
                ANTHROPIC_API_KEY:
                    default: ""
                CHRONOS_API_URL:
                    default: ""
                CHRONOS_SHARED_SECRET:
                    default: ""
                COMPANY_TAX_ID:
                    default: ""
                DATABASE_URL:
                    default: postgresql+asyncpg://${POSTGRES_USERNAME}:${POSTGRES_PASSWORD}@${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DATABASE}
                DB_POOL_MAX_OVERFLOW:
                    default: "10"
                DB_POOL_SIZE:
                    default: "20"
                DEBUG:
                    default: "false"
                ECPAY_ENV:
                    default: staging
                ECPAY_HASH_IV:
                    default: ""
                ECPAY_HASH_KEY:
                    default: ""
                ECPAY_INVOICE_HASH_IV:
                    default: ""
                ECPAY_INVOICE_HASH_KEY:
                    default: ""
                ECPAY_INVOICE_MERCHANT_ID:
                    default: ""
                ECPAY_MERCHANT_ID:
                    default: ""
                EINVOICE_PROVIDER:
                    default: mock
                EMAIL_FROM:
                    default: noreply@ai-finance.app
                EMAIL_PROVIDER:
                    default: console
                ENVIRONMENT:
                    default: production
                    expose: true
                FRONTEND_URL:
                    default: https://${PUBLIC_DOMAIN}
                JOB_QUEUE_MODE:
                    default: auto
                LINE_CHANNEL_ACCESS_TOKEN:
                    default: ""
                LINE_CHANNEL_ID:
                    default: ""
                LINE_CHANNEL_SECRET:
                    default: ""
                LINE_LOGIN_CHANNEL_ID:
                    default: ""
                LINE_LOGIN_CHANNEL_SECRET:
                    default: ""
                LINE_NOTIFY_CLIENT_ID:
                    default: ""
                LINE_NOTIFY_CLIENT_SECRET:
                    default: ""
                LINE_NOTIFY_REDIRECT_URI:
                    default: ""
                LOG_FORMAT:
                    default: json
                OPENCLAW_API_KEY:
                    default: ""
                OPENCLAW_GATEWAY_URL:
                    default: https://gateway.openclaw.ai
                PORT:
                    default: "8080"
                    expose: true
                RATE_LIMIT_AUTH:
                    default: 5/minute
                RATE_LIMIT_GENERAL:
                    default: 200/minute
                RATE_LIMIT_PUBLIC:
                    default: 10/minute
                RATE_LIMIT_WEBHOOK:
                    default: 30/minute
                REDIS_URL:
                    default: ""
                REFRESH_SECRET_KEY:
                    default: ${PASSWORD}_refresh
                REFRESH_TOKEN_EXPIRE_DAYS:
                    default: "30"
                S3_ACCESS_KEY:
                    default: ""
                S3_BUCKET:
                    default: ""
                S3_ENDPOINT_URL:
                    default: ""
                S3_REGION:
                    default: auto
                S3_SECRET_KEY:
                    default: ""
                SECRET_KEY:
                    default: ${PASSWORD}
                SENTRY_DSN:
                    default: ""
                STRIPE_ENV:
                    default: test
                STRIPE_PUBLISHABLE_KEY:
                    default: ""
                STRIPE_SECRET_KEY:
                    default: ""
                STRIPE_WEBHOOK_SECRET:
                    default: ""
                TELEGRAM_BOT_TOKEN:
                    default: ""
                TELEGRAM_SECRET_TOKEN:
                    default: ""
                ZEABUR_EMAIL_API_KEY:
                    default: ""
            healthCheck:
                type: HTTP
                port: web
                http:
                    path: /health
          domainKey: API_DOMAIN
        - name: client
          icon: https://raw.githubusercontent.com/zeabur/service-icons/refs/heads/main/git/nodejs/vite.svg
          dependencies:
            - server
          template: PREBUILT
          spec:
            source:
                image: asia-east1-docker.pkg.dev/common-411213/dev-app/finance-mgr-client:dev
            ports:
                - id: web
                  port: 3000
                  type: HTTP
            env:
                VITE_API_URL:
                    default: https://${API_DOMAIN}
            healthCheck:
                type: HTTP
                port: web
                http:
                    path: /
          domainKey: PUBLIC_DOMAIN
