# yaml-language-server: $schema=https://schema.zeabur.app/template.json
apiVersion: zeabur.com/v1
kind: Template
metadata:
    name: Orbit by Noveum
spec:
    description: Open-source task management with issues, projects, sprints, docs, files, realtime collaboration and an OAuth MCP endpoint.
    icon: https://raw.githubusercontent.com/Noveum/orbit/main/apps/web/public/logo.png
    variables:
        - key: PUBLIC_DOMAIN
          type: DOMAIN
          name: Orbit domain
          description: HTTPS domain for the Orbit app and its MCP endpoint.
        - key: STORAGE_DOMAIN
          type: DOMAIN
          name: File storage domain
          description: Separate HTTPS domain reachable by browsers for private file uploads.
    tags:
        - Productivity
        - Tool
    readme: |-
        # Orbit by Noveum

        Create your account and workspace after deployment. PostgreSQL, Redis and MinIO have persistent volumes. The web service applies database migrations automatically. The storage initializer creates a private bucket and configures the app CORS origin. Run one scheduler. Configure Resend and EMAIL_FROM for invitations and password recovery. Preserve generated secrets and back up PostgreSQL and MinIO before upgrades. Requires a server or eligible cluster.

        Hosted MCP: https://orbit.noveum.ai/mcp

        Self-hosted MCP: your Orbit HTTPS origin plus /mcp.

        Source and docs: https://github.com/Noveum/orbit
    services:
        - name: postgres
          template: PREBUILT
          spec:
            id: postgres
            source:
                image: postgres:18-alpine@sha256:9a8afca54e7861fd90fab5fdf4c42477a6b1cb7d293595148e674e0a3181de15
            ports:
                - id: main
                  port: 5432
                  type: TCP
            volumes:
                - id: postgres
                  dir: /var/lib/postgresql
            env:
                ORBIT_POSTGRES_PASSWORD:
                    default: ${PASSWORD}
                    expose: true
                POSTGRES_DB:
                    default: orbit
                POSTGRES_PASSWORD:
                    default: ${ORBIT_POSTGRES_PASSWORD}
                POSTGRES_USER:
                    default: orbit
            portForwarding:
                enabled: false
        - name: redis
          template: PREBUILT
          spec:
            id: redis
            source:
                image: redis:8-alpine@sha256:978f0e01593e65eed801f2402944efcd936d43b5027e4908a7897baf88ed6241
                command:
                    - redis-server
                    - --appendonly
                    - "yes"
            ports:
                - id: main
                  port: 6379
                  type: TCP
            volumes:
                - id: redis
                  dir: /data
            env: {}
            portForwarding:
                enabled: false
        - name: storage
          template: PREBUILT
          spec:
            id: storage
            source:
                image: quay.io/minio/minio@sha256:14cea493d9a34af32f524e538b8346cf79f3321eff8e708c1e2960462bd8936e
                command:
                    - minio
                    - server
                    - /data
            ports:
                - id: main
                  port: 9000
                  type: HTTP
            volumes:
                - id: storage
                  dir: /data
            env:
                MINIO_API_CORS_ALLOW_ORIGIN:
                    default: https://${PUBLIC_DOMAIN}
                MINIO_ROOT_PASSWORD:
                    default: ${ORBIT_MINIO_PASSWORD}
                MINIO_ROOT_USER:
                    default: orbit
                ORBIT_MINIO_PASSWORD:
                    default: ${PASSWORD}
                    expose: true
            portForwarding:
                enabled: false
          domainKey: STORAGE_DOMAIN
        - name: bucket
          dependencies:
            - storage
          template: PREBUILT
          spec:
            id: bucket
            source:
                image: ghcr.io/noveum/orbit-bucket:sha-e219d286638b9479e7946979b4383ea4e99c5bd6
            env:
                MINIO_PASSWORD:
                    default: ${ORBIT_MINIO_PASSWORD}
                ORBIT_APP_URL:
                    default: https://${PUBLIC_DOMAIN}
                ORBIT_CRON_SECRET:
                    default: ${PASSWORD}
                    expose: true
                ORBIT_STORAGE_UPSTREAM:
                    default: storage.zeabur.internal:9000
            portForwarding:
                enabled: false
        - name: web
          dependencies:
            - postgres
            - redis
            - bucket
          template: PREBUILT
          spec:
            id: web
            source:
                image: ghcr.io/noveum/orbit-runtime:sha-7da6cdb83550c4e597800b2788c4ce534d1af669
            ports:
                - id: main
                  port: 3000
                  type: TCP
            env:
                ALLOWED_EMAIL_DOMAINS:
                    default: ""
                BETTER_AUTH_SECRET:
                    default: ${ORBIT_AUTH_SECRET}
                BETTER_AUTH_URL:
                    default: https://${PUBLIC_DOMAIN}
                CRON_SECRET:
                    default: ${ORBIT_CRON_SECRET}
                DATABASE_PREPARED_STATEMENTS:
                    default: "true"
                DATABASE_URL:
                    default: postgres://orbit:${ORBIT_POSTGRES_PASSWORD}@postgres.zeabur.internal:5432/orbit
                DIRECT_URL:
                    default: postgres://orbit:${ORBIT_POSTGRES_PASSWORD}@postgres.zeabur.internal:5432/orbit
                EMAIL_FROM:
                    default: Orbit <auth@orbit.local>
                GITHUB_APP_CLIENT_ID:
                    default: ""
                GITHUB_APP_CLIENT_SECRET:
                    default: ""
                GITHUB_APP_ID:
                    default: ""
                GITHUB_APP_PRIVATE_KEY:
                    default: ""
                GITHUB_APP_SLUG:
                    default: ""
                GITHUB_CLIENT_ID:
                    default: ""
                GITHUB_CLIENT_SECRET:
                    default: ""
                GITHUB_WEBHOOK_SECRET:
                    default: ""
                GOOGLE_CLIENT_ID:
                    default: ""
                GOOGLE_CLIENT_SECRET:
                    default: ""
                NEXT_PUBLIC_APP_URL:
                    default: https://${PUBLIC_DOMAIN}
                NEXT_TELEMETRY_DISABLED:
                    default: "1"
                ORBIT_AUTH_SECRET:
                    default: ${PASSWORD}
                    expose: true
                ORBIT_PASSWORD_AUTH:
                    default: "true"
                ORBIT_SELF_HOSTED:
                    default: "true"
                REDIS_URL:
                    default: redis://redis.zeabur.internal:6379
                RESEND_API_KEY:
                    default: ""
                S3_ACCESS_KEY_ID:
                    default: orbit
                S3_BUCKET:
                    default: orbit-uploads
                S3_ENDPOINT:
                    default: https://${STORAGE_DOMAIN}
                S3_REGION:
                    default: us-east-1
                S3_SECRET_ACCESS_KEY:
                    default: ${ORBIT_MINIO_PASSWORD}
                SLACK_APP_ID:
                    default: ""
                SLACK_CLIENT_ID:
                    default: ""
                SLACK_CLIENT_SECRET:
                    default: ""
                SLACK_ENABLED:
                    default: "false"
                SLACK_SIGNING_SECRET:
                    default: ""
            portForwarding:
                enabled: false
        - name: realtime
          dependencies:
            - web
            - bucket
          template: PREBUILT
          spec:
            id: realtime
            source:
                image: ghcr.io/noveum/orbit-runtime:sha-7da6cdb83550c4e597800b2788c4ce534d1af669
                command:
                    - node
                    - apps/web/realtime.mjs
            ports:
                - id: main
                  port: 3100
                  type: TCP
            env:
                ALLOWED_EMAIL_DOMAINS:
                    default: ""
                BETTER_AUTH_SECRET:
                    default: ${ORBIT_AUTH_SECRET}
                BETTER_AUTH_URL:
                    default: https://${PUBLIC_DOMAIN}
                CRON_SECRET:
                    default: ${ORBIT_CRON_SECRET}
                DATABASE_PREPARED_STATEMENTS:
                    default: "true"
                DATABASE_URL:
                    default: postgres://orbit:${ORBIT_POSTGRES_PASSWORD}@postgres.zeabur.internal:5432/orbit
                DIRECT_URL:
                    default: postgres://orbit:${ORBIT_POSTGRES_PASSWORD}@postgres.zeabur.internal:5432/orbit
                EMAIL_FROM:
                    default: Orbit <auth@orbit.local>
                GITHUB_APP_CLIENT_ID:
                    default: ""
                GITHUB_APP_CLIENT_SECRET:
                    default: ""
                GITHUB_APP_ID:
                    default: ""
                GITHUB_APP_PRIVATE_KEY:
                    default: ""
                GITHUB_APP_SLUG:
                    default: ""
                GITHUB_CLIENT_ID:
                    default: ""
                GITHUB_CLIENT_SECRET:
                    default: ""
                GITHUB_WEBHOOK_SECRET:
                    default: ""
                GOOGLE_CLIENT_ID:
                    default: ""
                GOOGLE_CLIENT_SECRET:
                    default: ""
                NEXT_PUBLIC_APP_URL:
                    default: https://${PUBLIC_DOMAIN}
                NEXT_TELEMETRY_DISABLED:
                    default: "1"
                ORBIT_PASSWORD_AUTH:
                    default: "true"
                ORBIT_SELF_HOSTED:
                    default: "true"
                REDIS_URL:
                    default: redis://redis.zeabur.internal:6379
                RESEND_API_KEY:
                    default: ""
                S3_ACCESS_KEY_ID:
                    default: orbit
                S3_BUCKET:
                    default: orbit-uploads
                S3_ENDPOINT:
                    default: https://${STORAGE_DOMAIN}
                S3_REGION:
                    default: us-east-1
                S3_SECRET_ACCESS_KEY:
                    default: ${ORBIT_MINIO_PASSWORD}
                SLACK_APP_ID:
                    default: ""
                SLACK_CLIENT_ID:
                    default: ""
                SLACK_CLIENT_SECRET:
                    default: ""
                SLACK_ENABLED:
                    default: "false"
                SLACK_SIGNING_SECRET:
                    default: ""
            portForwarding:
                enabled: false
        - name: scheduler
          dependencies:
            - web
          template: PREBUILT
          spec:
            id: scheduler
            source:
                image: ghcr.io/noveum/orbit-runtime:sha-7da6cdb83550c4e597800b2788c4ce534d1af669
                command:
                    - node
                    - apps/web/scheduler.mjs
            env:
                CRON_SECRET:
                    default: ${ORBIT_CRON_SECRET}
                ORBIT_INTERNAL_URL:
                    default: http://web.zeabur.internal:3000
            portForwarding:
                enabled: false
        - name: orbit
          dependencies:
            - web
            - realtime
            - scheduler
          template: PREBUILT
          spec:
            id: orbit
            source:
                image: ghcr.io/noveum/orbit-gateway:sha-7da6cdb83550c4e597800b2788c4ce534d1af669
            ports:
                - id: main
                  port: 3000
                  type: HTTP
            env:
                ORBIT_REALTIME_UPSTREAM:
                    default: realtime.zeabur.internal:3100
                ORBIT_TRUSTED_PROXIES:
                    default: private_ranges
                ORBIT_WEB_UPSTREAM:
                    default: web.zeabur.internal:3000
            portForwarding:
                enabled: false
          domainKey: PUBLIC_DOMAIN
