- The `setup-runit.sh` script now have options: down, force, log, name, source, quiet.

- Fixed the Apache runit script, using the new `setup-runit.sh` script. Stopping the parent process now also stops all child processes. Using the quiet option, Apache does not flood the logs anymore.
- Added support of the environment variable `LMTP_LISTEN=*:2003`, due to misconfiguration of `kopano-dagent` in recent releases (8.7.84).
- Simplified the health check.
- Changed repository directory structure to a more general one.
- Renamed some build variables, e.g., `DOCKER_RUNSV_DIR` (was `docker_build_runit_root`).
- Cleaning up `Makefile`
- Added more debug functionality in `demo/Makefile`
master v1.1.3
mlan 2019-11-12 21:14:33 +01:00
parent d94a64104e
commit b66b9c696b
18 changed files with 289 additions and 284 deletions

View File

@ -2,6 +2,7 @@
.gitignore .gitignore
.github .github
.gitattributes .gitattributes
src/notused
demo demo
*.md *.md
local* local*

View File

@ -1,20 +1,31 @@
# v1.1.2 # 1.1.3
- Update Dockerfile so that is works also for debian 9 - The `setup-runit.sh` script now have options: down, force, log, name, source, quiet.
- Update assets/kopano-webaddr.sh now that we do not have builds for debian 8 - Fixed the Apache runit script, using the new `setup-runit.sh` script. Stopping the parent process now also stops all child processes. Using the quiet option, Apache does not flood the logs anymore.
- Added support of the environment variable `LMTP_LISTEN=*:2003`, due to misconfiguration of `kopano-dagent` in recent releases (8.7.84).
- Simplified the health check.
- Changed repository directory structure to a more general one.
- Renamed some build variables, e.g., `DOCKER_RUNSV_DIR` (was `docker_build_runit_root`).
- Cleaning up `Makefile`
- Added more debug functionality in `demo/Makefile`
# 1.1.2
- Update `Dockerfile` so that is works also for Debian 9
- Update `kopano-webaddr.sh` now that we do not have builds for Debian 8
- Updated demo - Updated demo
# v1.1.1 # 1.1.1
- Make sure the .env settings are honored also for MYSQL - Make sure the .env settings are honored also for MYSQL
# v1.1.0 # 1.1.0
- Reversed tag naming scheme. now `full-8.7.80-3.5.2` instead of ~~8.7.80-3.5.2-full~~ - Reversed tag naming scheme. now `full-8.7.80-3.5.2` instead of ~~8.7.80-3.5.2-full~~
- Demo based on `docker-compose.yml` and `Makefile` files - Demo based on `docker-compose.yml` and `Makefile` files
- Check and fix file attributes in the `/var/lib/kopano/attachments` directory - Check and fix file attributes in the `/var/lib/kopano/attachments` directory
# v1.0.0 # 1.0.0
- Groupware server [Kopano WebApp](https://kopano.io/) - Groupware server [Kopano WebApp](https://kopano.io/)
- ActiveSync server [Z-Push](http://z-push.org/) - ActiveSync server [Z-Push](http://z-push.org/)

View File

@ -8,14 +8,17 @@ ARG ARCH
FROM ${ARCH:+$ARCH/}$DIST:$REL AS base FROM ${ARCH:+$ARCH/}$DIST:$REL AS base
LABEL maintainer=mlan LABEL maintainer=mlan
ENV DEBIAN_FRONTEND=noninteractive \ ENV DEBIAN_FRONTEND=noninteractive \
docker_build_runit_root=/etc/service \ DOCKER_BIN_DIR=/usr/local/bin \
docker_build_deb_dir=/tmp/deb \ DOCKER_RUNSV_DIR=/etc/service \
docker_build_passes=1 \ DOCKER_BUILD_DEB_DIR=/tmp/deb \
DOCKER_BUILD_PASSES=1 \
SYSLOG_OPTIONS='-S' \
SYSLOG_LEVEL=4 SYSLOG_LEVEL=4
# #
# Copy helpers # Copy utility scripts including entrypoint.sh to image
# #
COPY assets/setup-runit.sh /usr/local/bin/ COPY src/*/bin $DOCKER_BIN_DIR/
# #
# Install helpers # Install helpers
# #
@ -28,7 +31,7 @@ RUN apt-get update && apt-get install --yes --no-install-recommends \
ca-certificates \ ca-certificates \
tar \ tar \
gnupg \ gnupg \
&& setup-runit.sh "syslogd -n -O /dev/stdout -l $SYSLOG_LEVEL" && setup-runit.sh "syslogd -n -O - -l $SYSLOG_LEVEL $SYSLOG_OPTIONS"
@ -55,7 +58,7 @@ RUN rm -f /etc/dpkg/dpkg.cfg.d/excludes \
# #
# Kopano-core # Kopano-core
# #
FROM base-man AS kopano-core FROM base-man AS core
# #
# build arguments, amd64 is the default # build arguments, amd64 is the default
# #
@ -66,49 +69,42 @@ ARG ARCH=amd64
# variables # variables
# #
ENV DEBIAN_FRONTEND=noninteractive \ ENV DEBIAN_FRONTEND=noninteractive \
docker_build_runit_root=/etc/service \ DOCKER_RUNSV_DIR=/etc/service \
docker_build_deb_dir=/tmp/deb \ DOCKER_BIN_DIR=/usr/local/bin \
docker_build_passes=1 LMTP_LISTEN=*:2003 \
# DOCKER_BUILD_DEB_DIR=/tmp/deb \
# Copy helpers DOCKER_BUILD_PASSES=1
#
COPY assets/kopano-webaddr.sh /usr/local/bin/
COPY assets/dpkg-version.sh /usr/local/bin/
COPY assets/conf /usr/local/bin/
COPY assets/entrypoint.sh /usr/local/bin/
COPY assets/healthcheck.sh /usr/local/bin/
# #
# Install kopano-core # Install kopano-core
# #
RUN mkdir -p $docker_build_deb_dir \ RUN mkdir -p $DOCKER_BUILD_DEB_DIR \
&& webaddr=$(kopano-webaddr.sh core \ && webaddr=$(kopano-webaddr.sh core \
https://download.kopano.io/community ${DIST} ${REL} ${ARCH}) \ https://download.kopano.io/community ${DIST} ${REL} ${ARCH}) \
&& echo "$webaddr<->${DIST} ${REL} ${ARCH}<-" \ && echo "$webaddr<->${DIST} ${REL} ${ARCH}<-" \
&& curl $webaddr | tar -xzC $docker_build_deb_dir \ && curl $webaddr | tar -xzC $DOCKER_BUILD_DEB_DIR \
&& apt-get update \ && apt-get update \
&& for i in $(seq ${docker_build_passes}); do echo "\033[1;36mKOPANO CORE INSTALL PASS: $i\033[0m" \ && for i in $(seq ${DOCKER_BUILD_PASSES}); do echo "\033[1;36mKOPANO CORE INSTALL PASS: $i\033[0m" \
&& dpkg --install --force-depends --skip-same-version --recursive $docker_build_deb_dir \ && dpkg --install --force-depends --skip-same-version --recursive $DOCKER_BUILD_DEB_DIR \
&& apt-get install --yes --no-install-recommends --fix-broken; done \ && apt-get install --yes --no-install-recommends --fix-broken; done \
&& mkdir -p /var/lib/kopano/attachments && chown kopano: /var/lib/kopano/attachments \ && mkdir -p /var/lib/kopano/attachments && chown kopano: /var/lib/kopano/attachments \
&& rm -rf $docker_build_deb_dir \ && rm -rf $DOCKER_BUILD_DEB_DIR \
&& setup-runit.sh \ && setup-runit.sh \
"kopano-dagent -l" \ "kopano-dagent -l" \
"kopano-gateway -F" \ "kopano-gateway -F" \
"kopano-ical -F" \ "kopano-ical -F" \
"kopano-search -F" \ "-f kopano-search -F" \
"kopano-server -F" \ "kopano-server -F" \
"kopano-spooler -F" \ "kopano-spooler -F" \
&& setup-runit.sh --down \ "-d kopano-grapi serve" \
"kopano-grapi serve" \ "-d kopano-kapid serve --log-timestamp=false" \
"kopano-kapid serve --log-timestamp=false" \ "-d kopano-konnectd serve --log-timestamp=false" \
"kopano-konnectd serve --log-timestamp=false" \ "-d kopano-monitor -F" \
"kopano-monitor -F" \ "-d kopano-presence -F" \
"kopano-presence -F" \ "-d kopano-spamd -F"
"kopano-spamd -F"
# #
# Entrypoint, how container is run # Entrypoint, how container is run
# #
HEALTHCHECK --interval=5m --timeout=3s CMD healthcheck.sh HEALTHCHECK CMD sv status ${DOCKER_RUNSV_DIR}/*
ENTRYPOINT ["entrypoint.sh"] ENTRYPOINT ["entrypoint.sh"]
@ -116,7 +112,7 @@ ENTRYPOINT ["entrypoint.sh"]
# #
# Kopano-webapp # Kopano-webapp
# #
FROM kopano-core AS kopano-core-webapp FROM core AS core-webapp
# #
# build arguments # build arguments
# #
@ -126,21 +122,21 @@ ARG REL
# variables # variables
# #
ENV DEBIAN_FRONTEND=noninteractive \ ENV DEBIAN_FRONTEND=noninteractive \
docker_build_runit_root=/etc/service \ DOCKER_RUNSV_DIR=/etc/service \
docker_build_deb_dir=/tmp/deb \ DOCKER_BUILD_DEB_DIR=/tmp/deb \
docker_build_passes=1 DOCKER_BUILD_PASSES=1
# #
# Install Kopano webapp # Install Kopano webapp
# #
RUN apt-get install --yes --no-install-recommends apache2 libapache2-mod-php \ RUN apt-get install --yes --no-install-recommends apache2 libapache2-mod-php \
&& mkdir -p $docker_build_deb_dir \ && mkdir -p $DOCKER_BUILD_DEB_DIR \
&& webaddr=$(kopano-webaddr.sh webapp \ && webaddr=$(kopano-webaddr.sh webapp \
https://download.kopano.io/community ${DIST} ${REL} all) \ https://download.kopano.io/community ${DIST} ${REL} all) \
&& echo "$webaddr<->${DIST} ${REL} all<-" \ && echo "$webaddr<->${DIST} ${REL} all<-" \
&& curl $webaddr | tar -xzC $docker_build_deb_dir \ && curl $webaddr | tar -xzC $DOCKER_BUILD_DEB_DIR \
&& apt-get update \ && apt-get update \
&& for i in $(seq ${docker_build_passes}); do echo "\033[1;36mKOPANO WEBAPP INSTALL PASS: $i\033[0m" \ && for i in $(seq ${DOCKER_BUILD_PASSES}); do echo "\033[1;36mKOPANO WEBAPP INSTALL PASS: $i\033[0m" \
&& dpkg --install --force-depends --skip-same-version --recursive $docker_build_deb_dir \ && dpkg --install --force-depends --skip-same-version --recursive $DOCKER_BUILD_DEB_DIR \
&& apt-get install --yes --no-install-recommends --fix-broken; done \ && apt-get install --yes --no-install-recommends --fix-broken; done \
&& dpkg-reconfigure php7-mapi \ && dpkg-reconfigure php7-mapi \
&& conf replace /etc/kopano/webapp/config.php 'define("INSECURE_COOKIES", false);' 'define("INSECURE_COOKIES", true);' \ && conf replace /etc/kopano/webapp/config.php 'define("INSECURE_COOKIES", false);' 'define("INSECURE_COOKIES", true);' \
@ -148,16 +144,16 @@ RUN apt-get install --yes --no-install-recommends apache2 libapache2-mod-php \
&& conf replace /etc/apache2/sites-available/kopano-webapp.conf 'Alias /webapp /usr/share/kopano-webapp' '<VirtualHost *:80>\\nDocumentRoot /usr/share/kopano-webapp' \ && conf replace /etc/apache2/sites-available/kopano-webapp.conf 'Alias /webapp /usr/share/kopano-webapp' '<VirtualHost *:80>\\nDocumentRoot /usr/share/kopano-webapp' \
&& echo '</VirtualHost>' >> /etc/apache2/sites-available/kopano-webapp.conf \ && echo '</VirtualHost>' >> /etc/apache2/sites-available/kopano-webapp.conf \
&& conf modify /etc/apache2/apache2.conf '^ErrorLog' syslog:user \ && conf modify /etc/apache2/apache2.conf '^ErrorLog' syslog:user \
&& echo 'CustomLog "||/usr/bin/logger -t apache -i -p user.notice" vhost_combined' >> /etc/apache2/apache2.conf \ && echo 'CustomLog "||/usr/bin/logger -t apache -i -p user.debug" common' >> /etc/apache2/apache2.conf \
&& echo 'CustomLog "||/usr/bin/logger -t apache -i -p user.info" combined' >> /etc/apache2/apache2.conf \ && echo 'ServerName localhost' >> /etc/apache2/apache2.conf \
&& mkdir -p /etc/kopano/theme/Custom \ && mkdir -p /etc/kopano/theme/Custom \
&& ln -sf /etc/kopano/theme/Custom /usr/share/kopano-webapp/plugins/. \ && ln -sf /etc/kopano/theme/Custom /usr/share/kopano-webapp/plugins/. \
# && conf modify /etc/apache2/apache2.conf '^LogLevel' crit \ # && conf modify /etc/apache2/apache2.conf '^LogLevel' crit \
# && a2disconf other-vhosts-access-log \ # && a2disconf other-vhosts-access-log \
&& a2dissite 000-default.conf \ && a2dissite 000-default.conf \
&& a2ensite kopano-webapp \ && a2ensite kopano-webapp \
&& rm -rf $docker_build_deb_dir \ && rm -rf $DOCKER_BUILD_DEB_DIR \
&& setup-runit.sh "apache2ctl -D FOREGROUND -k start" && setup-runit.sh "-q -s /etc/apache2/envvars apache2 -DFOREGROUND -DNO_DETACH -k start"
# #
# Ports # Ports
# #
@ -168,7 +164,7 @@ EXPOSE 80 443
# #
# Z-Push # Z-Push
# #
FROM kopano-core-webapp AS kopano-full FROM core-webapp AS full
# #
# build arguments # build arguments
# #
@ -178,9 +174,9 @@ ARG REL
# variables # variables
# #
ENV DEBIAN_FRONTEND=noninteractive \ ENV DEBIAN_FRONTEND=noninteractive \
docker_build_runit_root=/etc/service \ DOCKER_RUNSV_DIR=/etc/service \
docker_build_deb_dir=/tmp/deb \ DOCKER_BUILD_DEB_DIR=/tmp/deb \
docker_build_passes=1 DOCKER_BUILD_PASSES=1
# #
# Add Z-Push repository and install Z-Push configured to be used with kopano and apache # Add Z-Push repository and install Z-Push configured to be used with kopano and apache
# #
@ -200,7 +196,7 @@ RUN debaddr="$(kopano-webaddr.sh --deb final http://repo.z-hub.io/z-push: ${DIST
FROM kopano-full AS kopano-debugtools FROM full AS debugtools
# #
# Optionaly install debug tools # Optionaly install debug tools
# #

View File

@ -1,74 +1,36 @@
-include *.mk -include *.mk
BLD_ARG ?=
#BLD_ARG ?= --build-arg DIST=ubuntu --build-arg REL=18.04 --build-arg ARCH=i386 #BLD_ARG ?= --build-arg DIST=ubuntu --build-arg REL=18.04 --build-arg ARCH=i386
IMG_REPO ?= mlan/kopano BLD_ARG ?=
IMG_VER ?= $(shell assets/kopano-webaddr.sh -VV) BLD_REPO ?= mlan/kopano
IMG_CMD ?= /bin/bash BLD_VER ?= latest
BLD_TGT ?= full
SRC_VER ?= $(shell src/docker/bin/kopano-webaddr.sh -VV)
CNT_NAME ?= kopano-default _version = $(if $(findstring $(BLD_TGT),$(1)),$(2),$(if $(findstring latest,$(2)),$(1),$(1)-$(2)))
CNT_PORT ?= -p 80:80
CNT_ENV ?=
CNT_VOL ?=
.PHONY: build build-all bulid-core build-full build-debugtools \ .PHONY:
variables push shell exec run run-fg stop rm-container rm-image release logs
variables: variables:
make -pn | grep -A1 "^# makefile"| grep -v "^#\|^--" | sort | uniq make -pn | grep -A1 "^# makefile"| grep -v "^#\|^--" | sort | uniq
build: Dockerfile ps:
docker build $(BLD_ARG) --target kopano-full -t $(IMG_REPO)\:$(IMG_VER) . docker ps -a
build-all: build-core build-full build-debugtools build-all: build_core build_full build_debugtools
build-core: Dockerfile build: build_$(BLD_TGT)
docker build $(BLD_ARG) --target kopano-core \
-t $(IMG_REPO)\:$(IMG_VER)-core \
-t $(IMG_REPO)\:latest-core .
build-full: Dockerfile build_%: Dockerfile
docker build $(BLD_ARG) --target kopano-full \ docker build $(BLD_ARG) --target $* \
-t $(IMG_REPO)\:$(IMG_VER) \ -t $(BLD_REPO):$(call _version,$*,$(BLD_VER)) \
-t $(IMG_REPO)\:$(IMG_VER)-full \ -t $(BLD_REPO):$(call _version,$*,$(SRC_VER)) .
-t $(IMG_REPO)\:latest \
-t $(IMG_REPO)\:latest-full .
build-debugtools: Dockerfile
docker build $(BLD_ARG) --target kopano-debugtools \
-t $(IMG_REPO)\:$(IMG_VER)-debugtools \
-t $(IMG_REPO)\:latest-debugtools .
push:
docker push $(IMG_REPO)\:$(IMG_VER)
version: version:
assets/kopano-webaddr.sh -VV src/docker/bin/kopano-webaddr.sh -VV
shell: prune:
docker run --rm --name $(CNT_NAME)-$(CNT_INST) -i -t $(CNT_PORT) $(CNT_VOL) $(CNT_ENV) $(IMG_REPO)\:$(IMG_VER) $(IMG_CMD) docker image prune
exec:
docker exec -it $(CNT_NAME) $(IMG_CMD)
run-fg:
docker run --rm --name $(CNT_NAME) $(CNT_PORT) $(CNT_VOL) $(CNT_ENV) $(IMG_REPO)\:$(IMG_VER)
run:
docker run --rm -d --name $(CNT_NAME) $(CNT_PORT) $(CNT_VOL) $(CNT_ENV) $(IMG_REPO)\:$(IMG_VER)
logs:
docker container logs $(CNT_NAME)
stop:
docker stop $(CNT_NAME)
rm-container:
docker rm $(CNT_NAME)
rm-image:
docker image rm $(IMG_REPO):$(IMG_VER)
release: build
make push -e IMG_VER=$(IMG_VER)
clean:
docker images | grep $(BLD_REPO) | awk '{print $$1 ":" $$2}' | uniq | xargs docker rmi

View File

@ -18,7 +18,7 @@ Brief feature list follows below
- Multi-staged build providing the images `full`, `debugtools` and `core` - Multi-staged build providing the images `full`, `debugtools` and `core`
- Configuration using environment variables - Configuration using environment variables
- Log directed to docker daemon with configurable level - Log directed to docker daemon with configurable level
- Built in utility script [conf](assets/conf) helping configuring Kopano components, WebApp and Z-Push - Built in utility script [conf](src/docker/bin/conf) helping configuring Kopano components, WebApp and Z-Push
- Health check - Health check
- Hook for theming - Hook for theming
- Demo based on `docker-compose.yml` and `Makefile` files - Demo based on `docker-compose.yml` and `Makefile` files
@ -265,10 +265,14 @@ docker exec -it mail-app conf replace /etc/kopano/webapp/config.php 'define("THE
Please note that it is not possible to rename the directory `/etc/kopano/theme/Custom` within the container without further modifications. Please note that it is not possible to rename the directory `/etc/kopano/theme/Custom` within the container without further modifications.
### Mail transfer agent interaction ## Mail transfer agent interaction
Environment variables can be used to configure where Kopano find the Mail Transfer Agent, such as Postfix. Likewise the Mail Transfer Agent need to know where to forward emails to. Environment variables can be used to configure where Kopano find the Mail Transfer Agent, such as Postfix. Likewise the Mail Transfer Agent need to know where to forward emails to.
####`LMTP_LISTEN`
Added support (release 1.1.3) of the environment variable with default `LMTP_LISTEN=*:2003`, due to misconfiguration of `kopano-dagent` in recent releases (kopano-core 8.7.84).
#### `SMTP_SERVER` #### `SMTP_SERVER`
Host name or IP address of the outgoing SMTP server. This server needs to relay mail for your server. Default: `SMTP_SERVER=localhost` Host name or IP address of the outgoing SMTP server. This server needs to relay mail for your server. Default: `SMTP_SERVER=localhost`

View File

@ -1,24 +1,24 @@
# Road map # Road map
## apache2 runit script not working properly ## kopano_spamd
See: https://github.com/phusion/baseimage-docker/issues/271 [discussion](https://jira.kopano.io/browse/KC-666)
We now use: - let kopano-spamd create /var/lib/kopano/spamd/{ham,spam} with perm 770, user kopano, group amavis/spamassassin
```bash - instead of invoking sa-learn, kopano-spamd should just write to ham or spam folder depending on what happens (move to spam, spam, move from spam, ham)
apache2ctl -D FOREGROUND -k start" - create a simple python script that will use inotify on the ham and spam directory. Whenever a new file appear then run sa-learn --spam/ham and delete the file on success.
```
try: So let the Kopano and postfix containers share the `var/lib/kopano/spamd` folder and run the cron job in the postfix container.
```bash
source /etc/apache2/envvars ## Revisit Persistent Data
exec /usr/sbin/apache2 -DFOREGROUND
``` Consider consolidating directories which are candidates for persistence under `/srv`.
##Improve Health Check?
## Improve healthcheck
Verify the user anonymously. Verify the user anonymously.
```bash ```bash
ldapsearch -h dockerhost -xLLL -b dc=circuit-factory,dc=com '(kopanoAccount=1)' ldapsearch -h dockerhost -xLLL -b dc=example,dc=com '(kopanoAccount=1)'
``` ```
Check if kopano can get the user from LDAP Check if kopano can get the user from LDAP
@ -30,13 +30,3 @@ check that apache and mysql is running
apache2ctl status apache2ctl status
mysqlcheck -A mysqlcheck -A
``` ```
## kopano_spamd
[discussion](https://jira.kopano.io/browse/KC-666)
- let kopano-spamd create /var/lib/kopano/spamd/{ham,spam} with perm 770, user kopano, group amavis/spamassassin
- instead of invoking sa-learn, kopano-spamd should just write to ham or spam folder depending on what happend (move to spam, spam, move from spam, ham)
- create a simple python script that will use inotify on the ham and spam directory. Whenever a new file appear then run sa-learn --spam/ham and delete the file on success.
So let the Kopano and postfix containers share the `var/lib/kopano/spamd` folder and run the cron job in the postfix container.

View File

@ -1,3 +0,0 @@
#!/bin/bash
pkg=${1-kopano-server}
dpkg -l | sed -nr 's/.*'"$pkg"'\s+([^ ]+).*/\1/p'

View File

@ -1,16 +0,0 @@
#!/bin/sh
#
# health check
#
# uses the runit tool to check if a service that is configured to run is down.
# This is a quite limited check.
#
docker_build_runit_root=${docker_build_runit_root-/etc/service}
if sv status $(ls $docker_build_runit_root) | grep "normally up, want up"; then
exit 1
else
exit 0
fi

View File

@ -1,98 +0,0 @@
#!/bin/sh
# use /etc/service if $docker_build_runit_root not already defined
docker_build_runit_root=${docker_build_runit_root-/etc/service}
#docker_build_svlog_root=${docker_build_svlog_root-/var/log/sv}
#
# Define helpers
#
define_formats() {
name=$(basename $0)
f_norm="\e[0m"
f_bold="\e[1m"
f_red="\e[91m"
f_green="\e[92m"
f_yellow="\e[93m"
}
inform() {
echo "$f_bold${f_green}INFO ($name)${f_norm} $@"
}
#
# initialize runit services
#
init_service() {
# create runit 'run' script for service
# if service is part of kopano suite also make the 'run' script
# delete lingering pid files, which appears to happen to kopano-search
local cmd="$1"
shift
local runit_dir=$docker_build_runit_root/${cmd##*/}
local svlog_dir=$docker_build_svlog_root/${cmd##*/}
local clear_pids_str=
if echo $cmd | grep kopano - >/dev/null; then
clear_pids_str="rm -f /var/run/kopano/${cmd#*kopano-}.pid*"
fi
cmd=$(which $cmd)
if [ ! -z "$cmd" ]; then
mkdir -p $runit_dir
cat <<-!cat > $runit_dir/run
#!/bin/sh -e
#exec 2>&1
$(echo $clear_pids_str)
exec $cmd $@
!cat
chmod +x $runit_dir/run
inform "runit configured to run: $cmd $@"
if [ -n "$docker_build_svlog_root" ]; then
mkdir -p $runit_dir/log $svlog_dir
cat <<-!cat > $runit_dir/log/run
#!/bin/sh
exec svlogd -tt $svlog_dir
!cat
chmod +x $runit_dir/log/run
fi
fi
}
init_services() {
for cmd in "$@" ; do
init_service $cmd
done
}
down_service() {
local cmd="$1"
touch $docker_build_runit_root/$cmd/down
inform "runit configured to down: $cmd"
}
down_services() {
for cmd in "$@" ; do
down_service $cmd
done
}
setup_services() {
case "$1" in
-d|--down)
shift
init_services "$@"
down_services "$@"
;;
*)
init_services "$@"
;;
esac
}
#
# run
#
define_formats
setup_services "$@"

View File

@ -1,4 +1,5 @@
COMPOSE_PROJECT_NAME=demo COMPOSE_PROJECT_NAME=demo
SYSLOG_LEVEL=7
MAIL_DOMAIN=example.com MAIL_DOMAIN=example.com
MAIL_SRV=mx MAIL_SRV=mx
DKIM_SELECTOR=default DKIM_SELECTOR=default

View File

@ -1,12 +1,10 @@
-include *.mk .env .init.env -include *.mk .env .init.env
.PHONY: variables ps init up down destroy wait test \ _ip = $(shell docker inspect -f \
auth-up auth-down auth-cmd auth-logs auth-show_conf auth-show_user auth-add_user \ '{{range .NetworkSettings.Networks}}{{println .IPAddress}}{{end}}' \
mail-mta-up mail-mta-down mail-mta-cmd mail-mta-logs mail-mta-bayes mail-mta-test \ $(1) | head -n1)
mail-db-up mail-db-down mail-db-cmd mail-db-logs mail-db-test \
mail-app-up mail-app-down mail-app-cmd mail-app-logs mail-app-debugtools \ .PHONY:
mail-app-man_server mail-app-man_ldap \
mail-app-test mail-app-show_user1 mail-app-show_user2
variables: variables:
make -pn | grep -A1 "^# makefile"| grep -v "^#\|^--" | sort | uniq make -pn | grep -A1 "^# makefile"| grep -v "^#\|^--" | sort | uniq
@ -14,7 +12,7 @@ variables:
ps: ps:
docker-compose ps docker-compose ps
init: auth-up wait auth-add_user wait mail-db-up wait mail-mta-up wait mail-app-up init: auth-up wait_1 auth-add_user mail-db-up mail-mta-up wait_2 mail-app-up
up: up:
docker-compose up -d docker-compose up -d
@ -25,9 +23,15 @@ down:
destroy: destroy:
docker-compose down -v docker-compose down -v
wait: config:
docker-compose config
wait_%:
sleep 10 sleep 10
web:
firefox localhost:8080 &
test: mail-mta-test test: mail-mta-test
auth-up: auth-up:
@ -64,16 +68,23 @@ mail-mta-cmd:
mail-mta-logs: mail-mta-logs:
docker container logs $(COMPOSE_PROJECT_NAME)_mail-mta_1 docker container logs $(COMPOSE_PROJECT_NAME)_mail-mta_1
mail-mta-diff:
docker container diff $(COMPOSE_PROJECT_NAME)_mail-mta_1
mail-mta-bayes: mail-mta-bayes:
docker-compose exec mail-mta sh -c 'rm -f bayesian.database.gz && wget http://artinvoice.hu/spams/bayesian.database.gz && gunzip bayesian.database.gz && sa-learn --restore bayesian.database && chown -R amavis: /var/amavis/.spamassassin && rm -rf bayesian.database' docker-compose exec mail-mta sh -c 'rm -f bayesian.database.gz && wget http://artinvoice.hu/spams/bayesian.database.gz && gunzip bayesian.database.gz && sa-learn --restore bayesian.database && chown -R amavis: /var/amavis/.spamassassin && rm -rf bayesian.database'
mail-mta-test: mail-mta-test:
printf "EHLO mx\nMAIL FROM: <test@example.biz>\nRCPT TO: <$(LDAP_TEST_USER)@$(MAIL_DOMAIN)>\nDATA\nFrom: A tester <test@example.biz>\nTo: <$(LDAP_TEST_USER)@$(MAIL_DOMAIN)>\nDate: $$(date)\nSubject: A test message\n\nGreat news! You can receive email.\n.\nQUIT\n" \ printf "EHLO mx\nMAIL FROM: <test@example.biz>\nRCPT TO: <$(LDAP_TEST_USER)@$(MAIL_DOMAIN)>\nDATA\nFrom: A tester <test@example.biz>\nTo: <$(LDAP_TEST_USER)@$(MAIL_DOMAIN)>\nDate: $$(date)\nSubject: A SMTP test message\n\nGreat news! You can receive email.\n.\nQUIT\n" \
| nc -C localhost 25 | nc -C localhost 25
mail-mta-razor: mail-mta-razor:
docker-compose exec mail-mta conf cntcfg_razor_register docker-compose exec mail-mta conf cntcfg_razor_register
mail-mta-debugtools:
docker-compose exec mail-mta apk --no-cache --update add \
nano less lsof htop openldap-clients bind-tools iputils strace
mail-db-up: mail-db-up:
docker-compose up -d mail-db docker-compose up -d mail-db
@ -86,6 +97,9 @@ mail-db-cmd:
mail-db-logs: mail-db-logs:
docker container logs $(COMPOSE_PROJECT_NAME)_mail-db_1 docker container logs $(COMPOSE_PROJECT_NAME)_mail-db_1
mail-db-diff:
docker container diff $(COMPOSE_PROJECT_NAME)_mail-db_1
mail-db-test: mail-db-test:
docker-compose exec mail-db mysqlshow -u $(MYSQL_USER) $(MYSQL_DATABASE) -p$(MYSQL_PASSWORD) docker-compose exec mail-db mysqlshow -u $(MYSQL_USER) $(MYSQL_DATABASE) -p$(MYSQL_PASSWORD)
@ -101,10 +115,16 @@ mail-app-cmd:
mail-app-logs: mail-app-logs:
docker container logs $(COMPOSE_PROJECT_NAME)_mail-app_1 docker container logs $(COMPOSE_PROJECT_NAME)_mail-app_1
mail-app-diff:
docker container diff $(COMPOSE_PROJECT_NAME)_mail-app_1
mail-app-debugtools: mail-app-debugtools:
docker-compose exec mail-app apt-get update docker-compose exec mail-app apt-get update
docker-compose exec mail-app apt-get install --yes \ docker-compose exec mail-app apt-get install --yes \
less nano ldap-utils htop net-tools lsof iputils-ping less nano ldap-utils htop net-tools lsof iputils-ping strace
mail-app-htop: mail-app-debugtools
docker-compose exec mail-app htop
mail-app-man_server: mail-app-man_server:
docker-compose exec mail-app man kopano-server.cfg docker-compose exec mail-app man kopano-server.cfg
@ -112,7 +132,10 @@ mail-app-man_server:
mail-app-man_ldap: mail-app-man_ldap:
docker-compose exec mail-app man kopano-ldap.cfg docker-compose exec mail-app man kopano-ldap.cfg
mail-app-test: mail-mta-test mail-app-test_smtp: mail-mta-test
mail-app-test_lmtp:
printf "LHLO mx\nMAIL FROM: <test@example.biz>\nRCPT TO: <$(LDAP_TEST_USER)@$(MAIL_DOMAIN)>\nDATA\nFrom: A tester <test@example.biz>\nTo: <$(LDAP_TEST_USER)@$(MAIL_DOMAIN)>\nDate: $$(date)\nSubject: A LMTP test message from me to you\n\nDelete me, please \n.\nQUIT\n" | nc -C $(call _ip,$(COMPOSE_PROJECT_NAME)_mail-app_1) 2003
mail-app-show_user1: mail-app-show_user1:
docker-compose exec mail-app kopano-admin -l docker-compose exec mail-app kopano-admin -l

View File

@ -1,4 +1,4 @@
version: '3.7' version: '3'
services: services:
mail-app: mail-app:
@ -22,11 +22,13 @@ services:
- MYSQL_DATABASE=${MYSQL_DATABASE-kopano} - MYSQL_DATABASE=${MYSQL_DATABASE-kopano}
- MYSQL_USER=${MYSQL_USER-kopano} - MYSQL_USER=${MYSQL_USER-kopano}
- MYSQL_PASSWORD=${MYSQL_PASSWORD-secret} - MYSQL_PASSWORD=${MYSQL_PASSWORD-secret}
- SYSLOG_LEVEL=3 - SYSLOG_LEVEL=${SYSLOG_LEVEL-3}
volumes: volumes:
- mail-conf:/etc/kopano - mail-conf:/etc/kopano
- mail-atch:/var/lib/kopano/attachments - mail-atch:/var/lib/kopano/attachments
- mail-sync:/var/lib/z-push - mail-sync:/var/lib/z-push
cap_add: # helps debugging by alowing strace
- sys_ptrace
mail-mta: mail-mta:
image: mlan/postfix-amavis image: mlan/postfix-amavis
@ -47,9 +49,11 @@ services:
- LDAP_USER_BASE=ou=${LDAP_USEROU-users},${LDAP_BASE-dc=example,dc=com} - LDAP_USER_BASE=ou=${LDAP_USEROU-users},${LDAP_BASE-dc=example,dc=com}
- LDAP_QUERY_FILTER_USER=(&(objectclass=${LDAP_USEROBJ-posixAccount})(mail=%s)) - LDAP_QUERY_FILTER_USER=(&(objectclass=${LDAP_USEROBJ-posixAccount})(mail=%s))
- DKIM_SELECTOR=${DKIM_SELECTOR-default} - DKIM_SELECTOR=${DKIM_SELECTOR-default}
- SYSLOG_LEVEL=4 - SYSLOG_LEVEL=${SYSLOG_LEVEL-4}
volumes: volumes:
- mail-mta:/srv - mail-mta:/srv
cap_add: # helps debugging by alowing strace
- sys_ptrace
mail-db: mail-db:
image: mariadb image: mariadb

View File

@ -6,10 +6,10 @@ echo "hooks/build called with IMAGE_NAME=${DOCKER_REPO}:${DOCKER_TAG}, so we wil
#printenv #printenv
case "${DOCKER_TAG}" in case "${DOCKER_TAG}" in
core) bld_target=kopano-core ;; core) bld_target=core ;;
full) bld_target=kopano-full ;; full) bld_target=full ;;
debugtools) bld_target=kopano-debugtools ;; debugtools) bld_target=debugtools ;;
webapp) bld_target=kopano-webapp ;; webapp) bld_target=core-webapp ;;
*) *)
echo "NOTHING since we do not know how to build with tag=${DOCKER_TAG}" echo "NOTHING since we do not know how to build with tag=${DOCKER_TAG}"
exit 1 exit 1

View File

@ -1,7 +1,7 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# hooks/post_push # hooks/post_push
version=$(assets/kopano-webaddr.sh -VV) version=$(src/docker/bin/kopano-webaddr.sh -VV)
_docker_add_tags() { _docker_add_tags() {
local tag="$1" local tag="$1"

View File

@ -4,7 +4,7 @@
# config # config
# #
docker_build_runit_root=${docker_build_runit_root-/etc/service} DOCKER_RUNSV_DIR=${DOCKER_RUNSV_DIR-/etc/service}
kopano_user=kopano kopano_user=kopano
kopano_cfg_dir=/etc/kopano kopano_cfg_dir=/etc/kopano
kopano_atch_dir=/var/lib/kopano/attachments kopano_atch_dir=/var/lib/kopano/attachments
@ -12,6 +12,7 @@ zpush_cfg_dir=/usr/share/z-push
server_cfg_file=$kopano_cfg_dir/server.cfg server_cfg_file=$kopano_cfg_dir/server.cfg
ldap_cfg_file=$kopano_cfg_dir/ldap.cfg ldap_cfg_file=$kopano_cfg_dir/ldap.cfg
spooler_cfg_file=$kopano_cfg_dir/spooler.cfg spooler_cfg_file=$kopano_cfg_dir/spooler.cfg
dagent_cfg_file=$kopano_cfg_dir/dagent.cfg
zpush_cfg_file=$zpush_cfg_dir/config.php zpush_cfg_file=$zpush_cfg_dir/config.php
sqlstate_cfg_file=$zpush_cfg_dir/backend/sqlstatemachine/config.php sqlstate_cfg_file=$zpush_cfg_dir/backend/sqlstatemachine/config.php
@ -22,6 +23,7 @@ sqlstate_cfg_file=$zpush_cfg_dir/backend/sqlstatemachine/config.php
server_env_vars="MYSQL_HOST MYSQL_PORT MYSQL_DATABASE MYSQL_USER MYSQL_PASSWORD DISABLED_FEATURES USER_PLUGIN LOG_LEVEL" server_env_vars="MYSQL_HOST MYSQL_PORT MYSQL_DATABASE MYSQL_USER MYSQL_PASSWORD DISABLED_FEATURES USER_PLUGIN LOG_LEVEL"
ldap_env_vars="LDAP_HOST LDAP_PORT LDAP_PROTOCOL LDAP_SEARCH_BASE LDAP_USER_TYPE_ATTRIBUTE_VALUE LDAP_GROUP_TYPE_ATTRIBUTE_VALUE LDAP_USER_SEARCH_FILTER" ldap_env_vars="LDAP_HOST LDAP_PORT LDAP_PROTOCOL LDAP_SEARCH_BASE LDAP_USER_TYPE_ATTRIBUTE_VALUE LDAP_GROUP_TYPE_ATTRIBUTE_VALUE LDAP_USER_SEARCH_FILTER"
spooler_env_vars="SMTP_SERVER SMTP_PORT" spooler_env_vars="SMTP_SERVER SMTP_PORT"
dagent_env_vars="LMTP_LISTEN"
zpush_env_vars="TIMEZONE USE_CUSTOM_REMOTE_IP_HEADER USE_FULLEMAIL_FOR_LOGIN STATE_MACHINE STATE_DIR LOGBACKEND LOGLEVEL LOGAUTHFAIL LOG_SYSLOG_PROGRAM LOG_SYSLOG_FACILITY SYNC_CONFLICT_DEFAULT PING_INTERVAL FILEAS_ORDER SYNC_MAX_ITEMS UNSET_UNDEFINED_PROPERTIES ALLOW_WEBSERVICE_USERS_ACCESS USE_PARTIAL_FOLDERSYNC" zpush_env_vars="TIMEZONE USE_CUSTOM_REMOTE_IP_HEADER USE_FULLEMAIL_FOR_LOGIN STATE_MACHINE STATE_DIR LOGBACKEND LOGLEVEL LOGAUTHFAIL LOG_SYSLOG_PROGRAM LOG_SYSLOG_FACILITY SYNC_CONFLICT_DEFAULT PING_INTERVAL FILEAS_ORDER SYNC_MAX_ITEMS UNSET_UNDEFINED_PROPERTIES ALLOW_WEBSERVICE_USERS_ACCESS USE_PARTIAL_FOLDERSYNC"
sqlstate_env_vars="STATE_SQL_ENGINE STATE_SQL_SERVER STATE_SQL_PORT STATE_SQL_DATABASE STATE_SQL_USER STATE_SQL_PASSWORD STATE_SQL_OPTIONS" sqlstate_env_vars="STATE_SQL_ENGINE STATE_SQL_SERVER STATE_SQL_PORT STATE_SQL_DATABASE STATE_SQL_USER STATE_SQL_PASSWORD STATE_SQL_OPTIONS"
@ -92,19 +94,20 @@ _php_cfg_gen() {
} }
kopano_cfg() { kopano_cfg() {
_kopano_cfg_gen $server_cfg_file $server_env_vars _kopano_cfg_gen $server_cfg_file $server_env_vars
_kopano_cfg_gen $ldap_cfg_file $ldap_env_vars _kopano_cfg_gen $ldap_cfg_file $ldap_env_vars
_kopano_cfg_gen $spooler_cfg_file $spooler_env_vars _kopano_cfg_gen $spooler_cfg_file $spooler_env_vars
_kopano_cfg_gen $dagent_cfg_file $dagent_env_vars
} }
php_cfg() { php_cfg() {
_php_cfg_gen $zpush_cfg_file $zpush_env_vars _php_cfg_gen $zpush_cfg_file $zpush_env_vars
_php_cfg_gen $sqlstate_cfg_file $sqlstate_env_vars _php_cfg_gen $sqlstate_cfg_file $sqlstate_env_vars
} }
loglevel() { loglevel() {
if [ -n "$SYSLOG_LEVEL" -a $SYSLOG_LEVEL -ne 4 ]; then if [ -n "$SYSLOG_LEVEL" -a $SYSLOG_LEVEL -ne 4 ]; then
setup-runit.sh "syslogd -n -O /dev/stdout -l $SYSLOG_LEVEL" setup-runit.sh "syslogd -n -O - -l $SYSLOG_LEVEL $SYSLOG_OPTIONS"
fi fi
} }
@ -119,5 +122,5 @@ php_cfg
loglevel loglevel
exec 2>&1 exec 2>&1
exec runsvdir -P $docker_build_runit_root exec runsvdir -P $DOCKER_RUNSV_DIR

127
src/docker/bin/setup-runit.sh Executable file
View File

@ -0,0 +1,127 @@
#!/bin/sh
#
# setup-runit.sh
#
# use /etc/service if $DOCKER_RUNSV_DIR not already defined
DOCKER_RUNSV_DIR=${DOCKER_RUNSV_DIR-/etc/service}
DOCKER_SVLOG_DIR=${DOCKER_SVLOG_DIR-/var/log/sv}
DOCKER_RUN_DIR=${DOCKER_RUN_DIR-/var/run}
#
# Define helpers
#
usage() {
cat <<-!cat
NAME
setup-runit.sh
SYNOPSIS
setup-runit.sh [-d] [-f] [-h] [-l] [-n name] [-s file] [-q] command [args]
OPTIONS
-d default down
-f remove lingering pid file at start up
-h print this text and exit
-l activate logging (svlogd)
-n name use this name instead of command
-s file source file
-q send stdout and stderr to /dev/null
EXAMPLES
setup-runit.sh "kopano-dagent -l" "-d kopano-grapi serve"
"-q -s /etc/apache2/envvars apache2 -DFOREGROUND -DNO_DETACH -k start"
!cat
}
base_name() { local base=${1##*/}; echo ${base%%.*} ;}
pid_name() {
local dir_name=${1%%-*}
local pid_name=${1##*-}
echo "${DOCKER_RUN_DIR}/${dir_name}/${pid_name}.pid"
}
inform() {
name=$(basename $0)
case "$1" in
0) pre_string="\e[1m\e[92mINFO ($name)\e[0m";;
1) pre_string="\e[1m\e[93mWARN ($name)\e[0m";;
2) pre_string="\e[1m\e[91mERROR ($name)\e[0m";;
esac
shift
printf "$pre_string %s\n" "$*"
}
add_opt() {
if [ -z "$options" ]; then
options=$1
else
options="$options,$1"
fi
}
#
# Define main function
#
init_service() {
local redirstd=
local clearpid=
local sourcefile=
local sv_name cmd runsv_dir svlog_dir sv_log sv_down sv_force options
while getopts ":dfhln:s:q" opts; do
case "${opts}" in
d) sv_down="down"; add_opt "down";;
f) sv_force="force"; add_opt "force";;
h) usage; exit;;
l) sv_log="log"; add_opt "log";;
n) sv_name="${OPTARG}"; add_opt "name";;
s) sourcefile=". ${OPTARG}"; add_opt "source";;
q) redirstd="exec >/dev/null"; add_opt "quiet";;
esac
done
shift $((OPTIND -1))
cmd=$(which "$1")
sv_name=${sv_name-$(base_name $1)}
runsv_dir=$DOCKER_RUNSV_DIR/$sv_name
svlog_dir=$DOCKER_SVLOG_DIR/$sv_name
if [ -n "$sv_force" ]; then
forcepid="$(echo rm -f $(pid_name $sv_name)*)"
fi
shift
if [ ! -z "$cmd" ]; then
inform 0 "Setting up ($sv_name) options ($options) args ($@)"
mkdir -p $runsv_dir
cat <<-!cat > $runsv_dir/run
#!/bin/sh -e
exec 2>&1
$forcepid
$redirstd
$sourcefile
exec $cmd $@
!cat
chmod +x $runsv_dir/run
if [ -n "$sv_down" ]; then
touch $runsv_dir/down
fi
if [ -n "$sv_log" ]; then
mkdir -p $runsv_dir/log $svlog_dir
cat <<-!cat > $runsv_dir/log/run
#!/bin/sh
exec svlogd -tt $svlog_dir
!cat
chmod +x $runsv_dir/log/run
fi
fi
}
#
# run
#
for cmd in "$@" ; do
init_service $cmd
done