# yaml-language-server: $schema=https://schema.zeabur.app/template.json
apiVersion: zeabur.com/v1
kind: Template
metadata:
    name: Zammad - Updated Stable Version - 6.5.1-13
spec:
    description: Zammad is a web-based, open source user support/ticketing solution.
    coverImage: https://zammad.org/media/pages/screenshots/3ab0b9cf69-1701860226/dashboard-2048x-q75.png
    icon: https://docs.zammad.org/en/latest/_static/zammad_logo_70x61@2x.png
    variables:
        - key: PUBLIC_DOMAIN
          type: DOMAIN
          name: Domain
          description: What is the domain you want for your Zammad?
    tags:
        - Tool
        - CRM
        - Support
    readme: |
        # Zammad - Web based open source helpdesk/customer support system

        Zammad is a web-based, open source user support/ticketing solution with many features to manage customer communication via several channels like telephone, facebook, twitter, chat and emails.

        ## Features

        - **Multi-channel support**: Handle tickets from email, phone, chat, Twitter, Facebook, and more
        - **Knowledge base**: Create and manage a self-service knowledge base
        - **Reporting & Analytics**: Comprehensive reporting and analytics
        - **Automation**: Powerful automation and workflow capabilities
        - **Mobile ready**: Responsive design works on all devices
        - **Multi-language**: Available in multiple languages

        ## Usage

        After deployment, you can access Zammad through the provided domain. The system will guide you through the initial setup process.

        ## Default Configuration

        - PostgreSQL database for data storage
        - Redis for session storage and background jobs
        - Memcached for caching
        - Elasticsearch for advanced search capabilities
        - Automatic backups configured

        ## Services

        This Zammad instance includes:
        - **Web Interface** (Nginx) - Main web interface
        - **Application Server** (Rails) - Core application logic
        - **WebSocket Server** - Real-time communication
        - **Scheduler** - Background job processing
        - **Database** (PostgreSQL) - Data storage
        - **Cache** (Redis + Memcached) - Performance optimization
        - **Search** (Elasticsearch) - Advanced search functionality
        - **Backup Service** - Automated backup system

        ## Important Notes

        - The system requires an initial setup wizard to be completed
        - All services are automatically configured and connected
        - Elasticsearch provides advanced search capabilities but can be resource intensive
        - Regular backups are automatically configured

        ## Configuration

        Most configuration is handled automatically, but you can customize:
        - Time zone settings
        - Email configuration (SMTP)
        - External authentication providers
        - Advanced Elasticsearch settings

        For more information, visit the [official Zammad documentation](https://docs.zammad.org/).
    services:
        - name: zammad-nginx
          icon: https://docs.zammad.org/en/latest/_static/zammad_logo_70x61@2x.png
          template: PREBUILT
          spec:
            source:
                image: ghcr.io/zammad/zammad:6.5.1-13
                args:
                    - zammad-nginx
            ports:
                - id: web
                  port: 8080
                  type: HTTP
            env:
                ELASTICSEARCH_ENABLED:
                    default: "true"
                ELASTICSEARCH_HOST:
                    default: zammad-elasticsearch
                ELASTICSEARCH_NAMESPACE:
                    default: zammad
                ELASTICSEARCH_PASS:
                    default: ${ELASTICSEARCH_PASSWORD}
                ELASTICSEARCH_PORT:
                    default: "9200"
                ELASTICSEARCH_USER:
                    default: elastic
                MEMCACHE_SERVERS:
                    default: zammad-memcached:11211
                NGINX_CLIENT_MAX_BODY_SIZE:
                    default: 50M
                NGINX_PORT:
                    default: "8080"
                NGINX_SERVER_NAME:
                    default: _
                NGINX_SERVER_SCHEME:
                    default: http
                POSTGRESQL_DB:
                    default: ${POSTGRES_DATABASE}
                POSTGRESQL_HOST:
                    default: zammad-postgresql
                POSTGRESQL_OPTIONS:
                    default: ?pool=50
                POSTGRESQL_PASS:
                    default: ${POSTGRES_PASSWORD}
                POSTGRESQL_PORT:
                    default: "5432"
                POSTGRESQL_USER:
                    default: ${POSTGRES_USERNAME}
                REDIS_URL:
                    default: redis://zammad-redis:6379
                TZ:
                    default: UTC
                ZAMMAD_RAILSSERVER_HOST:
                    default: zammad-railsserver
                ZAMMAD_RAILSSERVER_PORT:
                    default: "3000"
                ZAMMAD_WEBSOCKET_HOST:
                    default: zammad-websocket
                ZAMMAD_WEBSOCKET_PORT:
                    default: "6042"
          domainKey: PUBLIC_DOMAIN
        - name: zammad-railsserver
          icon: https://docs.zammad.org/en/latest/_static/zammad_logo_70x61@2x.png
          template: PREBUILT
          spec:
            source:
                image: ghcr.io/zammad/zammad:6.5.1-13
                args:
                    - zammad-railsserver
            ports:
                - id: web
                  port: 3000
                  type: HTTP
            volumes:
                - id: storage
                  dir: /opt/zammad/storage
            env:
                ELASTICSEARCH_ENABLED:
                    default: "true"
                ELASTICSEARCH_HOST:
                    default: zammad-elasticsearch
                ELASTICSEARCH_NAMESPACE:
                    default: zammad
                ELASTICSEARCH_PASS:
                    default: ${ELASTICSEARCH_PASSWORD}
                ELASTICSEARCH_PORT:
                    default: "9200"
                ELASTICSEARCH_USER:
                    default: elastic
                MEMCACHE_SERVERS:
                    default: zammad-memcached:11211
                POSTGRESQL_DB:
                    default: ${POSTGRES_DATABASE}
                POSTGRESQL_HOST:
                    default: zammad-postgresql
                POSTGRESQL_OPTIONS:
                    default: ?pool=50
                POSTGRESQL_PASS:
                    default: ${POSTGRES_PASSWORD}
                POSTGRESQL_PORT:
                    default: "5432"
                POSTGRESQL_USER:
                    default: ${POSTGRES_USERNAME}
                REDIS_URL:
                    default: redis://zammad-redis:6379
                TZ:
                    default: UTC
        - name: zammad-websocket
          icon: https://docs.zammad.org/en/latest/_static/zammad_logo_70x61@2x.png
          template: PREBUILT
          spec:
            source:
                image: ghcr.io/zammad/zammad:6.5.1-13
                args:
                    - zammad-websocket
            ports:
                - id: web
                  port: 6042
                  type: HTTP
            volumes:
                - id: storage
                  dir: /opt/zammad/storage
            env:
                MEMCACHE_SERVERS:
                    default: zammad-memcached:11211
                POSTGRESQL_DB:
                    default: ${POSTGRES_DATABASE}
                POSTGRESQL_HOST:
                    default: zammad-postgresql
                POSTGRESQL_OPTIONS:
                    default: ?pool=50
                POSTGRESQL_PASS:
                    default: ${POSTGRES_PASSWORD}
                POSTGRESQL_PORT:
                    default: "5432"
                POSTGRESQL_USER:
                    default: ${POSTGRES_USERNAME}
                REDIS_URL:
                    default: redis://zammad-redis:6379
                TZ:
                    default: UTC
        - name: zammad-scheduler
          icon: https://docs.zammad.org/en/latest/_static/zammad_logo_70x61@2x.png
          template: PREBUILT
          spec:
            source:
                image: ghcr.io/zammad/zammad:6.5.1-13
                args:
                    - zammad-scheduler
            volumes:
                - id: storage
                  dir: /opt/zammad/storage
            env:
                ELASTICSEARCH_ENABLED:
                    default: "true"
                ELASTICSEARCH_HOST:
                    default: zammad-elasticsearch
                ELASTICSEARCH_NAMESPACE:
                    default: zammad
                ELASTICSEARCH_PASS:
                    default: ${ELASTICSEARCH_PASSWORD}
                ELASTICSEARCH_PORT:
                    default: "9200"
                ELASTICSEARCH_USER:
                    default: elastic
                MEMCACHE_SERVERS:
                    default: zammad-memcached:11211
                POSTGRESQL_DB:
                    default: ${POSTGRES_DATABASE}
                POSTGRESQL_HOST:
                    default: zammad-postgresql
                POSTGRESQL_OPTIONS:
                    default: ?pool=50
                POSTGRESQL_PASS:
                    default: ${POSTGRES_PASSWORD}
                POSTGRESQL_PORT:
                    default: "5432"
                POSTGRESQL_USER:
                    default: ${POSTGRES_USERNAME}
                REDIS_URL:
                    default: redis://zammad-redis:6379
                TZ:
                    default: UTC
        - name: zammad-init
          icon: https://docs.zammad.org/en/latest/_static/zammad_logo_70x61@2x.png
          template: PREBUILT
          spec:
            source:
                image: ghcr.io/zammad/zammad:6.5.1-13
                args:
                    - zammad-init
            volumes:
                - id: storage
                  dir: /opt/zammad/storage
            env:
                ELASTICSEARCH_NAMESPACE:
                    default: zammad
                ELASTICSEARCH_PASS:
                    default: ${ELASTICSEARCH_PASSWORD}
                ELASTICSEARCH_USER:
                    default: elastic
                MEMCACHE_SERVERS:
                    default: zammad-memcached:11211
                POSTGRESQL_DB:
                    default: ${POSTGRES_DATABASE}
                POSTGRESQL_HOST:
                    default: zammad-postgresql
                POSTGRESQL_OPTIONS:
                    default: ?pool=50
                POSTGRESQL_PASS:
                    default: ${POSTGRES_PASSWORD}
                POSTGRESQL_PORT:
                    default: "5432"
                POSTGRESQL_USER:
                    default: ${POSTGRES_USERNAME}
                RAILS_ENV:
                    default: production
                REDIS_URL:
                    default: redis://zammad-redis:6379
                RESTART_CONTAINER:
                    default: "false"
                TZ:
                    default: UTC
        - name: zammad-backup
          icon: https://docs.zammad.org/en/latest/_static/zammad_logo_70x61@2x.png
          template: PREBUILT
          spec:
            source:
                image: ghcr.io/zammad/zammad:6.5.1-13
                args:
                    - zammad-backup
            volumes:
                - id: backup
                  dir: /var/tmp/zammad
                - id: storage
                  dir: /opt/zammad/storage
            env:
                BACKUP_DIR:
                    default: /var/tmp/zammad
                BACKUP_TIME:
                    default: "03:00"
                HOLD_DAYS:
                    default: "10"
                MEMCACHE_SERVERS:
                    default: zammad-memcached:11211
                POSTGRESQL_DB:
                    default: ${POSTGRES_DATABASE}
                POSTGRESQL_HOST:
                    default: zammad-postgresql
                POSTGRESQL_OPTIONS:
                    default: ?pool=50
                POSTGRESQL_PASS:
                    default: ${POSTGRES_PASSWORD}
                POSTGRESQL_PORT:
                    default: "5432"
                POSTGRESQL_USER:
                    default: ${POSTGRES_USERNAME}
                REDIS_URL:
                    default: redis://zammad-redis:6379
                TZ:
                    default: UTC
        - name: zammad-postgresql
          icon: https://raw.githubusercontent.com/zeabur/service-icons/main/marketplace/postgresql.svg
          template: PREBUILT
          spec:
            source:
                image: postgres:16
                command:
                    - docker-entrypoint.sh
                    - -c
                    - config_file=/etc/postgresql/postgresql.conf
            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 Connect Command
                  content: psql "postgresql://${POSTGRES_USERNAME}:${POSTGRES_PASSWORD}@${PORT_FORWARDED_HOSTNAME}:${DATABASE_PORT_FORWARDED_PORT}/${POSTGRES_DATABASE}"
                - title: PostgreSQL username
                  content: ${POSTGRES_USERNAME}
                - title: PostgresSQL password
                  content: ${POSTGRES_PASSWORD}
                - title: PostgresSQL 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: postgresql://${POSTGRES_USERNAME}:${POSTGRES_PASSWORD}@${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DATABASE}
                    expose: true
                POSTGRES_DATABASE:
                    default: ${POSTGRES_DB}
                    expose: true
                POSTGRES_DB:
                    default: zammad_production
                POSTGRES_HOST:
                    default: ${CONTAINER_HOSTNAME}
                    expose: true
                POSTGRES_PASSWORD:
                    default: ${PASSWORD}
                    expose: true
                POSTGRES_PORT:
                    default: ${DATABASE_PORT}
                    expose: true
                POSTGRES_URI:
                    default: ${POSTGRES_CONNECTION_STRING}
                    expose: true
                POSTGRES_USER:
                    default: root
                POSTGRES_USERNAME:
                    default: ${POSTGRES_USER}
                    expose: true
            configs:
                - path: /etc/postgresql/postgresql.conf
                  template: |
                    # https://github.com/postgres/postgres/blob/master/src/backend/utils/misc/postgresql.conf.sample
                    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: zammad-redis
          icon: https://raw.githubusercontent.com/zeabur/service-icons/main/marketplace/redis.svg
          template: PREBUILT
          spec:
            source:
                image: redis/redis-stack-server:latest
            ports:
                - id: database
                  port: 6379
                  type: TCP
            volumes:
                - id: data
                  dir: /data
            instructions:
                - title: Command to connect to your Redis
                  content: redis-cli -h ${PORT_FORWARDED_HOSTNAME} -p ${DATABASE_PORT_FORWARDED_PORT}
                - title: Redis Connection String
                  content: redis://${PORT_FORWARDED_HOSTNAME}:${DATABASE_PORT_FORWARDED_PORT}
                - title: Redis host
                  content: ${PORT_FORWARDED_HOSTNAME}
                - title: Redis port
                  content: ${DATABASE_PORT_FORWARDED_PORT}
            env:
                REDIS_CONNECTION_STRING:
                    default: redis://${REDIS_HOST}:${REDIS_PORT}
                    expose: true
                REDIS_HOST:
                    default: ${CONTAINER_HOSTNAME}
                    expose: true
                REDIS_PORT:
                    default: ${DATABASE_PORT}
                    expose: true
                REDIS_URI:
                    default: ${REDIS_CONNECTION_STRING}
                    expose: true
            healthCheck:
                type: TCP
                port: database
        - name: zammad-memcached
          icon: https://www.logo.wine/a/logo/Memcached/Memcached-Logo.wine.svg
          template: PREBUILT
          spec:
            source:
                image: memcached:1.6.38-alpine
                command:
                    - memcached
                    - -m
                    - 256M
                    - -u
                    - root
            ports:
                - id: memcached
                  port: 11211
                  type: TCP
            healthCheck:
                type: TCP
                port: memcached
        - name: zammad-elasticsearch
          icon: https://cdn.worldvectorlogo.com/logos/elasticsearch.svg
          template: PREBUILT
          spec:
            source:
                image: bitnami/elasticsearch:8.18.0
            ports:
                - id: elasticsearch
                  port: 9200
                  type: HTTP
            volumes:
                - id: data
                  dir: /bitnami/elasticsearch/data
            env:
                ELASTICSEARCH_ENABLE_REST_TLS:
                    default: "false"
                ELASTICSEARCH_ENABLE_SECURITY:
                    default: "true"
                ELASTICSEARCH_HEAP_SIZE:
                    default: 512m
                ELASTICSEARCH_PASSWORD:
                    default: ${PASSWORD}
                    expose: true
                ELASTICSEARCH_SKIP_TRANSPORT_TLS:
                    default: "true"
