Compare commits

..

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

29 changed files with 484 additions and 382 deletions

20
.env
View File

@ -1,14 +1,8 @@
ELASTICSEARCH_VERSION=8.8.0
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_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
# don't forget to add the minus before the version
# example: VERSION=-3.2.0-12
IMAGE_REPO=zammad/zammad-docker-compose
VERSION=-3.2.0-13
RESTART=always
VERSION=6.0.0-66
POSTGRES_USER=zammad
POSTGRES_PASS=zammad
POSTGRES_DB=zammad_production

View File

@ -1,11 +1,9 @@
---
version: "2"
version: '2'
services:
zammad-nginx:
environment:
- VIRTUAL_HOST=helpdesk.domain.tld
- NGINX_SERVER_SCHEME=https
networks:
- default
- proxy_2_zammad

View File

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

View File

@ -8,20 +8,23 @@ Hi there - thanks for filling an issue. Please ensure the following things befor
* The upper textblock will be removed automatically when you submit your issue *
-->
# Infos
### Infos:
* Docker version:
* Docker-compose version:
* Operating system (Docker host):
# Expected behavior
### Expected behavior:
*
# Actual behavior
### Actual behavior:
*
# Steps to reproduce the behavior
### Steps to reproduce the behavior:
*

View File

@ -1,31 +0,0 @@
{
"Token": "docker_compose_token",
"TextModuleLocale": {
"Locale": "en-us"
},
"Users": [
{
"login": "info@zammad.org",
"firstname": "Zam",
"lastname": "Mad",
"email": "info@zammad.org",
"organization": "Zammad",
"password": "Zammad"
}
],
"Settings": [
{
"name": "product_name",
"value": "Zammad Service Desk"
},
{
"name": "system_online_service",
"value": true
}
],
"Organizations": [
{
"name": "Zammad"
}
]
}

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"

View File

@ -1,3 +0,0 @@
---
MD013:
line_length: 600

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

18
.github/stale.yml vendored
View File

@ -1,18 +0,0 @@
---
# Number of days of inactivity before an issue becomes stale
daysUntilStale: 60
# Number of days of inactivity before a stale issue is closed
daysUntilClose: 7
# Issues with these labels will never be considered stale
exemptLabels:
- pinned
- security
# Label to use when marking an issue as stale
staleLabel: wontfix
# Comment to post when marking an issue as stale. Set to `false` to disable
markComment: >
This issue has been automatically marked as stale because it has not had
recent activity. It will be closed if no further activity occurs. Thank you
for your contributions.
# Comment to post when closing a stale issue. Set to `false` to disable
closeComment: false

51
.github/tests.sh vendored
View File

@ -1,51 +0,0 @@
#!/bin/bash
#
# run zammad tests
#
set -o errexit
set -o pipefail
docker-compose logs --timestamps --follow &
until (curl -I --silent --fail localhost:8080 | grep -iq "HTTP/1.1 200 OK"); do
echo "wait for zammad to be ready..."
sleep 15
done
sleep 30
echo
echo "Success - Zammad is up :)"
echo
echo
echo "Execute autowizard..."
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
echo
echo "Autowizard executed successful :)"
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 "Fill DB with some random data"
echo
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 "DB fill successful :)"
echo

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 +0,0 @@
---
name: ci
on:
pull_request:
jobs:
lint-docker-compose-file:
runs-on: ubuntu-22.04
steps:
- name: Checkout
uses: actions/checkout@v3
- name: lint zammad docker-compose file
run: docker-compose config
super-linter:
runs-on: ubuntu-22.04
steps:
- name: Checkout Code
uses: actions/checkout@v3
with:
fetch-depth: 0
- name: Lint Code Base
uses: github/super-linter/slim@v5
env:
DEFAULT_BRANCH: master
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
LINTER_RULES_PATH: .github/linters
VALIDATE_ALL_CODEBASE: false
VALIDATE_JSCPD: false

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 }}

13
.travis.yml Normal file
View File

@ -0,0 +1,13 @@
dist: xenial
sudo: required
group: deprecated
services:
- docker
before_install:
- curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
- sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
- sudo apt-get update
- sudo apt-get -o Dpkg::Options::="--force-confnew" -y install docker-ce
- echo "${DOCKER_PASSWORD}" | docker login -u="${DOCKER_USERNAME}" --password-stdin
install: true
script: hooks/build

13
Dockerfile Normal file
View File

@ -0,0 +1,13 @@
MAINTAINER Zammad <info@zammad.org>
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.2.0" \
org.label-schema.docker.cmd="sysctl -w vm.max_map_count=262144;docker-compose up"

View File

@ -2,51 +2,55 @@
Zammad is a web based open source helpdesk/ticket system with many features
to manage customer communication via several channels like telephone, facebook,
twitter, chat and emails. 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?
twitter, chat and e-mails. It is distributed under the GNU AFFERO General Public
License (AGPL). Do you receive many e-mails and want to answer them with a team of agents?
You're going to love Zammad!
## Use cases
This repository is the starting point if you want to:
## What is zammad-docker-compose repo for?
- deploy Zammad in a containerized production environment
- test the current `stable` or `develop` versions of Zammad
This repo is meant to be the starting point for somebody who likes to use dockerized multi-container Zammad in production.
## Getting started
[Learn more on Zammads documentation](https://docs.zammad.org/en/latest/install/docker-compose.html)
## Getting started with zammad-docker-compose
## Upgrading
https://docs.zammad.org/en/latest/install-docker-compose.html
For upgrading instructions see our [Releases](https://github.com/zammad/zammad-docker-compose/releases).
## Status
## Build Status
[![Build Status](https://travis-ci.org/zammad/zammad-docker-compose.svg?branch=master)](https://travis-ci.org/zammad/zammad-docker-compose)
[![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
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`
2. Modify the environment variable `VIRTUAL_HOST` and the name of the external network in `./docker-compose.prod.yml` to fit your environment.
3. Run docker-composer commands with the default and your configuration, e.g. `docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d`
1. Modify the environment variable `VIRTUAL_HOST` and the name of the external network in `./docker-compose.prod.yml` to fit your environment.
1. Run docker-composer commands with the default and your configuration, e.g. `docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d`
See `.examples/proxy/docker-compose.yml` for an example proxy project.
Like this, you can add your `docker-compose.prod.yml` to a branch of your Git repository and stay up to date by merging changes to your branch.
## Using Rancher
```console
RANCHER_URL=http://RANCHER_HOST:8080 rancher-compose --env-file=.env up
* RANCHER_URL=http://RANCHER_HOST:8080 rancher-compose --env-file=.env up
## Upgrading
### From =< 3.2.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 indicies and rebuild them.
Do the following to empty the ES docker volume:
```
docker-compose stop
rm -r $(docker volume inspect zammaddockercompose_elasticsearch-data | grep Mountpoint | sed -e 's#.*": "##g' -e 's#",##')/*
docker-compose start
```
## Running without Elasticsearch
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.

View File

@ -0,0 +1,16 @@
FROM docker.elastic.co/elasticsearch/elasticsearch:7.6.0
MAINTAINER Zammad <info@zammad.org>
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.2.0" \
org.label-schema.docker.cmd="sysctl -w vm.max_map_count=262144;docker-compose up"
RUN yes | /usr/share/elasticsearch/bin/elasticsearch-plugin install ingest-attachment

View File

@ -0,0 +1,19 @@
FROM postgres:9.6.17-alpine
MAINTAINER Zammad <info@zammad.org>
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.2.0" \
org.label-schema.docker.cmd="sysctl -w vm.max_map_count=262144;docker-compose up"
# 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
: "${ZAMMAD_DIR:=/opt/zammad/var}"
: "${ZAMMAD_DIR:=/opt/zammad}"
: "${BACKUP_DIR:=/var/tmp/zammad}"
: "${ZAMMAD_RAILSSERVER_HOST:=zammad-railsserver}"
: "${ZAMMAD_RAILSSERVER_PORT:=3000}"
@ -11,7 +11,7 @@ set -e
: "${POSTGRESQL_DB:=zammad_production}"
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..."
sleep 60
done
@ -24,7 +24,7 @@ function zammad_backup {
# delete old backups
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
if [ "${NO_FILE_BACKUP}" != "yes" ]; then
@ -33,9 +33,7 @@ function zammad_backup {
fi
#db backup
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 :)"
pg_dump --dbname=postgresql://"${POSTGRESQL_USER}:${POSTGRESQL_PASSWORD}"@"${POSTGRESQL_HOST}":"${POSTGRESQL_PORT}"/"${POSTGRESQL_DB}" | gzip > "${BACKUP_DIR}"/"${TIMESTAMP}"_zammad_db.psql.gz
}
if [ "$1" = 'zammad-backup' ]; then
@ -43,15 +41,10 @@ if [ "$1" = 'zammad-backup' ]; then
check_railsserver_available
while true; do
NOW_TIMESTAMP=$(date +%s)
TOMORROW_DATE=$(date -d@"$((NOW_TIMESTAMP + 24*60*60))" +%Y-%m-%d)
zammad_backup
NEXT_TIMESTAMP=$(date -d "$TOMORROW_DATE $BACKUP_TIME" +%s)
NOW_TIMESTAMP=$(date +%s)
sleep $((NEXT_TIMESTAMP - NOW_TIMESTAMP))
# wait until next backup
sleep "${BACKUP_SLEEP}"
done
fi

View File

@ -0,0 +1,63 @@
FROM ruby:2.5.5-slim AS builder
# note: zammad is currently incompatible to alpine because of:
# https://github.com/docker-library/ruby/issues/113
MAINTAINER Zammad <info@zammad.org>
ARG BUILD_DATE
ARG DEBIAN_FRONTEND=noninteractive
ENV GIT_BRANCH stable
ENV GIT_URL ${PROJECT_URL}.git
ENV GOSU_VERSION 1.11
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
# install zammad
COPY containers/zammad/setup.sh /tmp
RUN chmod +x /tmp/setup.sh; \
/tmp/setup.sh install
FROM ruby:2.5.5-slim
MAINTAINER Zammad <info@zammad.org>
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.2.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 run
COPY --from=builder ${ZAMMAD_TMP_DIR} ${ZAMMAD_TMP_DIR}
COPY --from=builder /usr/local/bin/gosu /usr/local/bin/gosu
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"]
WORKDIR ${ZAMMAD_DIR}

View File

@ -0,0 +1,166 @@
#!/usr/bin/env bash
set -e
: "${AUTOWIZARD_JSON:=''}"
: "${ELASTICSEARCH_HOST:=zammad-elasticsearch}"
: "${ELASTICSEARCH_PORT:=9200}"
: "${ELASTICSEARCH_SCHEMA:=http}"
: "${ELASTICSEARCH_SSL_VERIFY:=true}"
: "${MEMCACHED_HOST:=zammad-memcached}"
: "${MEMCACHED_PORT:=11211}"
: "${POSTGRESQL_HOST:=zammad-postgresql}"
: "${POSTGRESQL_PORT:=5432}"
: "${POSTGRESQL_USER:=zammad}"
: "${POSTGRESQL_PASS:=zammad}"
: "${POSTGRESQL_DB:=zammad_production}"
: "${POSTGRESQL_DB_CREATE:=true}"
: "${ZAMMAD_RAILSSERVER_HOST:=zammad-railsserver}"
: "${ZAMMAD_RAILSSERVER_PORT:=3000}"
: "${ZAMMAD_WEBSOCKET_HOST:=zammad-websocket}"
: "${ZAMMAD_WEBSOCKET_PORT:=6042}"
: "${NGINX_SERVER_NAME:=_}"
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}"
rsync -a --delete --exclude 'public/assets/images/*' --exclude 'storage/fs/*' "${ZAMMAD_TMP_DIR}/" "${ZAMMAD_DIR}"
rsync -a "${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
echo "initialising / updating database..."
# check if database exists / update to new version
set +e
bundle exec rake db:migrate &> /dev/null
DB_MIGRATE="$?"
# check if database is populated
if [ "${DB_MIGRATE}" == "0" ]; then
bundle exec rails r "Setting.set('es_url', '${ELASTICSEARCH_SCHEMA}://${ELASTICSEARCH_HOST}:${ELASTICSEARCH_PORT}')" &> /dev/null
DB_SETTINGS="$?"
fi
set -e
# create database if not exists
if [ "${DB_MIGRATE}" != "0" ] && [ "${POSTGRESQL_DB_CREATE}" == "true" ]; then
echo "creating database..."
bundle exec rake db:create
fi
# populate database and create autowizard.json on first install
if [ "${DB_SETTINGS}" != "0" ]; then
echo "seeding database..."
bundle exec rake db:seed
if [ -n "${AUTOWIZARD_JSON}" ]; then
echo "${AUTOWIZARD_JSON}" | base64 -d > auto_wizard.json
fi
fi
# es config
echo "changing settings..."
bundle exec rails r "Setting.set('es_url', '${ELASTICSEARCH_SCHEMA}://${ELASTICSEARCH_HOST}:${ELASTICSEARCH_PORT}')"
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 ! 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
# chown everything to zammad user
chown -R "${ZAMMAD_USER}":"${ZAMMAD_USER}" "${ZAMMAD_DIR}"
# create install ready file
su -c "echo 'zammad-init' > ${ZAMMAD_READY_FILE}" "${ZAMMAD_USER}"
fi
# zammad nginx
if [ "$1" = 'zammad-nginx' ]; then
check_zammad_ready
# configure nginx
if ! env | grep -q KUBERNETES; then
sed -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
fi
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 gosu "${ZAMMAD_USER}":"${ZAMMAD_USER}" 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 gosu "${ZAMMAD_USER}":"${ZAMMAD_USER}" 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 gosu "${ZAMMAD_USER}":"${ZAMMAD_USER}" bundle exec script/websocket-server.rb -b 0.0.0.0 -p "${ZAMMAD_WEBSOCKET_PORT}" start
fi

View File

@ -0,0 +1,43 @@
#!/usr/bin/env bash
set -e
# install dependencies
if [ "$1" = 'install' ]; then
PACKAGES="build-essential curl git libimlib2-dev libpq-dev"
elif [ "$1" = 'run' ]; then
PACKAGES="curl libimlib2 libpq5 nginx rsync"
fi
apt-get update
apt-get upgrade -y
apt-get install -y --no-install-recommends ${PACKAGES}
rm -rf /var/lib/apt/lists/*
# install gosu
if [ "$1" = 'install' ]; then
curl -s -J -L -o /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/${GOSU_VERSION}/gosu-$(dpkg --print-architecture)"
chmod +x /usr/local/bin/gosu
gosu nobody true
fi
# install zammad
groupadd -g 1000 "${ZAMMAD_USER}"
useradd -M -d "${ZAMMAD_DIR}" -s /bin/bash -u 1000 -g 1000 "${ZAMMAD_USER}"
if [ "$1" = 'install' ]; 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

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: '3'
version: '2'
services:
zammad-nginx:
ports:
- "8080:8080"
- "80:80"

View File

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

37
hooks/build Executable file
View File

@ -0,0 +1,37 @@
#!/bin/bash
#
# build hook for dockerhubs autobuild feature
#
set -e
. "hooks/config"
#shellcheck disable=SC2153
for DOCKER_IMAGE in ${DOCKER_IMAGES}; do
if [ "${TRAVIS}" == 'true' ] || [ "${CIRCLECI}" == 'true' ]; then
if [ -n "${ZAMMAD_VERSION}" ]; then
DOCKER_TAG="-t ${DOCKER_REGISTRY}/${GITHUB_USERNAME}/${DOCKER_REPOSITORY}:${DOCKER_IMAGE}-${ZAMMAD_VERSION}"
else
ZAMMAD_VERSION="latest"
fi
echo "Build Zammad Docker image ${DOCKER_IMAGE} with version ${ZAMMAD_VERSION} for DockerHubs ${DOCKER_REGISTRY}/${GITHUB_USERNAME}/${DOCKER_REPOSITORY}:${DOCKER_IMAGE} repo"
docker build --pull --no-cache --build-arg BUILD_DATE="$(date -u +'%Y-%m-%dT%H:%M:%SZ')" -t ${DOCKER_REGISTRY}/${GITHUB_USERNAME}/${DOCKER_REPOSITORY}:${DOCKER_IMAGE} -t ${DOCKER_REGISTRY}/${GITHUB_USERNAME}/${DOCKER_REPOSITORY}:${DOCKER_IMAGE}-latest ${DOCKER_TAG} -f containers/${DOCKER_IMAGE}/Dockerfile .
docker push ${DOCKER_REGISTRY}/${GITHUB_USERNAME}/${DOCKER_REPOSITORY}:${DOCKER_IMAGE}
docker push ${DOCKER_REGISTRY}/${GITHUB_USERNAME}/${DOCKER_REPOSITORY}:${DOCKER_IMAGE}-latest
if [ "${ZAMMAD_VERSION}" != "latest" ]; then
docker push ${DOCKER_REGISTRY}/${GITHUB_USERNAME}/${DOCKER_REPOSITORY}:${DOCKER_IMAGE}-${ZAMMAD_VERSION}
fi
else
echo "Build Zammad Docker image ${DOCKER_IMAGE} for DockerHubs ${DOCKER_REPO}:${DOCKER_IMAGE} repo"
docker build --pull --no-cache --build-arg BUILD_DATE="$(date -u +'%Y-%m-%dT%H:%M:%SZ')" -t "${DOCKER_REPO}:${DOCKER_IMAGE}" -f containers/"${DOCKER_IMAGE}"/Dockerfile .
docker push ${DOCKER_REPO}:${DOCKER_IMAGE}
fi
done

6
hooks/config Normal file
View File

@ -0,0 +1,6 @@
#!/bin/bash
#
# build hooks config
#
DOCKER_IMAGES="zammad zammad-elasticsearch zammad-postgresql"

6
hooks/push Executable file
View File

@ -0,0 +1,6 @@
#!/bin/bash
#
# build hook for dockerhubs autobuild feature
#
exit 0

View File

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