Error when downloading attachments

Infos:

  • Used Zammad version: 6.4.1
  • Used Zammad installation type: Portainer, compose see below
  • Operating system:
  • Browser + version: Chrome

Expected behavior:

  • When clicking on an attachment in Zammad or download via API, the file should be downloaded

Actual behavior:

  • Clicking on the file results in the following error:
The website is not available
The website at domain.com/api/v1/ticket_attachment/XX/XX/XX may be temporarily unavailable or has been permanently moved to a new web address.
ERR_HTTP2_PROTOCOL_ERROR

Download via API and n8n shows Error code `ECONNRESET’, Full message socket hang up

Zammad rails server logs says, everything is just fine.

Steps to reproduce the behavior:

  • Every single attachment in zammad installation

Docker Compose:

---
version: '3.8'

x-shared:
  zammad-service: &zammad-service
    environment: &zammad-environment
      MEMCACHE_SERVERS: ${MEMCACHE_SERVERS:-zammad-memcached:11211}
      POSTGRESQL_DB: ${POSTGRES_DB:-zammad_production}
      POSTGRESQL_HOST: ${POSTGRES_HOST:-zammad-postgresql}
      POSTGRESQL_USER: ${POSTGRES_USER:-USER}
      POSTGRESQL_PASS: ${POSTGRES_PASS:-EXAMPLE}
      POSTGRESQL_PORT: ${POSTGRES_PORT:-5432}
      POSTGRESQL_OPTIONS: ${POSTGRESQL_OPTIONS:-?pool=50}
      POSTGRESQL_DB_CREATE:
      REDIS_URL: ${REDIS_URL:-redis://zammad-redis:6379}
      S3_URL:
      # Backup settings
      BACKUP_DIR: "${BACKUP_DIR:-/var/tmp/zammad}"
      BACKUP_TIME: "${BACKUP_TIME:-03:00}"
      HOLD_DAYS: "${HOLD_DAYS:-10}"
      TZ: "${TZ:-Europe/Berlin}"
      # Allow passing in these variables via .env:
      AUTOWIZARD_JSON:
      AUTOWIZARD_RELATIVE_PATH:
      ELASTICSEARCH_ENABLED:
      ELASTICSEARCH_HOST:
      ELASTICSEARCH_PORT:
      ELASTICSEARCH_SCHEMA:
      ELASTICSEARCH_NAMESPACE:
      ELASTICSEARCH_REINDEX:
      ELASTICSEARCH_SSL_VERIFY:
      NGINX_PORT:
      NGINX_CLIENT_MAX_BODY_SIZE:
      NGINX_SERVER_NAME:
      NGINX_SERVER_SCHEME: "${NGINX_SERVER_SCHEME}"
      RAILS_TRUSTED_PROXIES:
      ZAMMAD_WEB_CONCURRENCY:
      ZAMMAD_SESSION_JOBS:
      ZAMMAD_PROCESS_SCHEDULED:
      ZAMMAD_PROCESS_DELAYED_JOBS_WORKERS:
      # Variables used by ngingx-proxy container for reverse proxy creations
      # for docs refer to https://github.com/nginx-proxy/nginx-proxy
      VIRTUAL_HOST:
      VIRTUAL_PORT:
      # Variables used by acme-companion for retrieval of LetsEncrypt certificate
      # for docs refer to https://github.com/nginx-proxy/acme-companion
      LETSENCRYPT_HOST:
      LETSENCRYPT_EMAIL:
      
    image: ${IMAGE_REPO:-ghcr.io/zammad/zammad}:${VERSION:-6.4.1-45}
    restart: ${RESTART:-always}
    volumes:
      - zammad-storage:/opt/zammad/storage
    depends_on:
      - zammad-memcached
      - zammad-postgresql
      - zammad-redis

services:

  zammad-backup:
    <<: *zammad-service
    command: ["zammad-backup"]
    volumes:
      - zammad-backup:/var/tmp/zammad
      - zammad-storage:/opt/zammad/storage:ro
    user: 0:0

  zammad-elasticsearch:
    image: bitnami/elasticsearch:${ELASTICSEARCH_VERSION:-8.17.1}
    restart: ${RESTART:-always}
    volumes:
      - elasticsearch-data:/bitnami/elasticsearch/data
    environment:
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"

  zammad-init:
    <<: *zammad-service
    command: ["zammad-init"]
    depends_on:
      - zammad-postgresql
    restart: on-failure
    user: 0:0

  zammad-memcached:
    command: memcached -m 256M
    image: memcached:${MEMCACHE_VERSION:-1.6.36-alpine}
    restart: ${RESTART:-always}

  zammad-nginx:
    <<: *zammad-service
    command: ["zammad-nginx"]
    expose:
      - "${NGINX_PORT:-8080}"
    ports:
      - "${NGINX_EXPOSE_PORT:-8080}:${NGINX_PORT:-8080}"
    depends_on:
      - zammad-railsserver
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.zammad.entrypoints=websecure"
      - "traefik.http.routers.zammad.rule=Host(`DOMAIN`)"
      - "traefik.http.routers.zammad.middlewares=default@file"
      - "traefik.http.routers.zammad.tls=true"
      - "traefik.http.routers.zammad.tls.certresolver=http_resolver"
      - "traefik.http.routers.zammad.service=zammad"
      - "traefik.http.services.zammad.loadbalancer.server.port=80"
      - "traefik.docker.network=proxy"
    networks:
      - proxy
      - default

  zammad-postgresql:
    environment:
      POSTGRES_DB: ${POSTGRES_DB:-zammad_production}
      POSTGRES_USER: ${POSTGRES_USER:-zammad}
      POSTGRES_PASSWORD: ${POSTGRES_PASS:-zammad}
    image: postgres:${POSTGRES_VERSION:-17.2-alpine}
    restart: ${RESTART:-always}
    volumes:
      - postgresql-data:/var/lib/postgresql/data

  zammad-railsserver:
    <<: *zammad-service
    command: ["zammad-railsserver"]

  zammad-redis:
    image: redis:${REDIS_VERSION:-7.4.2-alpine}
    restart: ${RESTART:-always}
    volumes:
      - redis-data:/data

  zammad-scheduler:
    <<: *zammad-service
    command: ["zammad-scheduler"]

  zammad-websocket:
    <<: *zammad-service
    command: ["zammad-websocket"]

volumes:
  elasticsearch-data:
    driver: local
  postgresql-data:
    driver: local
  redis-data:
    driver: local
  zammad-backup:
    driver: local
  zammad-storage:
    driver: local

networks:
  proxy:
    external: true

When an e-mail with attachments is sent to zammad, the mail gets processed and attachments are linked to the article. File size and file type are correct. If you click the file or try to download it, it results in an error message. In Browser, a ERR_HTTP2_PROTOCOL_ERROR is returned, trying access via n8n and GET request with auth token results in an ā€œECONNRESET Full message socket hang upā€ error.

Zammad rails server logs show a successfully performed request:

I, [2025-05-07T23:04:36.454887#1-892840]  INFO -- : Started GET "/api/v1/ticket_attachment/XX/XX/XX" for 172.31.XXX.XXX at 2025-05-07 23:04:36 +0200

I, [2025-05-07T23:04:36.464656#1-892840]  INFO -- : Processing by TicketArticlesController#attachment as HTML

I, [2025-05-07T23:04:36.464748#1-892840]  INFO -- :   Parameters: {"ticket_id"=>"XX", "article_id"=>"XX", "id"=>"XX"}

I, [2025-05-07T23:04:36.549390#1-892840]  INFO -- : Sent data FILENAME.pdf (0.6ms)

I, [2025-05-07T23:04:36.551369#1-892840]  INFO -- : Completed 200 OK in 86ms (Views: 0.3ms | ActiveRecord: 52.6ms | Allocations: 6918)

Any idea what the problem could be? The fact that zammad tells me everything is fine while browser and API show errors leaves me somewhat clueless where to start :frowning:

Greg

If the log file says 200 - OK, you may want to look at any proxy thatā€˜s beteeen n8n and Zammad. Firewalls might do stuff too.

@MrGeneration Thank you for the hint. Traefik somehow interrupted file downloads. Switched to nginx proxy manager as outlined in the docker scenarios and everything works fine now!

1 Like