# yaml-language-server: $schema=https://schema.zeabur.app/template.json
apiVersion: zeabur.com/v1
kind: Template
metadata:
    name: Odysseus
spec:
    description: Self-hosted AI research assistant with SearXNG search, ChromaDB vector store, and ntfy push notifications.
    icon: https://raw.githubusercontent.com/pewdiepie-archdaemon/odysseus/dev/static/favicon.ico
    variables:
        - key: PUBLIC_DOMAIN
          type: DOMAIN
          name: Domain
          description: Domain to expose the Odysseus web UI on.
    tags:
        - AI
        - LLM
        - Search
    readme: |
        # Odysseus

        Self-hosted AI research assistant. This template deploys four services:

        - **odysseus** — the web app (built from the repo Dockerfile, served on port 7000)
        - **searxng** — private metasearch backend
        - **chromadb** — vector database
        - **ntfy** — push-notification server

        After deploy, sign in with user `admin` and the generated password shown in
        the deployment instructions. Add LLM provider keys (OpenAI, Ollama, etc.) in
        the **odysseus** service environment variables.
    services:
        - name: odysseus
          icon: https://raw.githubusercontent.com/pewdiepie-archdaemon/odysseus/dev/static/favicon.ico
          dependencies:
            - searxng
            - chromadb
          template: PREBUILT
          spec:
            id: odysseus
            source:
                image: ghcr.io/pewdiepie-archdaemon/odysseus:latest
            ports:
                - id: web
                  port: 7000
                  type: HTTP
            volumes:
                - id: data
                  dir: /app/data
                - id: logs
                  dir: /app/logs
                - id: ssh
                  dir: /app/.ssh
                - id: hf-cache
                  dir: /app/.cache/huggingface
                - id: local
                  dir: /app/.local
            env:
                ALLOWED_ORIGINS:
                    default: https://${PUBLIC_DOMAIN}
                AUTH_ENABLED:
                    default: "true"
                CHROMADB_HOST:
                    default: chromadb.zeabur.internal
                CHROMADB_PORT:
                    default: "8000"
                CLEANUP_INTERVAL_HOURS:
                    default: "24"
                DATA_BRAVE_API_KEY:
                    default: ""
                DATABASE_URL:
                    default: sqlite:///./data/app.db
                EMBEDDING_API_KEY:
                    default: ""
                EMBEDDING_MODEL:
                    default: ""
                EMBEDDING_URL:
                    default: ""
                FASTEMBED_CACHE_PATH:
                    default: ""
                FASTEMBED_MODEL:
                    default: sentence-transformers/all-MiniLM-L6-v2
                GOOGLE_API_KEY:
                    default: ""
                GOOGLE_PSE_CX:
                    default: ""
                HF_TOKEN:
                    default: ""
                HUGGING_FACE_HUB_TOKEN:
                    default: ""
                LLM_HOST:
                    default: localhost
                LLM_HOSTS:
                    default: ""
                LOCALHOST_BYPASS:
                    default: "false"
                ODYSSEUS_ADMIN_PASSWORD:
                    default: ${PASSWORD}
                    expose: true
                ODYSSEUS_ADMIN_USER:
                    default: admin
                ODYSSEUS_CHAT_UPLOAD_MAX_BYTES:
                    default: "10485760"
                ODYSSEUS_INPROCESS_POLLERS:
                    default: "1"
                ODYSSEUS_INPROCESS_TASKS:
                    default: "1"
                ODYSSEUS_SCRIPT_HOST:
                    default: localhost
                OLLAMA_BASE_URL:
                    default: ""
                OPENAI_API_KEY:
                    default: ""
                PGID:
                    default: "1000"
                PUID:
                    default: "1000"
                RESEARCH_LLM_ENDPOINT:
                    default: ""
                SEARXNG_INSTANCE:
                    default: http://searxng.zeabur.internal:8080
                SECURE_COOKIES:
                    default: "true"
                SERPER_API_KEY:
                    default: ""
                TAVILY_API_KEY:
                    default: ""
          domainKey: PUBLIC_DOMAIN
        - name: chromadb
          icon: https://www.trychroma.com/favicon.ico
          template: PREBUILT
          spec:
            id: chromadb
            source:
                image: docker.io/chromadb/chroma:latest
            ports:
                - id: api
                  port: 8000
                  type: TCP
            volumes:
                - id: chromadb-data
                  dir: /chroma/chroma
            env:
                ANONYMIZED_TELEMETRY:
                    default: "FALSE"
        - name: searxng
          icon: https://raw.githubusercontent.com/searxng/searxng/master/src/brand/searxng-wordmark.svg
          template: PREBUILT
          spec:
            id: searxng
            source:
                image: docker.io/searxng/searxng:2026.5.31-7159b8aed
            ports:
                - id: web
                  port: 8080
                  type: TCP
            env:
                SEARXNG_BASE_URL:
                    default: http://searxng.zeabur.internal:8080/
                SEARXNG_SECRET:
                    default: ${PASSWORD}
            configs:
                - path: /etc/searxng/settings.yml
                  template: |
                    use_default_settings: true

                    server:
                      secret_key: "${SEARXNG_SECRET}"

                    search:
                      formats:
                        - html
                        - json
                  permission: 420
                  envsubst: true
        - name: ntfy
          icon: https://raw.githubusercontent.com/binwiederhier/ntfy/main/web/public/static/images/pwa-512x512.png
          template: PREBUILT
          spec:
            id: ntfy
            source:
                image: docker.io/binwiederhier/ntfy
                command:
                    - ntfy
                args:
                    - serve
            ports:
                - id: http
                  port: 80
                  type: TCP
            volumes:
                - id: ntfy-cache
                  dir: /var/cache/ntfy
            env:
                NTFY_BASE_URL:
                    default: http://ntfy.zeabur.internal
