Compare commits

..

No commits in common. "master" and "v3.0.0" have entirely different histories.

24 changed files with 500 additions and 258 deletions

14
.env
View File

@ -1,14 +1,6 @@
ELASTICSEARCH_VERSION=8.8.0 IMAGE_REPO=zammad/zammad-docker-compose
IMAGE_REPO=ghcr.io/zammad/zammad
MEMCACHE_SERVERS=zammad-memcached:11211
MEMCACHE_VERSION=1.6.20-alpine
POSTGRES_DB=zammad_production
POSTGRES_PASS=zammad POSTGRES_PASS=zammad
POSTGRES_USER=zammad POSTGRES_USER=zammad
POSTGRES_HOST=zammad-postgresql
POSTGRES_PORT=5432
POSTGRES_VERSION=15.3-alpine
REDIS_URL=redis://zammad-redis:6379
REDIS_VERSION=7.0.5-alpine
RESTART=always RESTART=always
VERSION=6.0.0-66 # don't forget to add the minus before the version
VERSION=-3.6.0-65

View File

@ -1,7 +1,6 @@
--- version: '2'
version: "2"
services: services:
zammad-nginx: zammad-nginx:
environment: environment:
- VIRTUAL_HOST=helpdesk.domain.tld - VIRTUAL_HOST=helpdesk.domain.tld

View File

@ -1,6 +1,4 @@
---
version: '2' version: '2'
services: services:
frontend: frontend:
image: jwilder/nginx-proxy:alpine image: jwilder/nginx-proxy:alpine
@ -12,7 +10,7 @@ services:
- ./certs:/etc/nginx/certs - ./certs:/etc/nginx/certs
- /var/run/docker.sock:/tmp/docker.sock:ro - /var/run/docker.sock:/tmp/docker.sock:ro
networks: networks:
- 2_apps - 2_apps
networks: networks:
2_apps: 2_apps:

View File

@ -1,16 +0,0 @@
---
version: 2
updates:
- package-ecosystem: "docker"
directory: "/containers/zammad"
schedule:
interval: "weekly"
time: "09:00"
timezone: "Europe/Berlin"
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "weekly"
time: "09:00"
timezone: "Europe/Berlin"

14
.github/docker-image-build.sh vendored Executable file
View File

@ -0,0 +1,14 @@
#!/usr/bin/env bash
#
# build zammads docker & docker-compose images
set -o errexit
set -o pipefail
DOCKER_IMAGES="zammad zammad-elasticsearch zammad-postgresql"
# shellcheck disable=SC2153
for DOCKER_IMAGE in ${DOCKER_IMAGES}; do
echo "Build Zammad Docker image ${DOCKER_IMAGE} for local test"
docker build --pull --no-cache --build-arg BUILD_DATE="$(date -u +'%Y-%m-%dT%H:%M:%SZ')" -t "${DOCKER_IMAGE}" -f "containers/${DOCKER_IMAGE}/Dockerfile" .
done

View File

@ -1,3 +1,2 @@
---
MD013: MD013:
line_length: 600 line_length: 500

View File

@ -1,37 +0,0 @@
name-template: "v$RESOLVED_VERSION"
tag-template: "v$RESOLVED_VERSION"
categories:
- title: "🚀 Features"
labels:
- "feature"
- "enhancement"
- title: "🐛 Bug Fixes"
labels:
- "fix"
- "bugfix"
- "bug"
- title: "🧹 Maintenance"
labels:
- "chore"
- "dependencies"
version-resolver:
major:
labels:
- "feature"
minor:
labels:
- "enhancement"
patch:
labels:
- "fix"
- "bugfix"
- "bug"
- "chore"
- "dependencies"
default: patch
template: |
## Changes
$CHANGES
**Full Changelog**: https://github.com/$OWNER/$REPOSITORY/compare/$PREVIOUS_TAG...v$RESOLVED_VERSION

1
.github/stale.yml vendored
View File

@ -1,4 +1,3 @@
---
# Number of days of inactivity before an issue becomes stale # Number of days of inactivity before an issue becomes stale
daysUntilStale: 60 daysUntilStale: 60
# Number of days of inactivity before a stale issue is closed # Number of days of inactivity before a stale issue is closed

18
.github/tests.sh vendored
View File

@ -8,7 +8,7 @@ set -o pipefail
docker-compose logs --timestamps --follow & docker-compose logs --timestamps --follow &
until (curl -I --silent --fail localhost:8080 | grep -iq "HTTP/1.1 200 OK"); do until (curl -I --silent --fail localhost | grep -iq "HTTP/1.1 200 OK"); do
echo "wait for zammad to be ready..." echo "wait for zammad to be ready..."
sleep 15 sleep 15
done done
@ -23,28 +23,16 @@ echo
echo "Execute autowizard..." echo "Execute autowizard..."
echo echo
docker exec --env=AUTOWIZARD_RELATIVE_PATH=var/auto_wizard.json --env=DATABASE_URL=postgres://zammad:zammad@zammad-postgresql:5432/zammad_production zammad-docker-compose_zammad-railsserver_1 rake zammad:setup:auto_wizard docker exec zammad-docker-compose_zammad-railsserver_1 rake zammad:setup:auto_wizard
echo echo
echo "Autowizard executed successful :)" echo "Autowizard executed successful :)"
echo echo
echo
echo "Check DB for AutoWizard user"
echo
docker exec --env=DATABASE_URL=postgres://zammad:zammad@zammad-postgresql:5432/zammad_production zammad-docker-compose_zammad-railsserver_1 rails r "p User.find_by(email: 'info@zammad.org')" | grep 'info@zammad.org'
echo
echo "Check DB for AutoWizard user successfull :)"
echo
echo echo
echo "Fill DB with some random data" echo "Fill DB with some random data"
echo docker exec zammad-docker-compose_zammad-railsserver_1 rails r "FillDB.load(agents: 1,customers: 1,groups: 1,organizations: 1,overviews: 1,tickets: 1)"
docker exec --env=DATABASE_URL=postgres://zammad:zammad@zammad-postgresql:5432/zammad_production zammad-docker-compose_zammad-railsserver_1 rails r "FillDb.load(agents: 1,customers: 1,groups: 1,organizations: 1,overviews: 1,tickets: 1)"
echo echo
echo "DB fill successful :)" echo "DB fill successful :)"

View File

@ -1,25 +0,0 @@
---
name: ci-remote-image
on:
pull_request:
jobs:
run-remote-image-docker-compose:
timeout-minutes: 20
runs-on: ubuntu-22.04
steps:
- name: Checkout
uses: actions/checkout@v3
- name: pull docker-compose images
run: docker-compose pull
- name: run docker-compose up
run: docker-compose up --detach
- name: add autowizard file
run: docker cp .github/auto_wizard.json zammad-docker-compose_zammad-railsserver_1:/opt/zammad/var
- name: run tests
run: .github/tests.sh

View File

@ -1,32 +1,77 @@
---
name: ci name: ci
on: on:
pull_request: pull_request:
jobs: jobs:
codespell:
name: codespell
runs-on: ubuntu-20.04
steps:
- name: Checkout Code
uses: actions/checkout@v2
- name: Codespell
uses: codespell-project/actions-codespell@master
with:
skip: .git
check_filenames: true
check_hidden: true
lint-docker-compose-file: lint-docker-compose-file:
runs-on: ubuntu-22.04 runs-on: ubuntu-20.04
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v3 uses: actions/checkout@v1
- name: lint zammad docker-compose file - name: lint zammad docker-compose file
run: docker-compose config run: docker-compose config
super-linter: super-linter:
runs-on: ubuntu-22.04 runs-on: ubuntu-20.04
steps: steps:
- name: Checkout Code - name: Checkout Code
uses: actions/checkout@v3 uses: actions/checkout@v2
with:
fetch-depth: 0
- name: Lint Code Base - name: Lint Code Base
uses: github/super-linter/slim@v5 uses: github/super-linter@v3
env: env:
DEFAULT_BRANCH: master DEFAULT_BRANCH: master
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
LINTER_RULES_PATH: .github/linters
VALIDATE_ALL_CODEBASE: false build-and-run-docker-compose:
VALIDATE_JSCPD: false needs:
- codespell
- lint-docker-compose-file
- super-linter
timeout-minutes: 20
runs-on: ubuntu-20.04
steps:
- name: Checkout
uses: actions/checkout@v1
- name: build docker containers
run: .github/docker-image-build.sh
- name: use images build by ci
run: sed -i -e 's#${IMAGE_REPO}:##g' -e 's#${VERSION}##g' docker-compose.yml
- name: run docker-compose up
run: docker-compose up --detach
- name: add autowizard file
run: docker cp .github/auto_wizard.json zammad-docker-compose_zammad-railsserver_1:/opt/zammad
- name: run tests
run: .github/tests.sh
run-remote-image-docker-compose:
needs:
- codespell
- lint-docker-compose-file
- super-linter
timeout-minutes: 10
runs-on: ubuntu-20.04
steps:
- name: Checkout
uses: actions/checkout@v1
- name: pull docker-compose images
run: docker-compose pull
- name: run docker-compose up
run: docker-compose up --detach
- name: add autowizard file
run: docker cp .github/auto_wizard.json zammad-docker-compose_zammad-railsserver_1:/opt/zammad
- name: run tests
run: .github/tests.sh

View File

@ -1,22 +0,0 @@
name: Release Drafter
on:
push:
branches:
- master
pull_request:
types: [opened, reopened, synchronize]
permissions:
contents: read
jobs:
update_release_draft:
permissions:
contents: write
pull-requests: write
runs-on: ubuntu-22.04
steps:
- uses: release-drafter/release-drafter@v5
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

12
Dockerfile Normal file
View File

@ -0,0 +1,12 @@
ARG BUILD_DATE
LABEL org.label-schema.build-date="$BUILD_DATE" \
org.label-schema.name="Zammad" \
org.label-schema.license="AGPL-3.0" \
org.label-schema.description="Docker container for Zammad - Dummy Dockerfile for DockerHub autobuilds" \
org.label-schema.url="https://zammad.org" \
org.label-schema.vcs-url="https://github.com/zammad/zammad" \
org.label-schema.vcs-type="Git" \
org.label-schema.vendor="Zammad" \
org.label-schema.schema-version="3.6.0" \
org.label-schema.docker.cmd="sysctl -w vm.max_map_count=262144;docker-compose up"

View File

@ -2,33 +2,26 @@
Zammad is a web based open source helpdesk/ticket system with many features Zammad is a web based open source helpdesk/ticket system with many features
to manage customer communication via several channels like telephone, facebook, to manage customer communication via several channels like telephone, facebook,
twitter, chat and emails. It is distributed under the GNU AFFERO General Public twitter, chat and e-mails. It is distributed under the GNU AFFERO General Public
License (AGPL). Do you receive many emails and want to answer them with a team of agents? License (AGPL). Do you receive many e-mails and want to answer them with a team of agents?
You're going to love Zammad! You're going to love Zammad!
## Use cases ## Use case for this repo
This repository is the starting point if you want to: This repo is meant to be the starting point for somebody who likes to use dockerized multi-container Zammad in production.
- deploy Zammad in a containerized production environment ## Getting started with zammad-docker-compose
- test the current `stable` or `develop` versions of Zammad
## Getting started <https://docs.zammad.org/en/latest/install-docker-compose.html>
[Learn more on Zammads documentation](https://docs.zammad.org/en/latest/install/docker-compose.html) ## CI Status
## Upgrading [![CI Status](https://github.com/zammad/zammad-docker-compose/workflows/ci/badge.svg)](https://github.com/zammad/zammad-docker-compose/actions)
For upgrading instructions see our [Releases](https://github.com/zammad/zammad-docker-compose/releases).
## Status
[![ci-remote-image](https://github.com/zammad/zammad-docker-compose/actions/workflows/ci-remote-image.yaml/badge.svg)](https://github.com/zammad/zammad-docker-compose/actions/workflows/ci-remote-image.yaml) [![Dockerhub Pulls](https://badgen.net/docker/pulls/zammad/zammad-docker-compose?icon=docker&label=pulls)](https://hub.docker.com/r/zammad/zammad-docker-compose/)
## Using a reverse proxy ## Using a reverse proxy
In environments with more then one web applications it is necessary to use a reverse proxy to route connections to port 80 and 443 to the right application. In environments with more then one web applications it is necessary to use a reverse proxy to route connections to port 80 and 443 to the right application.
To run Zammad behind a reverse proxy, we provide `docker-compose.proxy-example.yml` as a starting point. To run Zammad behind a revers proxy, we provide `docker-compose.proxy-example.yml` as a starting point.
1. Copy `./.examples/proxy/docker-compose.proxy-example.yml` to your own configuration, e.g. `./docker-compose.prod.yml` 1. Copy `./.examples/proxy/docker-compose.proxy-example.yml` to your own configuration, e.g. `./docker-compose.prod.yml`
`cp ./.examples/proxy/docker-compose.proxy-example.yml ./docker-compose.prod.yml` `cp ./.examples/proxy/docker-compose.proxy-example.yml ./docker-compose.prod.yml`
@ -49,4 +42,31 @@ RANCHER_URL=http://RANCHER_HOST:8080 rancher-compose --env-file=.env up
Elasticsearch is an optional, but strongly recommended dependency for Zammad. More details can be found in the [documentation](https://docs.zammad.org/en/latest/prerequisites/software.html#elasticsearch-optional). There are however certain scenarios when running without Elasticsearch may be desired, e.g. for very small teams, for teams with limited budget or as a temporary solution for an unplanned Elasticsearch downtime or planned cluster upgrade. Elasticsearch is an optional, but strongly recommended dependency for Zammad. More details can be found in the [documentation](https://docs.zammad.org/en/latest/prerequisites/software.html#elasticsearch-optional). There are however certain scenarios when running without Elasticsearch may be desired, e.g. for very small teams, for teams with limited budget or as a temporary solution for an unplanned Elasticsearch downtime or planned cluster upgrade.
Elasticsearch is enabled by default in the example `docker-compose.yml` file. It is also by default required to run the "zammad-init" command. Disabling Elasticsearch is possible by setting a special environment variable: `ELASTICSEARCH_ENABLED=false` for the `zammad-init` container and removing all references to Elasticsearch everywhere else: the `zammad-elasticsearch` container, its volume and links to it. Elasticsearch is enabled by default in the example `docker-compose.yml` file. It is also by default required to run the "zammad-init" command. Disabling Elasticsearch is possible by setting a special environment variable: `ELASTICSEARCH_ENABLED=false` for the `zammad-init` container and removing all references to Elasticsearch everywhere else: the `zammad-elasticsearch` container, it's volume and links to it.
## Upgrading
### From =< 3.3.0-12
We've updated the Elasticsearch image from 5.6 to 7.6.
As there is no direct upgrade path we have to delete all Elasticsearch indices and rebuild them.
Do the following to empty the ES docker volume:
```console
docker-compose stop
set -o pipefail DOCKER_VOLUME="$(docker volume inspect zammaddockercompose_elasticsearch-data | grep Mountpoint | sed -e 's#.*": "##g' -e 's#",##')/*"
echo "${DOCKER_VOLUME}" #check this is a valid docker volume path! if not do not proceed or you might lose data!
rm -r $(docker volume inspect zammaddockercompose_elasticsearch-data | grep Mountpoint | sed -e 's#.*": "##g' -e 's#",##')/*
docker-compose start
```
To workaround the [changes in the PostgreSQL 9.6 container](https://github.com/docker-library/postgres/commit/f1bc8782e7e57cc403d0b32c0e24599535859f76) do the following:
```console
docker-compose start
docker exec -it zammaddockercompose_zammad-postgresql_1 bash
psql --username postgres --dbname zammad_production
CREATE USER zammad;
ALTER USER zammad WITH PASSWORD 'zammad';
ALTER USER zammad WITH SUPERUSER CREATEDB;
```

View File

@ -0,0 +1,17 @@
FROM docker.elastic.co/elasticsearch/elasticsearch-oss:7.10.1
ARG BUILD_DATE
LABEL org.label-schema.build-date="$BUILD_DATE" \
org.label-schema.name="Zammad" \
org.label-schema.license="AGPL-3.0" \
org.label-schema.description="Docker container for Zammad - Elasticsearch" \
org.label-schema.url="https://zammad.org" \
org.label-schema.vcs-url="https://github.com/zammad/zammad" \
org.label-schema.vcs-type="Git" \
org.label-schema.vendor="Zammad" \
org.label-schema.schema-version="3.6.0" \
org.label-schema.docker.cmd="sysctl -w vm.max_map_count=262144;docker-compose up"
SHELL ["/bin/bash", "-e", "-o", "pipefail", "-c"]
RUN /usr/share/elasticsearch/bin/elasticsearch-plugin install --batch ingest-attachment

View File

@ -0,0 +1,20 @@
FROM postgres:9.6.20-alpine
ARG BUILD_DATE
LABEL org.label-schema.build-date="$BUILD_DATE" \
org.label-schema.name="Zammad" \
org.label-schema.license="AGPL-3.0" \
org.label-schema.description="Docker container for Zammad - Postgresql" \
org.label-schema.url="https://zammad.org" \
org.label-schema.vcs-url="https://github.com/zammad/zammad" \
org.label-schema.vcs-type="Git" \
org.label-schema.vendor="Zammad" \
org.label-schema.schema-version="3.6.0" \
org.label-schema.docker.cmd="sysctl -w vm.max_map_count=262144;docker-compose up"
SHELL ["/bin/bash", "-e", "-o", "pipefail", "-c"]
# copy backup script
COPY containers/zammad-postgresql/backup.sh /usr/local/bin/
RUN chmod +x /usr/local/bin/backup.sh

View File

@ -2,7 +2,7 @@
set -e set -e
: "${ZAMMAD_DIR:=/opt/zammad/var}" : "${ZAMMAD_DIR:=/opt/zammad}"
: "${BACKUP_DIR:=/var/tmp/zammad}" : "${BACKUP_DIR:=/var/tmp/zammad}"
: "${ZAMMAD_RAILSSERVER_HOST:=zammad-railsserver}" : "${ZAMMAD_RAILSSERVER_HOST:=zammad-railsserver}"
: "${ZAMMAD_RAILSSERVER_PORT:=3000}" : "${ZAMMAD_RAILSSERVER_PORT:=3000}"
@ -11,7 +11,7 @@ set -e
: "${POSTGRESQL_DB:=zammad_production}" : "${POSTGRESQL_DB:=zammad_production}"
function check_railsserver_available { function check_railsserver_available {
until (echo > "/dev/tcp/$ZAMMAD_RAILSSERVER_HOST/$ZAMMAD_RAILSSERVER_PORT") &> /dev/null; do until (echo > /dev/tcp/${ZAMMAD_RAILSSERVER_HOST}/${ZAMMAD_RAILSSERVER_PORT}) &> /dev/null; do
echo "waiting for railsserver to be ready..." echo "waiting for railsserver to be ready..."
sleep 60 sleep 60
done done
@ -24,7 +24,7 @@ function zammad_backup {
# delete old backups # delete old backups
if [ -d "${BACKUP_DIR}" ] && [ -n "$(ls "${BACKUP_DIR}")" ]; then if [ -d "${BACKUP_DIR}" ] && [ -n "$(ls "${BACKUP_DIR}")" ]; then
find "${BACKUP_DIR}"/*_zammad_*.gz -type f -mtime +"${HOLD_DAYS}" -delete find "${BACKUP_DIR}"/*_zammad_*.gz -type f -mtime +"${HOLD_DAYS}" -exec rm {} \;
fi fi
if [ "${NO_FILE_BACKUP}" != "yes" ]; then if [ "${NO_FILE_BACKUP}" != "yes" ]; then
@ -34,8 +34,6 @@ function zammad_backup {
#db backup #db backup
pg_dump --dbname=postgresql://"${POSTGRESQL_USER}:${POSTGRESQL_PASSWORD}@${POSTGRESQL_HOST}:${POSTGRESQL_PORT}/${POSTGRESQL_DB}" | gzip > "${BACKUP_DIR}"/"${TIMESTAMP}"_zammad_db.psql.gz pg_dump --dbname=postgresql://"${POSTGRESQL_USER}:${POSTGRESQL_PASSWORD}@${POSTGRESQL_HOST}:${POSTGRESQL_PORT}/${POSTGRESQL_DB}" | gzip > "${BACKUP_DIR}"/"${TIMESTAMP}"_zammad_db.psql.gz
echo "backup finished :)"
} }
if [ "$1" = 'zammad-backup' ]; then if [ "$1" = 'zammad-backup' ]; then
@ -43,15 +41,10 @@ if [ "$1" = 'zammad-backup' ]; then
check_railsserver_available check_railsserver_available
while true; do while true; do
NOW_TIMESTAMP=$(date +%s)
TOMORROW_DATE=$(date -d@"$((NOW_TIMESTAMP + 24*60*60))" +%Y-%m-%d)
zammad_backup zammad_backup
NEXT_TIMESTAMP=$(date -d "$TOMORROW_DATE $BACKUP_TIME" +%s) # wait until next backup
NOW_TIMESTAMP=$(date +%s) sleep "${BACKUP_SLEEP}"
sleep $((NEXT_TIMESTAMP - NOW_TIMESTAMP))
done done
fi fi

View File

@ -0,0 +1,63 @@
FROM ruby:2.6.6-slim AS builder
# note: zammad is currently incompatible to alpine because of:
# https://github.com/docker-library/ruby/issues/113
ARG BUILD_DATE
ARG DEBIAN_FRONTEND=noninteractive
ENV GIT_BRANCH stable
ENV GIT_URL ${PROJECT_URL}.git
ENV PROJECT_URL https://github.com/zammad/zammad
ENV RAILS_ENV production
ENV TAR_GZ_URL ${PROJECT_URL}/archive/${GIT_BRANCH}.tar.gz
ENV ZAMMAD_DIR /opt/zammad
ENV ZAMMAD_READY_FILE ${ZAMMAD_DIR}/tmp/zammad.ready
ENV ZAMMAD_TMP_DIR /tmp/zammad-${GIT_BRANCH}
ENV ZAMMAD_USER zammad
SHELL ["/bin/bash", "-e", "-o", "pipefail", "-c"]
# install zammad
COPY containers/zammad/setup.sh /tmp
RUN chmod +x /tmp/setup.sh; \
/tmp/setup.sh builder
FROM ruby:2.6.6-slim
ARG BUILD_DATE
ARG DEBIAN_FRONTEND=noninteractive
LABEL org.label-schema.build-date="$BUILD_DATE" \
org.label-schema.name="Zammad" \
org.label-schema.license="AGPL-3.0" \
org.label-schema.description="Docker container for Zammad - Data Container" \
org.label-schema.url="https://zammad.org" \
org.label-schema.vcs-url="https://github.com/zammad/zammad" \
org.label-schema.vcs-type="Git" \
org.label-schema.vendor="Zammad" \
org.label-schema.schema-version="3.6.0" \
org.label-schema.docker.cmd="sysctl -w vm.max_map_count=262144;docker-compose up"
ENV GIT_BRANCH stable
ENV RAILS_ENV production
ENV ZAMMAD_DIR /opt/zammad
ENV ZAMMAD_READY_FILE ${ZAMMAD_DIR}/tmp/zammad.ready
ENV ZAMMAD_TMP_DIR /tmp/zammad-${GIT_BRANCH}
ENV ZAMMAD_USER zammad
COPY containers/zammad/setup.sh /tmp
RUN chmod +x /tmp/setup.sh; \
/tmp/setup.sh runner
COPY --from=builder ${ZAMMAD_TMP_DIR} ${ZAMMAD_TMP_DIR}
COPY --from=builder /usr/local/bundle /usr/local/bundle
# docker init
COPY containers/zammad/docker-entrypoint.sh /
RUN chmod +x /docker-entrypoint.sh
ENTRYPOINT ["/docker-entrypoint.sh"]
USER zammad
WORKDIR ${ZAMMAD_DIR}

View File

@ -0,0 +1,171 @@
#!/usr/bin/env bash
set -e
: "${AUTOWIZARD_JSON:=''}"
: "${ELASTICSEARCH_ENABLED:=true}"
: "${ELASTICSEARCH_HOST:=zammad-elasticsearch}"
: "${ELASTICSEARCH_PORT:=9200}"
: "${ELASTICSEARCH_SCHEMA:=http}"
: "${ELASTICSEARCH_NAMESPACE:=zammad}"
: "${ELASTICSEARCH_REINDEX:=true}"
: "${ELASTICSEARCH_SSL_VERIFY:=true}"
: "${MEMCACHED_HOST:=zammad-memcached}"
: "${MEMCACHED_PORT:=11211}"
: "${NGINX_SERVER_NAME:=_}"
: "${NGINX_SERVER_SCHEME:=\$scheme}"
: "${POSTGRESQL_HOST:=zammad-postgresql}"
: "${POSTGRESQL_PORT:=5432}"
: "${POSTGRESQL_USER:=zammad}"
: "${POSTGRESQL_PASS:=zammad}"
: "${POSTGRESQL_DB:=zammad_production}"
: "${POSTGRESQL_DB_CREATE:=true}"
: "${RAILS_TRUSTED_PROXIES:=['127.0.0.1', '::1']}"
: "${RSYNC_ADDITIONAL_PARAMS:=--no-perms --no-owner}"
: "${ZAMMAD_RAILSSERVER_HOST:=zammad-railsserver}"
: "${ZAMMAD_RAILSSERVER_PORT:=3000}"
: "${ZAMMAD_WEBSOCKET_HOST:=zammad-websocket}"
: "${ZAMMAD_WEBSOCKET_PORT:=6042}"
function check_zammad_ready {
sleep 15
until [ -f "${ZAMMAD_READY_FILE}" ]; do
echo "waiting for init container to finish install or update..."
sleep 10
done
}
# zammad init
if [ "$1" = 'zammad-init' ]; then
# install / update zammad
test -f "${ZAMMAD_READY_FILE}" && rm "${ZAMMAD_READY_FILE}"
# shellcheck disable=SC2086
rsync -a ${RSYNC_ADDITIONAL_PARAMS} --delete --exclude 'public/assets/images/*' --exclude 'storage/fs/*' "${ZAMMAD_TMP_DIR}/" "${ZAMMAD_DIR}"
# shellcheck disable=SC2086
rsync -a ${RSYNC_ADDITIONAL_PARAMS} "${ZAMMAD_TMP_DIR}"/public/assets/images/ "${ZAMMAD_DIR}"/public/assets/images
until (echo > /dev/tcp/"${POSTGRESQL_HOST}"/"${POSTGRESQL_PORT}") &> /dev/null; do
echo "zammad railsserver waiting for postgresql server to be ready..."
sleep 5
done
cd "${ZAMMAD_DIR}"
# configure database
sed -e "s#.*adapter:.*# adapter: postgresql#g" -e "s#.*database:.*# database: ${POSTGRESQL_DB}#g" -e "s#.*username:.*# username: ${POSTGRESQL_USER}#g" -e "s#.*password:.*# password: ${POSTGRESQL_PASS}\\n host: ${POSTGRESQL_HOST}\\n port: ${POSTGRESQL_PORT}#g" < contrib/packager.io/database.yml.pkgr > config/database.yml
# configure memcache
sed -i -e "s/.*config.cache_store.*file_store.*cache_file_store.*/ config.cache_store = :dalli_store, '${MEMCACHED_HOST}:${MEMCACHED_PORT}'\\n config.session_store = :dalli_store, '${MEMCACHED_HOST}:${MEMCACHED_PORT}'/" config/application.rb
# configure trusted proxies
sed -i -e "s#config.action_dispatch.trusted_proxies =.*#config.action_dispatch.trusted_proxies = ${RAILS_TRUSTED_PROXIES}#" config/environments/production.rb
# check if database exists / update to new version
echo "initialising / updating database..."
if ! (bundle exec rails r 'puts User.any?' 2> /dev/null | grep -q true); then
if [ "${POSTGRESQL_DB_CREATE}" == "true" ]; then
bundle exec rake db:create
fi
bundle exec rake db:migrate
bundle exec rake db:seed
# create autowizard.json on first install
if [ -n "${AUTOWIZARD_JSON}" ]; then
echo "${AUTOWIZARD_JSON}" | base64 -d > auto_wizard.json
fi
else
bundle exec rake db:migrate
fi
# es config
echo "changing settings..."
if [ "${ELASTICSEARCH_ENABLED}" == "false" ]; then
bundle exec rails r "Setting.set('es_url', '')"
else
bundle exec rails r "Setting.set('es_url', '${ELASTICSEARCH_SCHEMA}://${ELASTICSEARCH_HOST}:${ELASTICSEARCH_PORT}')"
bundle exec rails r "Setting.set('es_index', '${ELASTICSEARCH_NAMESPACE}')"
if [ -n "${ELASTICSEARCH_USER}" ] && [ -n "${ELASTICSEARCH_PASS}" ]; then
bundle exec rails r "Setting.set('es_user', \"${ELASTICSEARCH_USER}\")"
bundle exec rails r "Setting.set('es_password', \"${ELASTICSEARCH_PASS}\")"
fi
until (echo > /dev/tcp/${ELASTICSEARCH_HOST}/${ELASTICSEARCH_PORT}) &> /dev/null; do
echo "zammad railsserver waiting for elasticsearch server to be ready..."
sleep 5
done
if [ "${ELASTICSEARCH_SSL_VERIFY}" == "false" ]; then
SSL_SKIP_VERIFY="-k"
else
SSL_SKIP_VERIFY=""
fi
if [ "${ELASTICSEARCH_REINDEX}" == "true" ]; then
if ! curl -s "${SSL_SKIP_VERIFY}" "${ELASTICSEARCH_SCHEMA}://${ELASTICSEARCH_HOST}:${ELASTICSEARCH_PORT}/_cat/indices" | grep -q zammad; then
echo "rebuilding es searchindex..."
bundle exec rake searchindex:rebuild
fi
fi
fi
# create install ready file
echo 'zammad-init' > "${ZAMMAD_READY_FILE}"
fi
# zammad nginx
if [ "$1" = 'zammad-nginx' ]; then
check_zammad_ready
# configure nginx
sed -e "s#proxy_set_header X-Forwarded-Proto .*;#proxy_set_header X-Forwarded-Proto ${NGINX_SERVER_SCHEME};#g" \
-e "s#server .*:3000#server ${ZAMMAD_RAILSSERVER_HOST}:${ZAMMAD_RAILSSERVER_PORT}#g" \
-e "s#server .*:6042#server ${ZAMMAD_WEBSOCKET_HOST}:${ZAMMAD_WEBSOCKET_PORT}#g" \
-e "s#server_name .*#server_name ${NGINX_SERVER_NAME};#g" \
-e 's#/var/log/nginx/zammad.\(access\|error\).log#/dev/stdout#g' < contrib/nginx/zammad.conf > /etc/nginx/sites-enabled/default
echo "starting nginx..."
exec /usr/sbin/nginx -g 'daemon off;'
fi
# zammad-railsserver
if [ "$1" = 'zammad-railsserver' ]; then
test -f /opt/zammad/tmp/pids/server.pid && rm /opt/zammad/tmp/pids/server.pid
check_zammad_ready
cd "${ZAMMAD_DIR}"
echo "starting railsserver..."
#shellcheck disable=SC2101
exec bundle exec rails server puma -b [::] -p "${ZAMMAD_RAILSSERVER_PORT}" -e "${RAILS_ENV}"
fi
# zammad-scheduler
if [ "$1" = 'zammad-scheduler' ]; then
check_zammad_ready
cd "${ZAMMAD_DIR}"
echo "starting scheduler..."
exec bundle exec script/scheduler.rb run
fi
# zammad-websocket
if [ "$1" = 'zammad-websocket' ]; then
check_zammad_ready
cd "${ZAMMAD_DIR}"
echo "starting websocket server..."
exec bundle exec script/websocket-server.rb -b 0.0.0.0 -p "${ZAMMAD_WEBSOCKET_PORT}" start
fi

44
containers/zammad/setup.sh Executable file
View File

@ -0,0 +1,44 @@
#!/usr/bin/env bash
set -e
# install dependencies
if [ "$1" = 'builder' ]; then
PACKAGES="build-essential curl git libimlib2-dev libpq-dev"
elif [ "$1" = 'runner' ]; then
PACKAGES="curl libimlib2 libpq5 nginx rsync"
fi
apt-get update
apt-get upgrade -y
# shellcheck disable=SC2086
apt-get install -y --no-install-recommends ${PACKAGES}
rm -rf /var/lib/apt/lists/*
# install zammad
groupadd -g 1000 "${ZAMMAD_USER}"
useradd -M -d "${ZAMMAD_DIR}" -s /bin/bash -u 1000 -g 1000 "${ZAMMAD_USER}"
if [ "$1" = 'builder' ]; then
cd "$(dirname "${ZAMMAD_TMP_DIR}")"
curl -s -J -L -O "${TAR_GZ_URL}"
tar -xzf zammad-"${GIT_BRANCH}".tar.gz
rm zammad-"${GIT_BRANCH}".tar.gz
cd "${ZAMMAD_TMP_DIR}"
bundle install --without test development mysql
contrib/packager.io/fetch_locales.rb
sed -e 's#.*adapter: postgresql# adapter: nulldb#g' -e 's#.*username:.*# username: postgres#g' -e 's#.*password:.*# password: \n host: zammad-postgresql\n#g' < contrib/packager.io/database.yml.pkgr > config/database.yml
sed -i "/require 'rails\/all'/a require\ 'nulldb'" config/application.rb
sed -i '/# Use a different logger for distributed setups./a \ \ config.logger = Logger.new(STDOUT)' config/environments/production.rb
sed -i 's/.*scheduler_\(err\|out\).log.*//g' script/scheduler.rb
touch db/schema.rb
bundle exec rake assets:precompile
rm -r tmp/cache
chown -R "${ZAMMAD_USER}":"${ZAMMAD_USER}" "${ZAMMAD_TMP_DIR}"
fi
# set nginx file permissions and settings
if [ "$1" = 'runner' ]; then
sed -i -e "s#user www-data;##g" -e 's#/var/log/nginx/\(access\|error\).log#/dev/stdout#g' -e 's#pid /run/nginx.pid;#pid /tmp/nginx.pid;#g' /etc/nginx/nginx.conf
mkdir -p "${ZAMMAD_DIR}" /var/log/nginx
chown -R "${ZAMMAD_USER}":"${ZAMMAD_USER}" /etc/nginx "${ZAMMAD_DIR}" /var/lib/nginx /var/log/nginx
fi

View File

@ -1,19 +0,0 @@
---
version: '3'
services:
zammad-init:
image: zammad-local
zammad-nginx:
image: zammad-local
zammad-railsserver:
image: zammad-local
zammad-scheduler:
image: zammad-local
zammad-websocket:
image: zammad-local

View File

@ -1,8 +1,6 @@
--- version: '2'
version: '3'
services: services:
zammad-nginx: zammad-nginx:
ports: ports:
- "8080:8080" - "80:80"

View File

@ -1,5 +1,4 @@
--- version: '2'
version: '3.8'
services: services:
@ -7,65 +6,67 @@ services:
command: ["zammad-backup"] command: ["zammad-backup"]
depends_on: depends_on:
- zammad-railsserver - zammad-railsserver
- zammad-postgresql
entrypoint: /usr/local/bin/backup.sh entrypoint: /usr/local/bin/backup.sh
environment: environment:
- BACKUP_TIME=03:00 - BACKUP_SLEEP=86400
- HOLD_DAYS=10 - HOLD_DAYS=10
- POSTGRESQL_DB=${POSTGRES_DB}
- POSTGRESQL_USER=${POSTGRES_USER} - POSTGRESQL_USER=${POSTGRES_USER}
- POSTGRESQL_PASSWORD=${POSTGRES_PASS} - POSTGRESQL_PASSWORD=${POSTGRES_PASS}
- TZ=Europe/Berlin image: ${IMAGE_REPO}:zammad-postgresql${VERSION}
image: postgres:${POSTGRES_VERSION} links:
- zammad-postgresql
restart: ${RESTART} restart: ${RESTART}
volumes: volumes:
- zammad-backup:/var/tmp/zammad - zammad-backup:/var/tmp/zammad
- zammad-var:/opt/zammad/var:ro - zammad-data:/opt/zammad
- ./scripts/backup.sh:/usr/local/bin/backup.sh:ro
zammad-elasticsearch: zammad-elasticsearch:
image: bitnami/elasticsearch:${ELASTICSEARCH_VERSION} environment:
- discovery.type=single-node
image: ${IMAGE_REPO}:zammad-elasticsearch${VERSION}
restart: ${RESTART} restart: ${RESTART}
volumes: volumes:
- elasticsearch-data:/bitnami/elasticsearch/data - elasticsearch-data:/usr/share/elasticsearch/data
zammad-init: zammad-init:
command: ["zammad-init"] command: ["zammad-init"]
depends_on: depends_on:
- zammad-postgresql - zammad-postgresql
environment: environment:
- MEMCACHE_SERVERS=${MEMCACHE_SERVERS} - POSTGRESQL_USER=${POSTGRES_USER}
- REDIS_URL=${REDIS_URL} - POSTGRESQL_PASS=${POSTGRES_PASS}
image: ${IMAGE_REPO}:${VERSION} image: ${IMAGE_REPO}:zammad${VERSION}
links:
- zammad-elasticsearch
- zammad-postgresql
restart: on-failure restart: on-failure
user: 0:0
volumes: volumes:
- zammad-config-nginx:/etc/nginx/sites-enabled - zammad-data:/opt/zammad
- zammad-var:/opt/zammad/var
zammad-memcached: zammad-memcached:
command: memcached -m 256M command: memcached -m 256M
image: memcached:${MEMCACHE_VERSION} image: memcached:1.6.9-alpine
restart: ${RESTART} restart: ${RESTART}
zammad-nginx: zammad-nginx:
command: ["zammad-nginx"] command: ["zammad-nginx"]
expose: expose:
- "8080" - "80"
depends_on: depends_on:
- zammad-railsserver - zammad-railsserver
image: ${IMAGE_REPO}:${VERSION} image: ${IMAGE_REPO}:zammad${VERSION}
links:
- zammad-railsserver
- zammad-websocket
restart: ${RESTART} restart: ${RESTART}
volumes: volumes:
- zammad-config-nginx:/etc/nginx/sites-enabled:ro - zammad-data:/opt/zammad
- zammad-var:/opt/zammad/var:ro
zammad-postgresql: zammad-postgresql:
environment: environment:
- POSTGRES_DB=${POSTGRES_DB}
- POSTGRES_USER=${POSTGRES_USER} - POSTGRES_USER=${POSTGRES_USER}
- POSTGRES_PASSWORD=${POSTGRES_PASS} - POSTGRES_PASSWORD=${POSTGRES_PASS}
image: postgres:${POSTGRES_VERSION} image: ${IMAGE_REPO}:zammad-postgresql${VERSION}
restart: ${RESTART} restart: ${RESTART}
volumes: volumes:
- postgresql-data:/var/lib/postgresql/data - postgresql-data:/var/lib/postgresql/data
@ -75,59 +76,48 @@ services:
depends_on: depends_on:
- zammad-memcached - zammad-memcached
- zammad-postgresql - zammad-postgresql
- zammad-redis image: ${IMAGE_REPO}:zammad${VERSION}
environment: links:
- MEMCACHE_SERVERS=${MEMCACHE_SERVERS} - zammad-elasticsearch
- REDIS_URL=${REDIS_URL} - zammad-memcached
image: ${IMAGE_REPO}:${VERSION} - zammad-postgresql
restart: ${RESTART} restart: ${RESTART}
volumes: volumes:
- zammad-var:/opt/zammad/var - zammad-data:/opt/zammad
zammad-redis:
image: redis:${REDIS_VERSION}
restart: ${RESTART}
volumes:
- redis-data:/data
zammad-scheduler: zammad-scheduler:
command: ["zammad-scheduler"] command: ["zammad-scheduler"]
depends_on: depends_on:
- zammad-memcached - zammad-memcached
- zammad-railsserver - zammad-railsserver
- zammad-redis image: ${IMAGE_REPO}:zammad${VERSION}
environment: links:
- MEMCACHE_SERVERS=${MEMCACHE_SERVERS} - zammad-elasticsearch
- REDIS_URL=${REDIS_URL} - zammad-memcached
image: ${IMAGE_REPO}:${VERSION} - zammad-postgresql
restart: ${RESTART} restart: ${RESTART}
volumes: volumes:
- zammad-var:/opt/zammad/var - zammad-data:/opt/zammad
zammad-websocket: zammad-websocket:
command: ["zammad-websocket"] command: ["zammad-websocket"]
depends_on: depends_on:
- zammad-memcached - zammad-memcached
- zammad-railsserver - zammad-railsserver
- zammad-redis image: ${IMAGE_REPO}:zammad${VERSION}
environment: links:
- MEMCACHE_SERVERS=${MEMCACHE_SERVERS} - zammad-postgresql
- REDIS_URL=${REDIS_URL} - zammad-memcached
image: ${IMAGE_REPO}:${VERSION}
restart: ${RESTART} restart: ${RESTART}
volumes: volumes:
- zammad-var:/opt/zammad/var - zammad-data:/opt/zammad
volumes: volumes:
elasticsearch-data: elasticsearch-data:
driver: local driver: local
postgresql-data: postgresql-data:
driver: local driver: local
redis-data:
driver: local
zammad-backup: zammad-backup:
driver: local driver: local
zammad-config-nginx: zammad-data:
driver: local
zammad-var:
driver: local driver: local

View File

@ -1,4 +1,3 @@
---
version: '2' version: '2'
services: services: