Compare commits

...

38 Commits

Author SHA1 Message Date
André Bauer
799edd7863
Update zammad to 6.0.0-66 (#363) 2023-07-18 18:47:20 +02:00
André Bauer
6606e8e2ca
update zammad to 6.0.0-32 (#353) 2023-06-22 20:16:10 +02:00
André Bauer
662aa8f512
update dockerhub pulls badge (#352) 2023-06-21 16:27:42 +02:00
Martin Gruner
ffa1268a2a
Update to Zammad 6.0. (#347)
* Update to Zammad 6.0.

* adjust compose and env / change docker registry

Signed-off-by: André Bauer <andre.bauer@staffbase.com>

---------

Signed-off-by: André Bauer <andre.bauer@staffbase.com>
Co-authored-by: André Bauer <andre.bauer@staffbase.com>
2023-06-21 16:05:23 +02:00
André Bauer
3338cbeb22
sort vars (#351) 2023-06-14 13:27:25 +02:00
Jan Kiesewetter
9a547c67a9
Define database name (#343)
Set the database name to the default of the Zammad image to avoid an unused database with the name of the POSTGRES_USER var.

See default database name:
163377fc65/contrib/docker/docker-entrypoint.sh (L20)

See PostgreSQL image documentation:
https://hub.docker.com/_/postgres

POSTGRES_DB
This optional environment variable can be used to define a different name for the default database
that is created when the image is first started. If it is not specified, then the value of POSTGRES_USER will be used.
2023-06-14 11:36:01 +02:00
André Bauer
1c52589095
update zammad to 5.4.1-29 (#340) 2023-05-14 13:23:10 +02:00
Jensa
281b5f317f
timed backup script with backup time (#339)
* Update backup.sh

- new zammad-timed-backup which uses fixed backup time $BACKUP_TIME

* Update docker-compose.yml

- $BACKUP_TIME added
- timed backup as command

* merge request and linting fixes

* arithmetic linting fix

* not related to merge request but fixes linting in check_railsserver_available
2023-05-12 20:51:57 +02:00
dependabot[bot]
ef8830e636
Bump github/super-linter from 4 to 5 (#333)
Bumps [github/super-linter](https://github.com/github/super-linter) from 4 to 5.
- [Release notes](https://github.com/github/super-linter/releases)
- [Changelog](https://github.com/github/super-linter/blob/main/docs/release-process.md)
- [Commits](https://github.com/github/super-linter/compare/v4...v5)

---
updated-dependencies:
- dependency-name: github/super-linter
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-05-10 13:14:45 +02:00
Martin Gruner
a8911b1359 Maintenance: Update README. 2023-04-20 13:41:51 +02:00
Marcel Herrguth
1f32908c23
Merge pull request #332 from sdm216/master
Update to Zammad 5.4.1
2023-04-12 16:53:42 +02:00
sdm216
360324353f
Update .env 2023-04-12 10:41:14 -04:00
Martin Gruner
e5b0fedfe6
Maintenance: Switch to Zammad 5.4.0. (#328) 2023-03-14 11:50:16 +01:00
Jan Kiesewetter
d588f2ff65
Define PostgreSQL version in .env (#322)
Resolves: #321
2022-12-23 21:21:40 +01:00
Fonata
01fe85d74c
Fix small spelling and typography mistakes in README (#317) 2022-12-23 21:20:50 +01:00
André Bauer
abd9cd631d
update zammad to 5.3.1-6 (#323) 2022-12-23 21:17:24 +01:00
André Bauer
d397322bae
update docker image to 5.3.0-9 (#316) 2022-12-03 14:18:22 +01:00
André Bauer
ae716aed3d
update config 2022-11-23 00:39:57 +01:00
André Bauer
ad516bdfd6
update docker image to 5.3.0-2 (#314) 2022-11-23 00:32:55 +01:00
André Bauer
87e8b49794
update zammad to 5.3.0 (#313)
* update zammad to 5.3.0

* update dependencies

Signed-off-by: André Bauer <andre.bauer@staffbase.com>

Signed-off-by: André Bauer <andre.bauer@staffbase.com>
2022-11-22 18:59:50 +01:00
André Bauer
a0aa5324dc
adjust readme and docker image path (#310)
Signed-off-by: André Bauer <andre.bauer@staffbase.com>

Signed-off-by: André Bauer <andre.bauer@staffbase.com>
2022-11-08 16:08:16 +01:00
André Bauer
731f83da2b
add release drafter, remove container & rework ci (#309)
Signed-off-by: André Bauer <andre.bauer@staffbase.com>

Signed-off-by: André Bauer <andre.bauer@staffbase.com>
2022-11-08 12:49:04 +01:00
André Bauer
c5c1db541a
update zammad & components (#307)
Signed-off-by: André Bauer <andre.bauer@staffbase.com>

Signed-off-by: André Bauer <andre.bauer@staffbase.com>
2022-11-04 19:30:32 +01:00
André Bauer
0af24d791f
update postgres image to 15.0 2022-11-04 01:09:50 +01:00
Marcel Herrguth
cd424e9868
Merge pull request #303 from waja/5.2.3
Update to Zammad 5.2.3
2022-10-18 15:46:58 +02:00
Jan Wagner
daa1c71e00 Update to Zammad 5.2.3 2022-10-18 15:24:46 +02:00
Marcel Herrguth
52bced15fe
Merge pull request #302 from waja/5.2.2
Update to latest zammad tag
2022-09-29 14:01:47 +02:00
Jan Wagner
225ee21d5f Update to latest zammad tag 2022-09-29 05:27:03 +02:00
Marcel Herrguth
f57418a2a5
Merge pull request #299 from yogo1212/readme_typo
README: fix typo
2022-09-21 11:34:11 +02:00
Leon M. George
130f22766c README: fix typo 2022-09-21 11:00:15 +02:00
André Bauer
b4779f1be0
Update dependabot.yml 2022-08-05 11:00:17 +02:00
André Bauer
10fa5096c7
Update dependabot.yml 2022-08-05 10:59:33 +02:00
André Bauer
5a65ce28cf
add dependabot 2022-08-05 10:47:00 +02:00
Marcel Herrguth
d3e27a5828
Merge pull request #288 from soymgomez/patch-1
Update .env to 5.2.1-7
2022-07-10 01:33:05 +02:00
Martín Gómez
bf95bf7fa4
Update .env to 5.2.1-7
Update version to 5.2.1-7
2022-07-06 17:22:23 +02:00
Marcel Herrguth
d1a0e023c7
Merge pull request #287 from zammad/mh/5-2-1
Closes #286 - Raise Dockerfile to 5.2.1
2022-07-06 14:11:48 +02:00
Marcel Herrguth
44ae0bfd18 Closes #286 - Raise Dockerfile to 5.2.1
PR for @waja
2022-07-05 19:05:39 +02:00
André Bauer
893fd870d5
update zammad to 5.2.0-9 (#283)
* update zammad to 5.2.0-5

* Update .env
2022-06-29 10:50:56 +02:00
17 changed files with 161 additions and 463 deletions

12
.env
View File

@ -1,8 +1,14 @@
IMAGE_REPO=zammad/zammad-docker-compose ELASTICSEARCH_VERSION=8.8.0
IMAGE_REPO=ghcr.io/zammad/zammad
MEMCACHE_SERVERS=zammad-memcached:11211 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_URL=redis://zammad-redis:6379
REDIS_VERSION=7.0.5-alpine
RESTART=always RESTART=always
# don't forget to add the minus before the version VERSION=6.0.0-66
VERSION=-5.1.1-11

16
.github/dependabot.yml vendored Normal file
View File

@ -0,0 +1,16 @@
---
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,14 +0,0 @@
#!/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 or ci tests"
docker build --pull --no-cache --build-arg BUILD_DATE="$(date -u +'%Y-%m-%dT%H:%M:%SZ')" -t "${DOCKER_IMAGE}-local" -f "containers/${DOCKER_IMAGE}/Dockerfile" .
done

37
.github/release-drafter.yml vendored Normal file
View File

@ -0,0 +1,37 @@
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

16
.github/tests.sh vendored
View File

@ -23,16 +23,28 @@ echo
echo "Execute autowizard..." echo "Execute autowizard..."
echo echo
docker exec zammad-docker-compose_zammad-railsserver_1 rake zammad:setup:auto_wizard 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
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"
docker exec zammad-docker-compose_zammad-railsserver_1 rails r "FillDb.load(agents: 1,customers: 1,groups: 1,organizations: 1,overviews: 1,tickets: 1)" 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
echo "DB fill successful :)" echo "DB fill successful :)"

View File

@ -3,13 +3,11 @@ name: ci-remote-image
on: on:
pull_request: pull_request:
paths:
- '.env'
jobs: jobs:
run-remote-image-docker-compose: run-remote-image-docker-compose:
timeout-minutes: 20 timeout-minutes: 20
runs-on: ubuntu-20.04 runs-on: ubuntu-22.04
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v3 uses: actions/checkout@v3
@ -21,7 +19,7 @@ jobs:
run: docker-compose up --detach run: docker-compose up --detach
- name: add autowizard file - name: add autowizard file
run: docker cp .github/auto_wizard.json zammad-docker-compose_zammad-railsserver_1:/opt/zammad run: docker cp .github/auto_wizard.json zammad-docker-compose_zammad-railsserver_1:/opt/zammad/var
- name: run tests - name: run tests
run: .github/tests.sh run: .github/tests.sh

View File

@ -6,7 +6,7 @@ on:
jobs: jobs:
lint-docker-compose-file: lint-docker-compose-file:
runs-on: ubuntu-20.04 runs-on: ubuntu-22.04
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v3 uses: actions/checkout@v3
@ -15,7 +15,7 @@ jobs:
run: docker-compose config run: docker-compose config
super-linter: super-linter:
runs-on: ubuntu-20.04 runs-on: ubuntu-22.04
steps: steps:
- name: Checkout Code - name: Checkout Code
uses: actions/checkout@v3 uses: actions/checkout@v3
@ -23,32 +23,10 @@ jobs:
fetch-depth: 0 fetch-depth: 0
- name: Lint Code Base - name: Lint Code Base
uses: github/super-linter/slim@v4 uses: github/super-linter/slim@v5
env: env:
DEFAULT_BRANCH: master DEFAULT_BRANCH: master
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
LINTER_RULES_PATH: .github/linters LINTER_RULES_PATH: .github/linters
VALIDATE_ALL_CODEBASE: false VALIDATE_ALL_CODEBASE: false
VALIDATE_JSCPD: false VALIDATE_JSCPD: false
build-and-run-docker-compose:
needs:
- lint-docker-compose-file
- super-linter
timeout-minutes: 20
runs-on: ubuntu-20.04
steps:
- name: Checkout
uses: actions/checkout@v3
- name: build docker containers
run: .github/docker-image-build.sh
- name: run docker-compose up
run: docker-compose -f docker-compose.yml -f docker-compose.override.yml -f docker-compose.override-local.yml 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

22
.github/workflows/release-drafter.yaml vendored Normal file
View File

@ -0,0 +1,22 @@
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 }}

View File

@ -6,22 +6,29 @@ 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? License (AGPL). Do you receive many emails and want to answer them with a team of agents?
You're going to love Zammad! You're going to love Zammad!
## Use case for this repository ## Use cases
This repository is meant to be the starting point for somebody who likes to use dockerized multi-container Zammad in production. This repository is the starting point if you want to:
## Getting started with zammad-docker-compose - deploy Zammad in a containerized production environment
- test the current `stable` or `develop` versions of Zammad
[Learn more on Zammads documentation](https://docs.zammad.org/en/latest/install/docker-compose.html) ## Getting started
[Learn more on Zammads documentation](https://docs.zammad.org/en/latest/install/docker-compose.html)
## Upgrading
For upgrading instructions see our [Releases](https://github.com/zammad/zammad-docker-compose/releases).
## Status ## Status
[![CI Status](https://github.com/zammad/zammad-docker-compose/workflows/ci/badge.svg)](https://github.com/zammad/zammad-docker-compose/actions) [![Docker Pulls](https://badgen.net/docker/pulls/zammad/zammad-docker-compose?icon=docker&label=pulls)](https://hub.docker.com/r/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 ## 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 revers proxy, we provide `docker-compose.proxy-example.yml` as a starting point. To run Zammad behind a reverse 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`
@ -42,41 +49,4 @@ 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, it's 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, its 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.
This will depend on the name of your docker container and volume, which depends on the checkout directory (`zammad-docker-compose` by default):
```console
docker-compose stop
docker container rm zammad-docker-compose_zammad-elasticsearch_1
docker volume rm zammad-docker-compose_elasticsearch-data
docker-compose up --no-recreate
```
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;
```
### From =< 3.6.0-65
To be able to run Zammad container with an unprivileged user we had to change the port Nginx uses from 80 to 8080, so Zammad needs to be accessed via <http://localhost:8080> instead of <http://localhost> now!
This change will also affect you, if you use a reverse proxy, like Traefik or Haproxy, in front of Zammad as your reverse proxy configuration needs to be adapted to point to port 8080 now.
### From =< 4.0.0 to 5.0.0
Memchached config changed. If you use the old env vars `MEMCACHED_HOST` & `MEMCACHED_PORT` adapt to `MEMCACHE_SERVERS`.
Redis is a dependency for the Websocket server now.

View File

@ -1,17 +0,0 @@
FROM docker.elastic.co/elasticsearch/elasticsearch:7.17.3
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="5.2.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

@ -1,20 +0,0 @@
FROM postgres:9.6.24-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="5.2.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

@ -1,65 +0,0 @@
# note: zammad is currently incompatible to alpine because of:
# https://github.com/docker-library/ruby/issues/113
FROM ruby:3.0.4-slim AS builder
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 RAILS_LOG_TO_STDOUT true
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:3.0.4-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="5.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 RAILS_LOG_TO_STDOUT true
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

@ -1,173 +0,0 @@
#!/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}"
: "${NGINX_PORT:=8080}"
: "${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}"
: "${ZAMMAD_WEB_CONCURRENCY:=0}"
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
# https://stackoverflow.com/questions/407523/escape-a-string-for-a-sed-replace-pattern
ESCAPED_POSTGRESQL_PASS=$(echo "$POSTGRESQL_PASS" | sed -e 's/[\/&]/\\&/g')
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: ${ESCAPED_POSTGRESQL_PASS}\\n host: ${POSTGRESQL_HOST}\\n port: ${POSTGRESQL_PORT}#g" < contrib/packager.io/database.yml.pkgr > config/database.yml
# 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 base64 -d <<< ${AUTOWIZARD_JSON} &>> /dev/null; then
echo "Saving autowizard json payload..."
base64 -d <<< "${AUTOWIZARD_JSON}" > auto_wizard.json
fi
else
bundle exec rails r "Cache.clear"
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 zammad: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#\(listen\)\(.*\)80#\1\2${NGINX_PORT}#g" \
-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... with WEB_CONCURRENCY=${ZAMMAD_WEB_CONCURRENCY}"
#shellcheck disable=SC2101
exec bundle exec puma -b tcp://[::]:"${ZAMMAD_RAILSSERVER_PORT}" -w "${ZAMMAD_WEB_CONCURRENCY}" -e "${RAILS_ENV}"
fi
# zammad-scheduler
if [ "$1" = 'zammad-scheduler' ]; then
check_zammad_ready
cd "${ZAMMAD_DIR}"
echo "starting background services..."
exec bundle exec script/background-worker.rb start
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

View File

@ -1,59 +0,0 @@
#!/usr/bin/env bash
set -e
# install dependencies
if [ "$1" = 'builder' ]; then
PACKAGES="build-essential curl git libimlib2-dev libpq-dev shared-mime-info"
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}
if [ "$1" = 'builder' ]; then
# Install Node.js 16 repository from Nodesource
apt-get --no-install-recommends -y install gnupg
KEYRING=/usr/share/keyrings/nodesource.gpg
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource.gpg.key | gpg --dearmor | tee "$KEYRING" >/dev/null
cat - > /etc/apt/sources.list.d/nodesource.list <<NODESOURCE_LIST
deb [signed-by=/usr/share/keyrings/nodesource.gpg] https://deb.nodesource.com/node_16.x buster main
NODESOURCE_LIST
apt-get update
apt-get --no-install-recommends -y install nodejs
npm -g install yarn
fi
# Clean-up
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 config set without 'test development mysql'
bundle install
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
touch db/schema.rb
bundle exec rake assets:precompile
rm -r tmp/cache
script/build/cleanup.sh
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

@ -3,21 +3,12 @@ version: '3'
services: services:
zammad-backup:
image: zammad-postgresql-local
zammad-elasticsearch:
image: zammad-elasticsearch-local
zammad-init: zammad-init:
image: zammad-local image: zammad-local
zammad-nginx: zammad-nginx:
image: zammad-local image: zammad-local
zammad-postgresql:
image: zammad-postgresql-local
zammad-railsserver: zammad-railsserver:
image: zammad-local image: zammad-local

View File

@ -1,5 +1,5 @@
--- ---
version: '3' version: '3.8'
services: services:
@ -10,23 +10,24 @@ services:
- zammad-postgresql - zammad-postgresql
entrypoint: /usr/local/bin/backup.sh entrypoint: /usr/local/bin/backup.sh
environment: environment:
- BACKUP_SLEEP=86400 - BACKUP_TIME=03:00
- 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}
image: ${IMAGE_REPO}:zammad-postgresql${VERSION} - TZ=Europe/Berlin
image: postgres:${POSTGRES_VERSION}
restart: ${RESTART} restart: ${RESTART}
volumes: volumes:
- zammad-backup:/var/tmp/zammad - zammad-backup:/var/tmp/zammad
- zammad-data:/opt/zammad - zammad-var:/opt/zammad/var:ro
- ./scripts/backup.sh:/usr/local/bin/backup.sh:ro
zammad-elasticsearch: zammad-elasticsearch:
environment: image: bitnami/elasticsearch:${ELASTICSEARCH_VERSION}
- discovery.type=single-node
image: ${IMAGE_REPO}:zammad-elasticsearch${VERSION}
restart: ${RESTART} restart: ${RESTART}
volumes: volumes:
- elasticsearch-data:/usr/share/elasticsearch/data - elasticsearch-data:/bitnami/elasticsearch/data
zammad-init: zammad-init:
command: ["zammad-init"] command: ["zammad-init"]
@ -34,17 +35,17 @@ services:
- zammad-postgresql - zammad-postgresql
environment: environment:
- MEMCACHE_SERVERS=${MEMCACHE_SERVERS} - MEMCACHE_SERVERS=${MEMCACHE_SERVERS}
- POSTGRESQL_USER=${POSTGRES_USER}
- POSTGRESQL_PASS=${POSTGRES_PASS}
- REDIS_URL=${REDIS_URL} - REDIS_URL=${REDIS_URL}
image: ${IMAGE_REPO}:zammad${VERSION} image: ${IMAGE_REPO}:${VERSION}
restart: on-failure restart: on-failure
user: 0:0
volumes: volumes:
- zammad-data:/opt/zammad - zammad-config-nginx:/etc/nginx/sites-enabled
- zammad-var:/opt/zammad/var
zammad-memcached: zammad-memcached:
command: memcached -m 256M command: memcached -m 256M
image: memcached:1.6.10-alpine image: memcached:${MEMCACHE_VERSION}
restart: ${RESTART} restart: ${RESTART}
zammad-nginx: zammad-nginx:
@ -53,16 +54,18 @@ services:
- "8080" - "8080"
depends_on: depends_on:
- zammad-railsserver - zammad-railsserver
image: ${IMAGE_REPO}:zammad${VERSION} image: ${IMAGE_REPO}:${VERSION}
restart: ${RESTART} restart: ${RESTART}
volumes: volumes:
- zammad-data:/opt/zammad - zammad-config-nginx:/etc/nginx/sites-enabled:ro
- 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: ${IMAGE_REPO}:zammad-postgresql${VERSION} image: postgres:${POSTGRES_VERSION}
restart: ${RESTART} restart: ${RESTART}
volumes: volumes:
- postgresql-data:/var/lib/postgresql/data - postgresql-data:/var/lib/postgresql/data
@ -76,14 +79,16 @@ services:
environment: environment:
- MEMCACHE_SERVERS=${MEMCACHE_SERVERS} - MEMCACHE_SERVERS=${MEMCACHE_SERVERS}
- REDIS_URL=${REDIS_URL} - REDIS_URL=${REDIS_URL}
image: ${IMAGE_REPO}:zammad${VERSION} image: ${IMAGE_REPO}:${VERSION}
restart: ${RESTART} restart: ${RESTART}
volumes: volumes:
- zammad-data:/opt/zammad - zammad-var:/opt/zammad/var
zammad-redis: zammad-redis:
image: redis:6.2.5-alpine image: redis:${REDIS_VERSION}
restart: ${RESTART} restart: ${RESTART}
volumes:
- redis-data:/data
zammad-scheduler: zammad-scheduler:
command: ["zammad-scheduler"] command: ["zammad-scheduler"]
@ -94,10 +99,10 @@ services:
environment: environment:
- MEMCACHE_SERVERS=${MEMCACHE_SERVERS} - MEMCACHE_SERVERS=${MEMCACHE_SERVERS}
- REDIS_URL=${REDIS_URL} - REDIS_URL=${REDIS_URL}
image: ${IMAGE_REPO}:zammad${VERSION} image: ${IMAGE_REPO}:${VERSION}
restart: ${RESTART} restart: ${RESTART}
volumes: volumes:
- zammad-data:/opt/zammad - zammad-var:/opt/zammad/var
zammad-websocket: zammad-websocket:
command: ["zammad-websocket"] command: ["zammad-websocket"]
@ -108,17 +113,21 @@ services:
environment: environment:
- MEMCACHE_SERVERS=${MEMCACHE_SERVERS} - MEMCACHE_SERVERS=${MEMCACHE_SERVERS}
- REDIS_URL=${REDIS_URL} - REDIS_URL=${REDIS_URL}
image: ${IMAGE_REPO}:zammad${VERSION} image: ${IMAGE_REPO}:${VERSION}
restart: ${RESTART} restart: ${RESTART}
volumes: volumes:
- zammad-data:/opt/zammad - zammad-var:/opt/zammad/var
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-data: zammad-config-nginx:
driver: local
zammad-var:
driver: local driver: local

View File

@ -2,7 +2,7 @@
set -e set -e
: "${ZAMMAD_DIR:=/opt/zammad}" : "${ZAMMAD_DIR:=/opt/zammad/var}"
: "${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
@ -34,6 +34,8 @@ 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
@ -41,10 +43,15 @@ 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
# wait until next backup NEXT_TIMESTAMP=$(date -d "$TOMORROW_DATE $BACKUP_TIME" +%s)
sleep "${BACKUP_SLEEP}" NOW_TIMESTAMP=$(date +%s)
sleep $((NEXT_TIMESTAMP - NOW_TIMESTAMP))
done done
fi fi