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
Greg