question-mark
Stuck on an issue?

Lightrun Answers was designed to reduce the constant googling that comes with debugging 3rd party libraries. It collects links to all the places you might be looking at while hunting down a tough bug.

And, if you’re still stuck at the end, we’re happy to hop on a call to see how we can help out.

App Suggestion: Zammad

See original GitHub issue

Please tell us what app you’d like to see on CapRover as a one-click app. Zammad is a web-based, open source user support/ticketing solution.

Do you know if there is any official Docker image for the app? Docker compose: https://hub.docker.com/r/zammad/zammad-docker-compose

I am trying to get it working, and all services seem to be deployed successfully, however it remains at 502. I believe the reason is that the containers are being renamed in CapRover and that’s why the communication in between doesn’t happen. Any hint would be highly appreciated.

Here are all possible ENVs based on their docs: https://docs.zammad.org/en/latest/install/docker-compose/environment.html

And this is the captain-definition file I’ve got so far:


captainVersion: 4
caproverOneClickApp:
    instructions:
        start: >-
            Zammad is a web-based, open source user support/ticketing solution.
        end: >
            Zammad is deployed and available. 
             IMPORTANT: It will take up to 5 minutes for Zammad to be ready. Before that, you might see a 502 error page.
    displayName: Zammad
    isOfficial: true
    description: Zammad is a web-based, open source user support/ticketing solution.
    documentation: Taken from https://hub.docker.com/r/zammad/zammad-docker-compose.
    variables:
        - id: $$cap_zammad_version
          label: Zammad Version
          defaultValue: '4.1.0-94'
          description: Check out their docker page for the valid tags https://hub.docker.com/r/zammad/zammad-docker-compose/tags
          validRegex: /^([^\s^\/])+$/
        - id: $$cap_pg_user
          label: PostgreSQL user
          defaultValue: postgresuser
          validRegex: /^([a-zA-Z0-9])+$/
        - id: $$cap_pg_pass
          label: PostgreSQL password
          description: 'PostgreSQL password'
          validRegex: /.{1,}/

services:

  $$cap_appname-backup:
    command: ["zammad-backup"]
    depends_on:
      - $$cap_appname-railsserver
    entrypoint: /usr/local/bin/backup.sh
    environment:
      - BACKUP_SLEEP=86400
      - HOLD_DAYS=10
      - POSTGRESQL_USER=$$cap_db_user
      - POSTGRESQL_PASSWORD=$$cap_db_pass
    image: zammad/zammad-docker-compose:zammad-postgresql-$$cap_zammad_version
    links:
      - $$cap_appname-postgresql
    restart: always
    volumes:
      - $$cap_appname-backup:/var/tmp/zammad
      - $$cap_appname-data:/opt/zammad

  $$cap_appname-elasticsearch:
    environment:
      - discovery.type=single-node
      - ELASTICSEARCH_ENABLED=false
    image: zammad/zammad-docker-compose:zammad-elasticsearch-$$cap_zammad_version
    restart: always
    volumes:
      - $$cap_appname-elasticsearch-data:/usr/share/elasticsearch/data

  $$cap_appname-init:
    command: ["zammad-init"]
    depends_on:
      - $$cap_appname-postgresql
    environment:
      - POSTGRESQL_USER=$$cap_pg_user
      - POSTGRESQL_PASS=$$cap_pg_pass
      - AUTOWIZARD_JSON=""

    image: zammad/zammad-docker-compose:zammad-$$cap_zammad_version
    links:
      - $$cap_appname-elasticsearch
      - $$cap_appname-postgresql
    restart: always
    volumes:
      - $$cap_appname-data:/opt/zammad

  $$cap_appname-memcached:
    command: memcached -m 256M
    image: memcached:1.6.9-alpine
    restart: always

  $$cap_appname-nginx:
    command: ["zammad-nginx"]
    expose:
      - "8080"
    depends_on:
      - $$cap_appname-railsserver
    environment:
        - ZAMMAD_RAILSSERVER_HOST=srv-captain--$$cap_appname-railsserver
        - ZAMMAD_WEBSOCKET_HOST=srv-captain--$$cap_appname-websocket
    image: zammad/zammad-docker-compose:zammad-$$cap_zammad_version
    links:
      - $$cap_appname-railsserver
      - $$cap_appname-websocket
    restart: always
    volumes:
      - $$cap_appname-data:/opt/zammad

  $$cap_appname-postgresql:
    environment:
      - POSTGRESQL_HOST=srv-captain--$$cap_appname-postgresql
      - POSTGRES_USER=$$cap_pg_user
      - POSTGRES_PASSWORD=$$cap_pg_pass
    image: zammad/zammad-docker-compose:zammad-postgresql-$$cap_zammad_version
    restart: always
    volumes:
      - $$cap_appname-postgresql-data:/var/lib/postgresql/data

  $$cap_appname-railsserver:
    command: ["zammad-railsserver"]
    depends_on:
      - $$cap_appname-memcached
      - $$cap_appname-postgresql
    image: zammad/zammad-docker-compose:zammad-$$cap_zammad_version
    links:
      - $$cap_appname-elasticsearch
      - $$cap_appname-memcached
      - $$cap_appname-postgresql
    restart: always
    volumes:
      - $$cap_appname-data:/opt/zammad

  $$cap_appname-scheduler:
    command: ["zammad-scheduler"]
    depends_on:
      - $$cap_appname-memcached
      - $$cap_appname-railsserver
    image: zammad/zammad-docker-compose:zammad-$$cap_zammad_version
    links:
      - $$cap_appname-elasticsearch
      - $$cap_appname-memcached
      - $$cap_appname-postgresql
    restart: always
    volumes:
      - $$cap_appname-data:/opt/zammad

  $$cap_appname-websocket:
    command: ["zammad-websocket"]
    depends_on:
      - $$cap_appname-memcached
      - $$cap_appname-railsserver
    image: zammad/zammad-docker-compose:zammad-$$cap_zammad_version
    links:
      - $$cap_appname-postgresql
      - $$cap_appname-memcached
    restart: always
    volumes:
      - $$cap_appname-data:/opt/zammad

volumes:
  $$cap_appname-elasticsearch-data:
    driver: local
  $$cap_appname-postgresql-data:
    driver: local
  $$cap_appname-backup:
    driver: local
  $$cap_appname-data:
    driver: local

Issue Analytics

  • State:closed
  • Created 2 years ago
  • Reactions:1
  • Comments:11 (4 by maintainers)

github_iconTop GitHub Comments

2reactions
VeselaHoubacommented, Oct 19, 2021

First working result I’ve removed all hostname references from variables. It can be re-added as needed, just wanted to make the template as simple as possible for debugging. The CMD is not actually passed to container as normal docker would do, but CapRover wraps it with /bin/sh -c which breaks the entrypoint-command system Zammad is using in their containers. Worked around with

        - FROM zammad/zammad-docker-compose:zammad-$$cap_zammad_VERSION
        - ENTRYPOINT []
        - CMD /docker-entrypoint.sh zammad-<function>

What is currently broken: The init container is created over and over. The restart should be set to on-failure, but according to https://github.com/caprover/one-click-apps the restart directive is ignored. This prevents nginx from starting up (container is waiting for /var/lib/docker/volumes/captain--<app_name>-data/_data/tmp/zammad.ready). You can manually delete init app after init phase is finished and create the file manually. There is probably some elegant way to fix this 😃

I’ve also removed directives like links which are also ignored according to docu, changed expose to port, added few variables where needed etc. This definitely needs more time for testing and probably fixing.

Anyway my template is following:

captainVersion: 4
caproverOneClickApp:
    instructions:
        start: >-
            Zammad is a web-based, open source user support/ticketing solution.
        end: >
            Zammad is deployed and available.
             IMPORTANT: It will take up to 5 minutes for Zammad to be ready. Before that, you might see a 502 error page.
    displayName: Zammad
    isOfficial: true
    description: Zammad is a web-based, open source user support/ticketing solution.
    documentation: Taken from https://hub.docker.com/r/zammad/zammad-docker-compose.
    variables:
        - id: $$cap_zammad_VERSION
          label: Zammad Version
          defaultValue: '4.1.0-94'
          description: Check out their docker page for the valid tags https://hub.docker.com/r/zammad/zammad-docker-compose/tags
          validRegex: /^([^\s^\/])+$/

        - id: $$cap_zammad_ELASTICSEARCH_ENABLED
          label: ELASTICSEARCH_ENABLED
          defaultValue: 'true'
          description: Setting this variable to false will allow you to run your Zammad without Elasticsearch. Please note that we strongly advise against doing so.
          validRegex: /^(true|false)$/

        - id: $$cap_zammad_POSTGRESQL_USER
          label: POSTGRESQL_USER
          defaultValue: postgresuser
          validRegex: /^([a-zA-Z0-9\-\.\_])+$/

        - id: $$cap_zammad_POSTGRESQL_PASS
          label: POSTGRESQL_PASS
          defaultValue: $$cap_gen_random_hex(10)
          description: 'The password of Zammads database user.'
          validRegex: /.{1,}/

        - id: $$cap_zammad_POSTGRESQL_DB
          label: POSTGRESQL_DB
          defaultValue: zammad_production
          validRegex: /^([a-zA-Z0-9\-\.\_])+$/

        - id: $$cap_zammad_POSTGRESQL_CREATEDB
          label: POSTGRESQL_DB_CREATE
          defaultValue: 'true'
          description: By default we will create the required database.
          validRegex: /^(true|false)$/

        - id: $$cap_zammad_RAILS_TRUSTED_PROXIES
          label: RAILS_TRUSTED_PROXIES
          description: By default Zammad trusts localhost proxies only. ⚠ Only change this option if you know what you’re doing! ⚠
          defaultValue: "['127.0.0.1', '::1']"

services:

  $$cap_appname-backup:
    restart: always
    depends_on:
      - $$cap_appname-railsserver
    environment:
      BACKUP_SLEEP: 86400
      HOLD_DAYS: 10
      POSTGRESQL_HOST: srv-captain--$$cap_appname-postgresql
      POSTGRESQL_PORT: 5432
      POSTGRESQL_USER: $$cap_zammad_POSTGRESQL_USER
      POSTGRESQL_PASSWORD: $$cap_zammad_POSTGRESQL_PASS
      POSTGRESQL_DB: $$cap_zammad_POSTGRESQL_DB
      ZAMMAD_RAILSSERVER_HOST: srv-captain--$$cap_appname-railsserver
      ZAMMAD_RAILSSERVER_PORT: 3000
    volumes:
      - $$cap_appname-backup:/var/tmp/zammad
      - $$cap_appname-data:/opt/zammad
    caproverExtra:
      notExposeAsWebApp: true
      dockerfileLines:
          - FROM zammad/zammad-docker-compose:zammad-postgresql-$$cap_zammad_VERSION
          - ENTRYPOINT []
          - CMD /usr/local/bin/backup.sh zammad-backup

  $$cap_appname-elasticsearch:
    restart: always
    image: zammad/zammad-docker-compose:zammad-elasticsearch-$$cap_zammad_VERSION
    environment:
      discovery.type: single-node
    volumes:
      - $$cap_appname-elasticsearch-data:/usr/share/elasticsearch/data
    caproverExtra:
      notExposeAsWebApp: true

  $$cap_appname-init:
    restart: on-failure
    depends_on:
      - $$cap_appname-postgresql
    environment:
      AUTOWIZARD_JSON: ''
      ELASTICSEARCH_ENABLED: $$cap_zammad_ELASTICSEARCH_ENABLED
      ELASTICSEARCH_HOST: srv-captain--$$cap_appname-elasticsearch
      ELASTICSEARCH_PORT: 9200
      ELASTICSEARCH_SCHEMA: http
      ELASTICSEARCH_NAMESPACE: zammad
      ELASTICSEARCH_REINDEX: true
      ELASTICSEARCH_SSL_VERIFY: true
      MEMCACHED_HOST: srv-captain--$$cap_appname-memcached
      MEMCACHED_PORT: 11211
      NGINX_PORT: 8080
      NGINX_SERVER_NAME: _
      NGINX_SERVER_SCHEME: \$scheme
      POSTGRESQL_HOST: srv-captain--$$cap_appname-postgresql
      POSTGRESQL_PORT: 5432
      POSTGRESQL_USER: $$cap_zammad_POSTGRESQL_USER
      POSTGRESQL_PASS: $$cap_zammad_POSTGRESQL_PASS
      POSTGRESQL_DB: $$cap_zammad_POSTGRESQL_DB
      POSTGRESQL_DB_CREATE: $$cap_zammad_POSTGRESQL_CREATEDB
      RAILS_TRUSTED_PROXIES: $$cap_zammad_RAILS_TRUSTED_PROXIES
      RSYNC_ADDITIONAL_PARAMS: --no-perms --no-owner
      ZAMMAD_RAILSSERVER_HOST: srv-captain--$$cap_appname-railsserver
      ZAMMAD_RAILSSERVER_PORT: 3000
      ZAMMAD_WEBSOCKET_HOST: srv-captain--$$cap_appname-websocket
      ZAMMAD_WEBSOCKET_PORT: 6042
    volumes:
      - $$cap_appname-data:/opt/zammad
    caproverExtra:
      notExposeAsWebApp: true
      dockerfileLines:
        - FROM zammad/zammad-docker-compose:zammad-$$cap_zammad_VERSION
        - ENTRYPOINT []
        - CMD /docker-entrypoint.sh zammad-init

  $$cap_appname-memcached:
    restart: always
    caproverExtra:
      notExposeAsWebApp: true
      dockerfileLines:
        - FROM memcached:1.6.10-alpine
        - CMD memcached -m 256M

  $$cap_appname-nginx:
    ports:
      - "8080:8080"
    depends_on:
      - $$cap_appname-railsserver
    environment:
      ZAMMAD_RAILSSERVER_HOST: srv-captain--$$cap_appname-railsserver
      ZAMMAD_RAILSSERVER_PORT: 3000
      ZAMMAD_WEBSOCKET_HOST: srv-captain--$$cap_appname-websocket
      ZAMMAD_WEBSOCKET_PORT: 6042
    restart: always
    volumes:
      - $$cap_appname-data:/opt/zammad
    caproverExtra:
      notExposeAsWebApp: false
      containerHttpPort: 8080
      dockerfileLines:
        - FROM zammad/zammad-docker-compose:zammad-$$cap_zammad_VERSION
        - ENTRYPOINT []
        - CMD /docker-entrypoint.sh zammad-nginx

  $$cap_appname-postgresql:
    environment:
      POSTGRES_PORT: 5432
      POSTGRES_USER: $$cap_zammad_POSTGRESQL_USER
      POSTGRES_PASSWORD: $$cap_zammad_POSTGRESQL_PASS
    image: zammad/zammad-docker-compose:zammad-postgresql-$$cap_zammad_VERSION
    restart: always
    volumes:
      - $$cap_appname-postgresql-data:/var/lib/postgresql/data
    caproverExtra:
      notExposeAsWebApp: true

  $$cap_appname-railsserver:
    depends_on:
      - $$cap_appname-memcached
      - $$cap_appname-postgresql
    environment:
      ZAMMAD_RAILSSERVER_PORT: 3000
    restart: always
    volumes:
      - $$cap_appname-data:/opt/zammad
    caproverExtra:
      notExposeAsWebApp: true
      dockerfileLines:
        - FROM zammad/zammad-docker-compose:zammad-$$cap_zammad_VERSION
        - ENTRYPOINT []
        - CMD /docker-entrypoint.sh zammad-railsserver

  $$cap_appname-scheduler:
    depends_on:
      - $$cap_appname-memcached
      - $$cap_appname-railsserver
    restart: always
    volumes:
      - $$cap_appname-data:/opt/zammad
    caproverExtra:
      notExposeAsWebApp: true
      dockerfileLines:
        - FROM zammad/zammad-docker-compose:zammad-$$cap_zammad_VERSION
        - ENTRYPOINT []
        - CMD /docker-entrypoint.sh zammad-scheduler

  $$cap_appname-websocket:
    depends_on:
      - $$cap_appname-memcached
      - $$cap_appname-railsserver
    environment:
      ZAMMAD_WEBSOCKET_PORT: 6042
    restart: always
    volumes:
      - $$cap_appname-data:/opt/zammad
    caproverExtra:
      notExposeAsWebApp: false
      dockerfileLines:
        - FROM zammad/zammad-docker-compose:zammad-$$cap_zammad_VERSION
        - ENTRYPOINT []
        - CMD /docker-entrypoint.sh zammad-websocket

volumes:
  $$cap_appname-elasticsearch-data:
    driver: local
  $$cap_appname-postgresql-data:
    driver: local
  $$cap_appname-backup:
    driver: local
  $$cap_appname-data:
    driver: local
1reaction
VeselaHoubacommented, Oct 26, 2021

also someone could find this useful for dropping testing instances 😃

#!/usr/bin/env bash
APPNAME="zammad-03"

function drop {
  app="${1}"
  volumes="${2}"
  echo "Deleting ${app}"
  JSON='{ "appName": "'"${app}"'", "volumes":['"${volumes}"'] }'
  caprover api \
    --caproverName captain-01 \
    -m POST \
    -t /user/apps/appDefinitions/delete \
    -d "${JSON}"
}

drop "${APPNAME}-init" ''
drop "${APPNAME}-websocket" ''
drop "${APPNAME}-scheduler" ''
drop "${APPNAME}-railsserver" ''
drop "${APPNAME}-nginx" ''
drop "${APPNAME}-memcached" ''
drop "${APPNAME}-postgresql" '"'"${APPNAME}"'-postgresql-data"'
drop "${APPNAME}-elasticsearch" '"'"${APPNAME}"'-elasticsearch-data"'
# volume zammad-data is used by multiple services -> wait until teardown
sleep 30
drop "${APPNAME}-backup" '"'"${APPNAME}"'-data","'"${APPNAME}"'-backup"'
Read more comments on GitHub >

github_iconTop Results From Across the Web

Zammad Alternatives: 25+ Customer Support Tools and Help ...
The best Zammad alternatives are osTicket, Zendesk and Freshdesk. Our crowd-sourced lists contains more than 25 apps similar to Zammad for ...
Read more >
Apple iOS and Zammad Integration | Workflow Automation
Connect Apple iOS and Zammad to sync data between apps and create powerful automated workflows. Integrate over 1000 apps on Make.
Read more >
Profile & Settings — Zammad (for Agents) documentation
Generate personal access tokens for third party applications to use the Zammad API. Caution. Always generate a new token for each application you...
Read more >
How to Install Zammad 2.0 on CentOS 7 - Vultr.com
Business CentOS Linux Guides Server Apps ... Zammad is an open source helpdesk/ticketing system designed for customer support teams.
Read more >
Best IT Helpdesk Ticketing Systems You Must Try [2022]
Help desk automation; Asset management; Mobile help desk apps; SSL Encryption. 9. Zammad. Next on our ticketing system software list is Zammad.
Read more >

github_iconTop Related Medium Post

No results found

github_iconTop Related StackOverflow Question

No results found

github_iconTroubleshoot Live Code

Lightrun enables developers to add logs, metrics and snapshots to live code - no restarts or redeploys required.
Start Free

github_iconTop Related Reddit Thread

No results found

github_iconTop Related Hackernoon Post

No results found

github_iconTop Related Tweet

No results found

github_iconTop Related Dev.to Post

No results found

github_iconTop Related Hashnode Post

No results found