mirror of
				https://github.com/zokradonh/kopano-docker
				synced 2025-10-31 02:17:47 +00:00 
			
		
		
		
	Run all containers read-only (#314)
* switch containers in compose file to read-only related to https://github.com/zokradonh/kopano-docker/issues/310 * make scheduler container read-only * make meet container read-only * fix konnect for read-only * make core mostly read-only * add custom location for ldap.cfg to default config * sort config option for readability * update makefile pull workaround * make kdav read-only * remove locale generation code from core startup * fix commander tests * fix store language tests * add test for a dutch mailbox * make it possible to run webapp read-only * add locale hint to the compose file * finish read-only mode for z-push
This commit is contained in:
		
							parent
							
								
									5a4335998d
								
							
						
					
					
						commit
						70e9940b38
					
				
							
								
								
									
										5
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										5
									
								
								Makefile
									
									
									
									
									
								
							| @ -36,6 +36,7 @@ TAG_FILE := build.tags | |||||||
| export
 | export
 | ||||||
| 
 | 
 | ||||||
| # convert lowercase componentname to uppercase
 | # convert lowercase componentname to uppercase
 | ||||||
|  | component ?= base | ||||||
| COMPONENT = $(shell echo $(component) | tr a-z A-Z) | COMPONENT = $(shell echo $(component) | tr a-z A-Z) | ||||||
| 
 | 
 | ||||||
| .PHONY: default | .PHONY: default | ||||||
| @ -149,7 +150,7 @@ build-python: | |||||||
| 	component=python make build | 	component=python make build | ||||||
| 
 | 
 | ||||||
| build-kdav: | build-kdav: | ||||||
| 	docker pull composer:1.8 | 	docker pull composer:1.9 | ||||||
| 	component=kdav make build-builder | 	component=kdav make build-builder | ||||||
| 	component=kdav make build | 	component=kdav make build | ||||||
| 
 | 
 | ||||||
| @ -158,7 +159,7 @@ build-scheduler: | |||||||
| 	component=scheduler make build-simple | 	component=scheduler make build-simple | ||||||
| 
 | 
 | ||||||
| build-ssl: | build-ssl: | ||||||
| 	docker pull alpine:3.9 | 	docker pull alpine:3.11 | ||||||
| 	component=ssl make build-simple | 	component=ssl make build-simple | ||||||
| 
 | 
 | ||||||
| build-utils: | build-utils: | ||||||
|  | |||||||
| @ -57,8 +57,10 @@ RUN curl -L https://github.com/aelsabbahy/goss/releases/download/$GOSS_VERSION/g | |||||||
|     chmod +rx /usr/local/bin/goss && \ |     chmod +rx /usr/local/bin/goss && \ | ||||||
|     goss --version |     goss --version | ||||||
| 
 | 
 | ||||||
|  | # if additional locales are required this should be adjusted here | ||||||
| RUN sed -i -e 's/# en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/' /etc/locale.gen && \ | RUN sed -i -e 's/# en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/' /etc/locale.gen && \ | ||||||
|     sed -i -e 's/# de_DE.UTF-8 UTF-8/de_DE.UTF-8 UTF-8/' /etc/locale.gen && \ |     sed -i -e 's/# de_DE.UTF-8 UTF-8/de_DE.UTF-8 UTF-8/' /etc/locale.gen && \ | ||||||
|  |     sed -i -e 's/# nl_NL.UTF-8 UTF-8/nl_NL.UTF-8 UTF-8/' /etc/locale.gen && \ | ||||||
|     dpkg-reconfigure --frontend=noninteractive locales && \ |     dpkg-reconfigure --frontend=noninteractive locales && \ | ||||||
|     update-locale LANG=en_US.UTF-8 |     update-locale LANG=en_US.UTF-8 | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -24,7 +24,7 @@ tests: | |||||||
|       env: |       env: | ||||||
|         ADDITIONAL_KOPANO_PACKAGES: "kopano-server" |         ADDITIONAL_KOPANO_PACKAGES: "kopano-server" | ||||||
|   generate configuration for kopano-server: |   generate configuration for kopano-server: | ||||||
|     command: /usr/bin/python3 /kopano/server.py && cat /etc/kopano/server.cfg |     command: bash -c "shopt -s expand_aliases; alias exec='echo'; . /kopano/start-service.sh" && cat /tmp/kopano/server.cfg | ||||||
|     exit-code: 0 |     exit-code: 0 | ||||||
|     stdout: |     stdout: | ||||||
|       contains: |       contains: | ||||||
| @ -33,7 +33,7 @@ tests: | |||||||
|       not-contains: |       not-contains: | ||||||
|         - #server_listen_tls = *:237 |         - #server_listen_tls = *:237 | ||||||
|   generate ldap configuration openLDAP (default): |   generate ldap configuration openLDAP (default): | ||||||
|     command: /usr/bin/python3 /kopano/server.py && cat /etc/kopano/ldap.cfg |     command: bash -c "shopt -s expand_aliases; alias exec='echo'; . /kopano/start-service.sh" && cat /tmp/kopano/ldap.cfg | ||||||
|     exit-code: 0 |     exit-code: 0 | ||||||
|     stdout: |     stdout: | ||||||
|       contains: |       contains: | ||||||
| @ -42,7 +42,7 @@ tests: | |||||||
|       not-contains: |       not-contains: | ||||||
|         - "#!include /usr/share/kopano/ldap.openldap.cfg" |         - "#!include /usr/share/kopano/ldap.openldap.cfg" | ||||||
|   generate ldap configuration for ADS: |   generate ldap configuration for ADS: | ||||||
|     command: /usr/bin/python3 /kopano/server.py && cat /etc/kopano/ldap.cfg |     command: bash -c "shopt -s expand_aliases; alias exec='echo'; . /kopano/start-service.sh" && cat /tmp/kopano/ldap.cfg | ||||||
|     exit-code: 0 |     exit-code: 0 | ||||||
|     stdout: |     stdout: | ||||||
|       contains: |       contains: | ||||||
| @ -55,16 +55,6 @@ tests: | |||||||
|         KCCOMMENT_LDAP_1: "!include /usr/share/kopano/ldap.openldap.cfg" |         KCCOMMENT_LDAP_1: "!include /usr/share/kopano/ldap.openldap.cfg" | ||||||
|         KCUNCOMMENT_LDAP_1: "!include /usr/share/kopano/ldap.active-directory.cfg" |         KCUNCOMMENT_LDAP_1: "!include /usr/share/kopano/ldap.active-directory.cfg" | ||||||
|   start-service script default locale: |   start-service script default locale: | ||||||
|     command: bash -c "shopt -s expand_aliases; alias exec='echo'; . /kopano/start-service.sh && locale -a" |  | ||||||
|     exit-code: 0 |  | ||||||
|     stdout: |  | ||||||
|       contains: |  | ||||||
|         - C |  | ||||||
|         - C.UTF-8 |  | ||||||
|         - de_DE.utf8 |  | ||||||
|         - en_US.utf8 |  | ||||||
|         - POSIX |  | ||||||
|   start-service script dutch locale: |  | ||||||
|     command: bash -c "shopt -s expand_aliases; alias exec='echo'; . /kopano/start-service.sh && locale -a" |     command: bash -c "shopt -s expand_aliases; alias exec='echo'; . /kopano/start-service.sh && locale -a" | ||||||
|     exit-code: 0 |     exit-code: 0 | ||||||
|     stdout: |     stdout: | ||||||
| @ -75,38 +65,6 @@ tests: | |||||||
|         - en_US.utf8 |         - en_US.utf8 | ||||||
|         - nl_NL.utf8 |         - nl_NL.utf8 | ||||||
|         - POSIX |         - POSIX | ||||||
|     config: |  | ||||||
|       env: |  | ||||||
|         KCCONF_ADMIN_DEFAULT_STORE_LOCALE: "nl_NL.UTF-8" |  | ||||||
|   start-service script dutch locale (short): |  | ||||||
|     command: bash -c "shopt -s expand_aliases; alias exec='echo'; . /kopano/start-service.sh && locale -a" |  | ||||||
|     exit-code: 0 |  | ||||||
|     stdout: |  | ||||||
|       contains: |  | ||||||
|         - C |  | ||||||
|         - C.UTF-8 |  | ||||||
|         - de_DE.utf8 |  | ||||||
|         - en_US.utf8 |  | ||||||
|         - nl_NL.utf8 |  | ||||||
|         - POSIX |  | ||||||
|     config: |  | ||||||
|       env: |  | ||||||
|         KCCONF_ADMIN_DEFAULT_STORE_LOCALE: "nl_NL" |  | ||||||
|   start-service script unknown locale: |  | ||||||
|     command: bash -c "shopt -s expand_aliases; alias exec='echo'; . /kopano/start-service.sh && locale -a" |  | ||||||
|     exit-code: 0 |  | ||||||
|     stdout: |  | ||||||
|       contains: |  | ||||||
|         - C |  | ||||||
|         - C.UTF-8 |  | ||||||
|         - de_DE.utf8 |  | ||||||
|         - en_US.utf8 |  | ||||||
|         - POSIX |  | ||||||
|       not-contains: |  | ||||||
|         - abc |  | ||||||
|     config: |  | ||||||
|       env: |  | ||||||
|         KCCONF_ADMIN_DEFAULT_STORE_LOCALE: "abc" |  | ||||||
|   start-service script no dockerize: |   start-service script no dockerize: | ||||||
|     command: bash -c "shopt -s expand_aliases; alias exec='echo'; . /kopano/start-service.sh" |     command: bash -c "shopt -s expand_aliases; alias exec='echo'; . /kopano/start-service.sh" | ||||||
|     exit-code: 0 |     exit-code: 0 | ||||||
|  | |||||||
| @ -3,7 +3,7 @@ import kcconf | |||||||
| 
 | 
 | ||||||
| # Component specific configurations | # Component specific configurations | ||||||
| kcconf.configkopano({ | kcconf.configkopano({ | ||||||
|     r"/etc/kopano/dagent.cfg": |     r"/tmp/kopano/dagent.cfg": | ||||||
|     { |     { | ||||||
|         'lmtp_listen': "0.0.0.0:2003", |         'lmtp_listen': "0.0.0.0:2003", | ||||||
|         'log_file': "-", |         'log_file': "-", | ||||||
| @ -13,4 +13,4 @@ kcconf.configkopano({ | |||||||
| }) | }) | ||||||
| 
 | 
 | ||||||
| # Override configs from environment variables | # Override configs from environment variables | ||||||
| kcconf.configkopano(kcconf.parseenvironmentvariables(r"/etc/kopano/")) | kcconf.configkopano(kcconf.parseenvironmentvariables(r"/tmp/kopano/")) | ||||||
|  | |||||||
| @ -3,7 +3,7 @@ import kcconf | |||||||
| 
 | 
 | ||||||
| # Component specific configurations | # Component specific configurations | ||||||
| kcconf.configkopano({ | kcconf.configkopano({ | ||||||
|     r"/etc/kopano/gateway.cfg": |     r"/tmp/kopano/gateway.cfg": | ||||||
|     { |     { | ||||||
|         'imap_listen': "0.0.0.0:143", |         'imap_listen': "0.0.0.0:143", | ||||||
|         'log_file': "-", |         'log_file': "-", | ||||||
| @ -13,4 +13,4 @@ kcconf.configkopano({ | |||||||
| }) | }) | ||||||
| 
 | 
 | ||||||
| # Override configs from environment variables | # Override configs from environment variables | ||||||
| kcconf.configkopano(kcconf.parseenvironmentvariables(r"/etc/kopano/")) | kcconf.configkopano(kcconf.parseenvironmentvariables(r"/tmp/kopano/")) | ||||||
|  | |||||||
| @ -2,4 +2,4 @@ import os | |||||||
| import kcconf | import kcconf | ||||||
| 
 | 
 | ||||||
| # Override configs from environment variables | # Override configs from environment variables | ||||||
| kcconf.configkopano(kcconf.parseenvironmentvariables(r"/etc/kopano/")) | kcconf.configkopano(kcconf.parseenvironmentvariables(r"/tmp/kopano/")) | ||||||
|  | |||||||
| @ -3,7 +3,7 @@ import kcconf | |||||||
| 
 | 
 | ||||||
| # Component specific configurations | # Component specific configurations | ||||||
| kcconf.configkopano({ | kcconf.configkopano({ | ||||||
|     r"/etc/kopano/ical.cfg": |     r"/tmp/kopano/ical.cfg": | ||||||
|     { |     { | ||||||
|         'ical_listen': "0.0.0.0:8080", |         'ical_listen': "0.0.0.0:8080", | ||||||
|         'log_file': "-", |         'log_file': "-", | ||||||
| @ -12,4 +12,4 @@ kcconf.configkopano({ | |||||||
| }) | }) | ||||||
| 
 | 
 | ||||||
| # Override configs from environment variables | # Override configs from environment variables | ||||||
| kcconf.configkopano(kcconf.parseenvironmentvariables(r"/etc/kopano/")) | kcconf.configkopano(kcconf.parseenvironmentvariables(r"/tmp/kopano/")) | ||||||
|  | |||||||
| @ -3,7 +3,7 @@ import kcconf | |||||||
| 
 | 
 | ||||||
| # Component specific configurations | # Component specific configurations | ||||||
| kcconf.configkopano({ | kcconf.configkopano({ | ||||||
|     r"/etc/kopano/kapid.cfg": |     r"/tmp/kopano/kapid.cfg": | ||||||
|     { |     { | ||||||
|         'log_level': "info", |         'log_level': "info", | ||||||
|         'listen': "0.0.0.0:8039", |         'listen': "0.0.0.0:8039", | ||||||
| @ -15,4 +15,4 @@ kcconf.configkopano({ | |||||||
| }) | }) | ||||||
| 
 | 
 | ||||||
| # Override configs from environment variables | # Override configs from environment variables | ||||||
| kcconf.configkopano(kcconf.parseenvironmentvariables(r"/etc/kopano/")) | kcconf.configkopano(kcconf.parseenvironmentvariables(r"/tmp/kopano/")) | ||||||
|  | |||||||
| @ -3,7 +3,7 @@ import kcconf | |||||||
| 
 | 
 | ||||||
| # Component specific configurations | # Component specific configurations | ||||||
| kcconf.configkopano({ | kcconf.configkopano({ | ||||||
|     r"/etc/kopano/monitor.cfg": |     r"/tmp/kopano/monitor.cfg": | ||||||
|     { |     { | ||||||
|         'log_file': "-", |         'log_file': "-", | ||||||
|         'log_level': "4" |         'log_level': "4" | ||||||
| @ -11,4 +11,4 @@ kcconf.configkopano({ | |||||||
| }) | }) | ||||||
| 
 | 
 | ||||||
| # Override configs from environment variables | # Override configs from environment variables | ||||||
| kcconf.configkopano(kcconf.parseenvironmentvariables(r"/etc/kopano/")) | kcconf.configkopano(kcconf.parseenvironmentvariables(r"/tmp/kopano/")) | ||||||
|  | |||||||
| @ -3,7 +3,7 @@ import kcconf | |||||||
| 
 | 
 | ||||||
| # Component specific configurations | # Component specific configurations | ||||||
| kcconf.configkopano({ | kcconf.configkopano({ | ||||||
|     r"/etc/kopano/search.cfg": |     r"/tmp/kopano/search.cfg": | ||||||
|     { |     { | ||||||
|         'log_file': "-", |         'log_file': "-", | ||||||
|         'log_level': "4", |         'log_level': "4", | ||||||
| @ -12,4 +12,4 @@ kcconf.configkopano({ | |||||||
| }) | }) | ||||||
| 
 | 
 | ||||||
| # Override configs from environment variables | # Override configs from environment variables | ||||||
| kcconf.configkopano(kcconf.parseenvironmentvariables(r"/etc/kopano/")) | kcconf.configkopano(kcconf.parseenvironmentvariables(r"/tmp/kopano/")) | ||||||
|  | |||||||
| @ -3,19 +3,20 @@ import kcconf | |||||||
| 
 | 
 | ||||||
| # Component specific configurations | # Component specific configurations | ||||||
| kcconf.configkopano({ | kcconf.configkopano({ | ||||||
|     r"/etc/kopano/server.cfg": |     r"/tmp/kopano/server.cfg": | ||||||
|     { |     { | ||||||
|  |         'attachment_path': "/kopano/data/attachments/", | ||||||
|  |         'kcoidc_initialize_timeout': "360", | ||||||
|         'log_file': "-", |         'log_file': "-", | ||||||
|         'log_level': "3", |         'log_level': "3", | ||||||
|         'attachment_path': "/kopano/data/attachments/", |  | ||||||
|         'user_plugin': "ldap", |  | ||||||
|         'server_listen': "0.0.0.0:236", |  | ||||||
|         'server_listen_tls': "0.0.0.0:237", |         'server_listen_tls': "0.0.0.0:237", | ||||||
|         'sync_gab_realtime': "no", |         'server_listen': "0.0.0.0:236", | ||||||
|         'softdelete_lifetime': "0", |         'softdelete_lifetime': "0", | ||||||
|         'kcoidc_initialize_timeout': "360" |         'sync_gab_realtime': "no", | ||||||
|  |         'user_plugin_config': "/tmp/kopano/ldap.cfg", | ||||||
|  |         'user_plugin': "ldap" | ||||||
|     } |     } | ||||||
| }) | }) | ||||||
| 
 | 
 | ||||||
| # Override configs from environment variables | # Override configs from environment variables | ||||||
| kcconf.configkopano(kcconf.parseenvironmentvariables(r"/etc/kopano/")) | kcconf.configkopano(kcconf.parseenvironmentvariables(r"/tmp/kopano/")) | ||||||
|  | |||||||
| @ -3,7 +3,7 @@ import kcconf | |||||||
| 
 | 
 | ||||||
| # Component specific configurations | # Component specific configurations | ||||||
| kcconf.configkopano({ | kcconf.configkopano({ | ||||||
|     r"/etc/kopano/spooler.cfg": |     r"/tmp/kopano/spooler.cfg": | ||||||
|     { |     { | ||||||
|         'log_file': "-", |         'log_file': "-", | ||||||
|         'log_level': "4", |         'log_level': "4", | ||||||
| @ -12,4 +12,4 @@ kcconf.configkopano({ | |||||||
| }) | }) | ||||||
| 
 | 
 | ||||||
| # Override configs from environment variables | # Override configs from environment variables | ||||||
| kcconf.configkopano(kcconf.parseenvironmentvariables(r"/etc/kopano/")) | kcconf.configkopano(kcconf.parseenvironmentvariables(r"/tmp/kopano/")) | ||||||
|  | |||||||
| @ -15,11 +15,17 @@ KCCONF_SEARCH_SERVER_SOCKET=${KCCONF_SEARCH_SERVER_SOCKET:-"file:///var/run/kopa | |||||||
| KCCONF_SPOOLER_SERVER_SOCKET=${KCCONF_SPOOLER_SERVER_SOCKET:-"file:///var/run/kopano/server.sock"} | KCCONF_SPOOLER_SERVER_SOCKET=${KCCONF_SPOOLER_SERVER_SOCKET:-"file:///var/run/kopano/server.sock"} | ||||||
| KOPANO_CON=${KOPANO_CON:-"file:///var/run/kopano/server.sock"} | KOPANO_CON=${KOPANO_CON:-"file:///var/run/kopano/server.sock"} | ||||||
| 
 | 
 | ||||||
|  | # copy configuration files to /tmp/kopano to prevent modification of mounted config files | ||||||
|  | mkdir -p /tmp/kopano | ||||||
|  | cp /etc/kopano/*.cfg /tmp/kopano | ||||||
|  | 
 | ||||||
| if [ ! -e /kopano/"$SERVICE_TO_START".py ]; then | if [ ! -e /kopano/"$SERVICE_TO_START".py ]; then | ||||||
| 	echo "Invalid service specified: $SERVICE_TO_START" | ts | 	echo "Invalid service specified: $SERVICE_TO_START" | ts | ||||||
| 	exit 1 | 	exit 1 | ||||||
| fi | fi | ||||||
| 
 | 
 | ||||||
|  | # Hint: this is not compatible with a read-only container. | ||||||
|  | # The general recommendation is to already build a container that has all required packages installed. | ||||||
| ADDITIONAL_KOPANO_PACKAGES=$(echo "$ADDITIONAL_KOPANO_PACKAGES" | tr -d '"') | ADDITIONAL_KOPANO_PACKAGES=$(echo "$ADDITIONAL_KOPANO_PACKAGES" | tr -d '"') | ||||||
| [ -n "${ADDITIONAL_KOPANO_PACKAGES// }" ] && apt update | [ -n "${ADDITIONAL_KOPANO_PACKAGES// }" ] && apt update | ||||||
| [ -n "${ADDITIONAL_KOPANO_PACKAGES// }" ] && for installpkg in $ADDITIONAL_KOPANO_PACKAGES; do | [ -n "${ADDITIONAL_KOPANO_PACKAGES// }" ] && for installpkg in $ADDITIONAL_KOPANO_PACKAGES; do | ||||||
| @ -31,8 +37,9 @@ ADDITIONAL_KOPANO_PACKAGES=$(echo "$ADDITIONAL_KOPANO_PACKAGES" | tr -d '"') | |||||||
| 	fi | 	fi | ||||||
| done | done | ||||||
| 
 | 
 | ||||||
| mkdir -p /kopano/data/attachments /kopano/data/kapi-kvs /tmp/"$SERVICE_TO_START" /var/run/kopano /var/lib/kopano-grapi | mkdir -p /tmp/"$SERVICE_TO_START" /var/run/kopano | ||||||
| 
 | 
 | ||||||
|  | # TODO is this still required now that we won't modify configuration mounted to /etc/kopano? | ||||||
| if [ "${DISABLE_CONFIG_CHANGES}" == false ]; then | if [ "${DISABLE_CONFIG_CHANGES}" == false ]; then | ||||||
| 	echo "Configure core service '$SERVICE_TO_START'" | ts | 	echo "Configure core service '$SERVICE_TO_START'" | ts | ||||||
| 	/usr/bin/python3 /kopano/"$SERVICE_TO_START".py | 	/usr/bin/python3 /kopano/"$SERVICE_TO_START".py | ||||||
| @ -41,10 +48,6 @@ fi | |||||||
| # ensure removed pid-file on unclean shutdowns and mounted volumes | # ensure removed pid-file on unclean shutdowns and mounted volumes | ||||||
| rm -f /var/run/kopano/"$SERVICE_TO_START".pid | rm -f /var/run/kopano/"$SERVICE_TO_START".pid | ||||||
| 
 | 
 | ||||||
| echo "Set ownership" | ts |  | ||||||
| chown kopano:kopano /kopano/data/ /kopano/data/attachments |  | ||||||
| chown kapi:kopano /var/lib/kopano-grapi |  | ||||||
| 
 |  | ||||||
| coreversion=$(dpkg-query --showformat='${Version}' --show kopano-server) | coreversion=$(dpkg-query --showformat='${Version}' --show kopano-server) | ||||||
| echo "Using Kopano Groupware Core: $coreversion" | echo "Using Kopano Groupware Core: $coreversion" | ||||||
| 
 | 
 | ||||||
| @ -89,29 +92,9 @@ fi | |||||||
| # start regular service | # start regular service | ||||||
| case "$SERVICE_TO_START" in | case "$SERVICE_TO_START" in | ||||||
| server) | server) | ||||||
| 	# TODO this could check if the desired locale already exists before calling sed | 	echo "Set ownership" | ts | ||||||
| 	KCCONF_ADMIN_DEFAULT_STORE_LOCALE=${KCCONF_ADMIN_DEFAULT_STORE_LOCALE:-"en_US.UTF-8"} | 	mkdir -p /kopano/data/attachments | ||||||
| 	# get locales from env | 	chown kopano:kopano /kopano/data/ /kopano/data/attachments | ||||||
| 	# shellcheck disable=SC1004 |  | ||||||
| 	sed --regexp-extended --expression=' |  | ||||||
| 
 |  | ||||||
| 		1  { |  | ||||||
| 			i\ |  | ||||||
| # This file lists locales that you wish to have built. You can find a list\ |  | ||||||
| # of valid supported locales at /usr/share/i18n/SUPPORTED, and you can add\ |  | ||||||
| # user defined locales to /usr/local/share/i18n/SUPPORTED. If you change\ |  | ||||||
| # this file, you need to rerun locale-gen.\ |  | ||||||
| \ |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 			} |  | ||||||
| 
 |  | ||||||
| 		/^('"$KCCONF_ADMIN_DEFAULT_STORE_LOCALE"')(_[[:upper:]]+)?(\.UTF-8)?(@[^[:space:]]+)?[[:space:]]+UTF-8$/!   s/^/# / |  | ||||||
| 	' /usr/share/i18n/SUPPORTED >  /etc/locale.gen |  | ||||||
| 	# make sure that en_US and de_DE are always there |  | ||||||
| 	sed -i -e 's/# en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/' /etc/locale.gen |  | ||||||
| 	sed -i -e 's/# de_DE.UTF-8 UTF-8/de_DE.UTF-8 UTF-8/' /etc/locale.gen |  | ||||||
| 	dpkg-reconfigure --frontend=noninteractive locales |  | ||||||
| 	 | 	 | ||||||
| 	if [[ "$DISABLE_CHECKS" == false ]]; then | 	if [[ "$DISABLE_CHECKS" == false ]]; then | ||||||
| 		# determine db connection mode (unix vs. network socket) | 		# determine db connection mode (unix vs. network socket) | ||||||
| @ -129,11 +112,11 @@ server) | |||||||
| 	fi | 	fi | ||||||
| 	# pre populate database | 	# pre populate database | ||||||
| 	if dpkg --compare-versions "$coreversion" "gt" "8.7.84"; then | 	if dpkg --compare-versions "$coreversion" "gt" "8.7.84"; then | ||||||
| 		kopano-dbadm populate | 		kopano-dbadm -c /tmp/kopano/server.cfg populate | ||||||
| 	fi | 	fi | ||||||
| 	# cleaning up env variables | 	# cleaning up env variables | ||||||
| 	unset "${!KCCONF_@}" | 	unset "${!KCCONF_@}" | ||||||
| 	exec /usr/sbin/kopano-server -F | 	exec /usr/sbin/kopano-server --config /tmp/kopano/server.cfg -F | ||||||
| 	;; | 	;; | ||||||
| dagent) | dagent) | ||||||
| 	dockerize \ | 	dockerize \ | ||||||
| @ -141,7 +124,7 @@ dagent) | |||||||
| 		-timeout 360s | 		-timeout 360s | ||||||
| 	# cleaning up env variables | 	# cleaning up env variables | ||||||
| 	unset "${!KCCONF_@}" | 	unset "${!KCCONF_@}" | ||||||
| 	exec /usr/sbin/kopano-dagent -l | 	exec /usr/sbin/kopano-dagent --config /tmp/kopano/dagent.cfg -l | ||||||
| 	;; | 	;; | ||||||
| gateway) | gateway) | ||||||
| 	dockerize \ | 	dockerize \ | ||||||
| @ -149,7 +132,7 @@ gateway) | |||||||
| 		-timeout 360s | 		-timeout 360s | ||||||
| 	# cleaning up env variables | 	# cleaning up env variables | ||||||
| 	unset "${!KCCONF_@}" | 	unset "${!KCCONF_@}" | ||||||
| 	exec /usr/sbin/kopano-gateway -F | 	exec /usr/sbin/kopano-gateway --config /tmp/kopano/gateway.cfg -F | ||||||
| 	;; | 	;; | ||||||
| ical) | ical) | ||||||
| 	dockerize \ | 	dockerize \ | ||||||
| @ -157,13 +140,15 @@ ical) | |||||||
| 		-timeout 360s | 		-timeout 360s | ||||||
| 	# cleaning up env variables | 	# cleaning up env variables | ||||||
| 	unset "${!KCCONF_@}" | 	unset "${!KCCONF_@}" | ||||||
| 	exec /usr/sbin/kopano-ical -F | 	exec /usr/sbin/kopano-ical --config /tmp/kopano/ical.cfg -F | ||||||
| 	;; | 	;; | ||||||
| grapi) | grapi) | ||||||
| 	LC_CTYPE=en_US.UTF-8 | 	LC_CTYPE=en_US.UTF-8 | ||||||
| 	export socket_path=/var/run/kopano/grapi | 	export socket_path=/var/run/kopano/grapi | ||||||
| 	mkdir -p "$socket_path" | 	export pid_file="$socket_path/grapi.pid" | ||||||
|  | 	mkdir -p "$socket_path" /var/lib/kopano-grapi | ||||||
| 	chown -R kapi:kopano "$socket_path" | 	chown -R kapi:kopano "$socket_path" | ||||||
|  | 	chown kapi:kopano /var/lib/kopano-grapi | ||||||
| 	# TODO there could be a case where multiple backends are desired | 	# TODO there could be a case where multiple backends are desired | ||||||
| 	case $GRAPI_BACKEND in | 	case $GRAPI_BACKEND in | ||||||
| 	ldap) | 	ldap) | ||||||
| @ -176,7 +161,7 @@ grapi) | |||||||
| 		fi | 		fi | ||||||
| 		;; | 		;; | ||||||
| 	esac | 	esac | ||||||
| 	sed s/\ *=\ */=/g /etc/kopano/grapi.cfg > /tmp/grapi-env | 	sed s/\ *=\ */=/g /tmp/kopano/grapi.cfg > /tmp/grapi-env | ||||||
| 	# shellcheck disable=SC2046 | 	# shellcheck disable=SC2046 | ||||||
| 	export $(grep -v '^#' /tmp/grapi-env | xargs -d '\n') | 	export $(grep -v '^#' /tmp/grapi-env | xargs -d '\n') | ||||||
| 	# cleaning up env variables | 	# cleaning up env variables | ||||||
| @ -191,6 +176,7 @@ grapi) | |||||||
| 	fi | 	fi | ||||||
| 	;; | 	;; | ||||||
| kapi) | kapi) | ||||||
|  | 	mkdir -p /kopano/data/kapi-kvs | ||||||
| 	if [ "$KCCONF_KAPID_INSECURE" = "yes" ]; then | 	if [ "$KCCONF_KAPID_INSECURE" = "yes" ]; then | ||||||
| 		dockerize \ | 		dockerize \ | ||||||
| 		-skip-tls-verify \ | 		-skip-tls-verify \ | ||||||
| @ -206,7 +192,7 @@ kapi) | |||||||
| 	kapiversion=$(dpkg-query --showformat='${Version}' --show kopano-kapid) | 	kapiversion=$(dpkg-query --showformat='${Version}' --show kopano-kapid) | ||||||
| 	echo "Using Kopano Kapi: $kapiversion" | 	echo "Using Kopano Kapi: $kapiversion" | ||||||
| 	LC_CTYPE=en_US.UTF-8 | 	LC_CTYPE=en_US.UTF-8 | ||||||
| 	sed s/\ *=\ */=/g /etc/kopano/kapid.cfg > /tmp/kapid-env | 	sed s/\ *=\ */=/g /tmp/kopano/kapid.cfg > /tmp/kapid-env | ||||||
| 	# shellcheck disable=SC2046 | 	# shellcheck disable=SC2046 | ||||||
| 	export $(grep -v '^#' /tmp/kapid-env | xargs -d '\n') | 	export $(grep -v '^#' /tmp/kapid-env | xargs -d '\n') | ||||||
| 	kopano-kapid setup | 	kopano-kapid setup | ||||||
| @ -220,7 +206,7 @@ monitor) | |||||||
| 		-timeout 360s | 		-timeout 360s | ||||||
| 	# cleaning up env variables | 	# cleaning up env variables | ||||||
| 	unset "${!KCCONF_@}" | 	unset "${!KCCONF_@}" | ||||||
| 	exec /usr/sbin/kopano-monitor -F | 	exec /usr/sbin/kopano-monitor --config /tmp/kopano/monitor.cfg -F | ||||||
| 	;; | 	;; | ||||||
| search) | search) | ||||||
| 	dockerize \ | 	dockerize \ | ||||||
| @ -233,9 +219,9 @@ search) | |||||||
| 	# with commit 702bb3fccb3 search does not need -F any longer | 	# with commit 702bb3fccb3 search does not need -F any longer | ||||||
| 	searchversion=$(dpkg-query --showformat='${Version}' --show kopano-search) | 	searchversion=$(dpkg-query --showformat='${Version}' --show kopano-search) | ||||||
| 	if dpkg --compare-versions "$searchversion" "gt" "8.7.82.165"; then | 	if dpkg --compare-versions "$searchversion" "gt" "8.7.82.165"; then | ||||||
| 		exec /usr/sbin/kopano-search | 		exec /usr/sbin/kopano-search --config /tmp/kopano/search.cfg | ||||||
| 	else | 	else | ||||||
| 		exec /usr/bin/python3 /usr/sbin/kopano-search -F | 		exec /usr/bin/python3 /usr/sbin/kopano-search --config /tmp/kopano/search.cfg -F | ||||||
| 	fi | 	fi | ||||||
| 	;; | 	;; | ||||||
| spooler) | spooler) | ||||||
| @ -245,7 +231,7 @@ spooler) | |||||||
| 		-timeout 1080s | 		-timeout 1080s | ||||||
| 	# cleaning up env variables | 	# cleaning up env variables | ||||||
| 	unset "${!KCCONF_@}" | 	unset "${!KCCONF_@}" | ||||||
| 	exec /usr/sbin/kopano-spooler -F | 	exec /usr/sbin/kopano-spooler --config /tmp/kopano/spooler.cfg -F | ||||||
| 	;; | 	;; | ||||||
| *) | *) | ||||||
| 	echo "Failed to start: Unknown service name: '$SERVICE_TO_START'" | ts | 	echo "Failed to start: Unknown service name: '$SERVICE_TO_START'" | ts | ||||||
|  | |||||||
| @ -3,6 +3,7 @@ version: "3.5" | |||||||
| services: | services: | ||||||
|   web: |   web: | ||||||
|     image: ${docker_repo:-zokradonh}/kopano_web:${KWEB_VERSION:-latest} |     image: ${docker_repo:-zokradonh}/kopano_web:${KWEB_VERSION:-latest} | ||||||
|  |     read_only: true | ||||||
|     restart: unless-stopped |     restart: unless-stopped | ||||||
|     environment: |     environment: | ||||||
|       - DEFAULTREDIRECT=${DEFAULTREDIRECT:-/webapp} |       - DEFAULTREDIRECT=${DEFAULTREDIRECT:-/webapp} | ||||||
| @ -123,6 +124,7 @@ services: | |||||||
| 
 | 
 | ||||||
|   kopano_ssl: |   kopano_ssl: | ||||||
|     image: ${docker_repo:-zokradonh}/kopano_ssl:${SSL_VERSION:-latest} |     image: ${docker_repo:-zokradonh}/kopano_ssl:${SSL_VERSION:-latest} | ||||||
|  |     read_only: true | ||||||
|     environment: |     environment: | ||||||
|       - FQDN=${FQDN} |       - FQDN=${FQDN} | ||||||
|       - PKI_COUNTRY=NL |       - PKI_COUNTRY=NL | ||||||
| @ -130,9 +132,12 @@ services: | |||||||
|       - kopano_ssl.env |       - kopano_ssl.env | ||||||
|     volumes: |     volumes: | ||||||
|       - kopanossl/:/kopano/ssl |       - kopanossl/:/kopano/ssl | ||||||
|  |     tmpfs: | ||||||
|  |       - /kopano/easypki/ | ||||||
| 
 | 
 | ||||||
|   kopano_kustomer: |   kopano_kustomer: | ||||||
|     image: kopano/kustomerd:${KUSTOMER_VERSION:-latest} |     image: kopano/kustomerd:${KUSTOMER_VERSION:-latest} | ||||||
|  |     read_only: true | ||||||
|     restart: unless-stopped |     restart: unless-stopped | ||||||
|     command: serve --log-level debug |     command: serve --log-level debug | ||||||
|     volumes: |     volumes: | ||||||
| @ -143,6 +148,7 @@ services: | |||||||
| 
 | 
 | ||||||
|   kopano_server: |   kopano_server: | ||||||
|     image: ${docker_repo:-zokradonh}/kopano_core:${CORE_VERSION:-latest} |     image: ${docker_repo:-zokradonh}/kopano_core:${CORE_VERSION:-latest} | ||||||
|  |     read_only: true # in case additional packages need to be installed this option should be set to false | ||||||
|     restart: unless-stopped |     restart: unless-stopped | ||||||
|     hostname: kopano_server |     hostname: kopano_server | ||||||
|     container_name: ${COMPOSE_PROJECT_NAME}_server |     container_name: ${COMPOSE_PROJECT_NAME}_server | ||||||
| @ -154,6 +160,7 @@ services: | |||||||
|     environment: |     environment: | ||||||
|       - ADDITIONAL_KOPANO_PACKAGES=${ADDITIONAL_KOPANO_PACKAGES} |       - ADDITIONAL_KOPANO_PACKAGES=${ADDITIONAL_KOPANO_PACKAGES} | ||||||
|       - KCCOMMENT_LDAP_1=${KCCOMMENT_LDAP_1} |       - KCCOMMENT_LDAP_1=${KCCOMMENT_LDAP_1} | ||||||
|  |       # Hint: if additional locales are required that should be added in base/Dockerfile | ||||||
|       - KCCONF_ADMIN_DEFAULT_STORE_LOCALE=${MAILBOXLANG:-en_US.UTF-8} |       - KCCONF_ADMIN_DEFAULT_STORE_LOCALE=${MAILBOXLANG:-en_US.UTF-8} | ||||||
|       - KCCONF_LDAP_LDAP_BIND_PASSWD=${LDAP_BIND_PW} |       - KCCONF_LDAP_LDAP_BIND_PASSWD=${LDAP_BIND_PW} | ||||||
|       - KCCONF_LDAP_LDAP_BIND_USER=${LDAP_BIND_DN} |       - KCCONF_LDAP_LDAP_BIND_USER=${LDAP_BIND_DN} | ||||||
| @ -189,9 +196,12 @@ services: | |||||||
|       - kopanodata/:/kopano/data |       - kopanodata/:/kopano/data | ||||||
|       - kopanosocket/:/run/kopano |       - kopanosocket/:/run/kopano | ||||||
|       - kopanossl/:/kopano/ssl |       - kopanossl/:/kopano/ssl | ||||||
|  |     tmpfs: | ||||||
|  |       - /tmp/ | ||||||
| 
 | 
 | ||||||
|   kopano_webapp: |   kopano_webapp: | ||||||
|     image: ${docker_repo:-zokradonh}/kopano_webapp:${WEBAPP_VERSION:-latest} |     image: ${docker_repo:-zokradonh}/kopano_webapp:${WEBAPP_VERSION:-latest} | ||||||
|  |     read_only: true # in case additional packages need to be installed this option should be set to false | ||||||
|     restart: unless-stopped |     restart: unless-stopped | ||||||
|     hostname: kopano_webapp |     hostname: kopano_webapp | ||||||
|     depends_on: |     depends_on: | ||||||
| @ -212,9 +222,15 @@ services: | |||||||
|     networks: |     networks: | ||||||
|       - kopano-net |       - kopano-net | ||||||
|       - web-net |       - web-net | ||||||
|  |     tmpfs: | ||||||
|  |       - /tmp/ | ||||||
|  |       - /run/sessions/ | ||||||
|  |       - /run/php/ | ||||||
|  |       - /var/log/ | ||||||
| 
 | 
 | ||||||
|   kopano_zpush: |   kopano_zpush: | ||||||
|     image: ${docker_repo:-zokradonh}/kopano_zpush:${ZPUSH_VERSION:-latest} |     image: ${docker_repo:-zokradonh}/kopano_zpush:${ZPUSH_VERSION:-latest} | ||||||
|  |     read_only: true | ||||||
|     restart: unless-stopped |     restart: unless-stopped | ||||||
|     hostname: kopano_zpush |     hostname: kopano_zpush | ||||||
|     container_name: ${COMPOSE_PROJECT_NAME}_zpush |     container_name: ${COMPOSE_PROJECT_NAME}_zpush | ||||||
| @ -236,9 +252,15 @@ services: | |||||||
|     networks: |     networks: | ||||||
|       - kopano-net |       - kopano-net | ||||||
|       - web-net |       - web-net | ||||||
|  |     tmpfs: | ||||||
|  |       - /run/apache2/ | ||||||
|  |       - /run/sessions/ | ||||||
|  |       - /tmp | ||||||
|  |       - /var/log/z-push/ | ||||||
| 
 | 
 | ||||||
|   kopano_grapi: |   kopano_grapi: | ||||||
|     image: ${docker_repo:-zokradonh}/kopano_core:${CORE_VERSION:-latest} |     image: ${docker_repo:-zokradonh}/kopano_core:${CORE_VERSION:-latest} | ||||||
|  |     read_only: true | ||||||
|     restart: unless-stopped |     restart: unless-stopped | ||||||
|     container_name: ${COMPOSE_PROJECT_NAME}_grapi |     container_name: ${COMPOSE_PROJECT_NAME}_grapi | ||||||
|     depends_on: |     depends_on: | ||||||
| @ -251,6 +273,7 @@ services: | |||||||
|     environment: |     environment: | ||||||
|       - KCCONF_GRAPI_ENABLE_EXPERIMENTAL_ENDPOINTS=no |       - KCCONF_GRAPI_ENABLE_EXPERIMENTAL_ENDPOINTS=no | ||||||
|       - KCCONF_GRAPI_INSECURE=${INSECURE} |       - KCCONF_GRAPI_INSECURE=${INSECURE} | ||||||
|  |       - KCCONF_GRAPI_PERSISTENCY_PATH=/var/lib/kopano-grapi | ||||||
|       - SERVICE_TO_START=grapi |       - SERVICE_TO_START=grapi | ||||||
|       - TZ=${TZ} |       - TZ=${TZ} | ||||||
|     env_file: |     env_file: | ||||||
| @ -258,9 +281,12 @@ services: | |||||||
|     networks: |     networks: | ||||||
|       - kopano-net |       - kopano-net | ||||||
|       - web-net |       - web-net | ||||||
|  |     tmpfs: | ||||||
|  |       - /tmp/ | ||||||
| 
 | 
 | ||||||
|   kopano_kapi: |   kopano_kapi: | ||||||
|     image: ${docker_repo:-zokradonh}/kopano_core:${CORE_VERSION:-latest} |     image: ${docker_repo:-zokradonh}/kopano_core:${CORE_VERSION:-latest} | ||||||
|  |     read_only: true | ||||||
|     restart: unless-stopped |     restart: unless-stopped | ||||||
|     container_name: ${COMPOSE_PROJECT_NAME}_kapi |     container_name: ${COMPOSE_PROJECT_NAME}_kapi | ||||||
|     depends_on: |     depends_on: | ||||||
| @ -282,9 +308,12 @@ services: | |||||||
|     networks: |     networks: | ||||||
|       - kopano-net |       - kopano-net | ||||||
|       - web-net |       - web-net | ||||||
|  |     tmpfs: | ||||||
|  |       - /tmp | ||||||
| 
 | 
 | ||||||
|   kopano_kdav: |   kopano_kdav: | ||||||
|     image: ${docker_repo:-zokradonh}/kopano_kdav:${KDAV_VERSION:-latest} |     image: ${docker_repo:-zokradonh}/kopano_kdav:${KDAV_VERSION:-latest} | ||||||
|  |     read_only: true | ||||||
|     restart: unless-stopped |     restart: unless-stopped | ||||||
|     hostname: kopano_kdav |     hostname: kopano_kdav | ||||||
|     container_name: ${COMPOSE_PROJECT_NAME}_kdav |     container_name: ${COMPOSE_PROJECT_NAME}_kdav | ||||||
| @ -301,9 +330,15 @@ services: | |||||||
|     networks: |     networks: | ||||||
|       - kopano-net |       - kopano-net | ||||||
|       - web-net |       - web-net | ||||||
|  |     tmpfs: | ||||||
|  |       - /run/apache2/ | ||||||
|  |       - /run/sessions/ | ||||||
|  |       - /tmp | ||||||
|  |       - /var/log/kdav/ | ||||||
| 
 | 
 | ||||||
|   kopano_dagent: |   kopano_dagent: | ||||||
|     image: ${docker_repo:-zokradonh}/kopano_core:${CORE_VERSION:-latest} |     image: ${docker_repo:-zokradonh}/kopano_core:${CORE_VERSION:-latest} | ||||||
|  |     read_only: true | ||||||
|     restart: unless-stopped |     restart: unless-stopped | ||||||
|     depends_on: |     depends_on: | ||||||
|       - kopano_server |       - kopano_server | ||||||
| @ -321,9 +356,12 @@ services: | |||||||
|       - kopano_dagent.env |       - kopano_dagent.env | ||||||
|     networks: |     networks: | ||||||
|       - kopano-net |       - kopano-net | ||||||
|  |     tmpfs: | ||||||
|  |       - /tmp | ||||||
| 
 | 
 | ||||||
|   kopano_spooler: |   kopano_spooler: | ||||||
|     image: ${docker_repo:-zokradonh}/kopano_core:${CORE_VERSION:-latest} |     image: ${docker_repo:-zokradonh}/kopano_core:${CORE_VERSION:-latest} | ||||||
|  |     read_only: true | ||||||
|     restart: unless-stopped |     restart: unless-stopped | ||||||
|     hostname: spooler |     hostname: spooler | ||||||
|     domainname: ${LDAP_DOMAIN} |     domainname: ${LDAP_DOMAIN} | ||||||
| @ -345,9 +383,12 @@ services: | |||||||
|       - kopano_spooler.env |       - kopano_spooler.env | ||||||
|     networks: |     networks: | ||||||
|       - kopano-net |       - kopano-net | ||||||
|  |     tmpfs: | ||||||
|  |       - /tmp | ||||||
| 
 | 
 | ||||||
|   kopano_gateway: |   kopano_gateway: | ||||||
|     image: ${docker_repo:-zokradonh}/kopano_core:${CORE_VERSION:-latest} |     image: ${docker_repo:-zokradonh}/kopano_core:${CORE_VERSION:-latest} | ||||||
|  |     read_only: true | ||||||
|     restart: unless-stopped |     restart: unless-stopped | ||||||
|     depends_on: |     depends_on: | ||||||
|       - kopano_server |       - kopano_server | ||||||
| @ -365,9 +406,12 @@ services: | |||||||
|       - kopano_gateway.env |       - kopano_gateway.env | ||||||
|     networks: |     networks: | ||||||
|       - kopano-net |       - kopano-net | ||||||
|  |     tmpfs: | ||||||
|  |       - /tmp | ||||||
| 
 | 
 | ||||||
|   kopano_ical: |   kopano_ical: | ||||||
|     image: ${docker_repo:-zokradonh}/kopano_core:${CORE_VERSION:-latest} |     image: ${docker_repo:-zokradonh}/kopano_core:${CORE_VERSION:-latest} | ||||||
|  |     read_only: true | ||||||
|     restart: unless-stopped |     restart: unless-stopped | ||||||
|     depends_on: |     depends_on: | ||||||
|       - kopano_server |       - kopano_server | ||||||
| @ -385,9 +429,12 @@ services: | |||||||
|     networks: |     networks: | ||||||
|       - kopano-net |       - kopano-net | ||||||
|       - web-net |       - web-net | ||||||
|  |     tmpfs: | ||||||
|  |       - /tmp | ||||||
| 
 | 
 | ||||||
|   kopano_monitor: |   kopano_monitor: | ||||||
|     image: ${docker_repo:-zokradonh}/kopano_core:${CORE_VERSION:-latest} |     image: ${docker_repo:-zokradonh}/kopano_core:${CORE_VERSION:-latest} | ||||||
|  |     read_only: true | ||||||
|     restart: unless-stopped |     restart: unless-stopped | ||||||
|     depends_on: |     depends_on: | ||||||
|       - kopano_server |       - kopano_server | ||||||
| @ -403,9 +450,12 @@ services: | |||||||
|       - kopano_monitor.env |       - kopano_monitor.env | ||||||
|     networks: |     networks: | ||||||
|       - kopano-net |       - kopano-net | ||||||
|  |     tmpfs: | ||||||
|  |       - /tmp | ||||||
| 
 | 
 | ||||||
|   kopano_search: |   kopano_search: | ||||||
|     image: ${docker_repo:-zokradonh}/kopano_core:${CORE_VERSION:-latest} |     image: ${docker_repo:-zokradonh}/kopano_core:${CORE_VERSION:-latest} | ||||||
|  |     read_only: true | ||||||
|     restart: unless-stopped |     restart: unless-stopped | ||||||
|     container_name: ${COMPOSE_PROJECT_NAME}_search |     container_name: ${COMPOSE_PROJECT_NAME}_search | ||||||
|     depends_on: |     depends_on: | ||||||
| @ -423,14 +473,17 @@ services: | |||||||
|       - kopano_search.env |       - kopano_search.env | ||||||
|     networks: |     networks: | ||||||
|       - kopano-net |       - kopano-net | ||||||
|  |     tmpfs: | ||||||
|  |       - /tmp | ||||||
| 
 | 
 | ||||||
|   kopano_konnect: |   kopano_konnect: | ||||||
|     image: ${docker_repo:-zokradonh}/kopano_konnect:${KONNECT_VERSION:-latest} |     image: ${docker_repo:-zokradonh}/kopano_konnect:${KONNECT_VERSION:-latest} | ||||||
|  |     read_only: true | ||||||
|     restart: unless-stopped |     restart: unless-stopped | ||||||
|     depends_on: |     depends_on: | ||||||
|       - kopano_ssl |       - kopano_ssl | ||||||
|       - web |       - web | ||||||
|       # to be useful Konnect also need a running kopano_server, but this dependency cannot be added here since this would be a circular dependency |       # to be useful Konnect also needs a running kopano_server, but this dependency cannot be added here since this would be a circular dependency | ||||||
|     volumes: |     volumes: | ||||||
|       - /etc/machine-id:/etc/machine-id |       - /etc/machine-id:/etc/machine-id | ||||||
|       - /var/lib/dbus/machine-id:/var/lib/dbus/machine-id |       - /var/lib/dbus/machine-id:/var/lib/dbus/machine-id | ||||||
| @ -452,9 +505,12 @@ services: | |||||||
|     networks: |     networks: | ||||||
|       - kopano-net |       - kopano-net | ||||||
|       - web-net |       - web-net | ||||||
|  |     tmpfs: | ||||||
|  |       - /tmp | ||||||
| 
 | 
 | ||||||
|   kopano_kwmserver: |   kopano_kwmserver: | ||||||
|     image: ${docker_repo:-zokradonh}/kopano_kwmserver:${KWM_VERSION:-latest} |     image: ${docker_repo:-zokradonh}/kopano_kwmserver:${KWM_VERSION:-latest} | ||||||
|  |     read_only: true | ||||||
|     restart: unless-stopped |     restart: unless-stopped | ||||||
|     command: wrapper.sh |     command: wrapper.sh | ||||||
|     depends_on: |     depends_on: | ||||||
| @ -473,9 +529,12 @@ services: | |||||||
|       - kopanossl/:/kopano/ssl |       - kopanossl/:/kopano/ssl | ||||||
|     networks: |     networks: | ||||||
|       - web-net |       - web-net | ||||||
|  |     tmpfs: | ||||||
|  |       - /tmp | ||||||
| 
 | 
 | ||||||
|   kopano_meet: |   kopano_meet: | ||||||
|     image: ${docker_repo:-zokradonh}/kopano_meet:${MEET_VERSION:-latest} |     image: ${docker_repo:-zokradonh}/kopano_meet:${MEET_VERSION:-latest} | ||||||
|  |     read_only: true | ||||||
|     restart: unless-stopped |     restart: unless-stopped | ||||||
|     environment: |     environment: | ||||||
|       - KCCONF_MEET_disableFullGAB=false |       - KCCONF_MEET_disableFullGAB=false | ||||||
| @ -493,9 +552,12 @@ services: | |||||||
|       - /var/lib/dbus/machine-id:/var/lib/dbus/machine-id |       - /var/lib/dbus/machine-id:/var/lib/dbus/machine-id | ||||||
|     networks: |     networks: | ||||||
|       - web-net |       - web-net | ||||||
|  |     tmpfs: | ||||||
|  |       - /tmp | ||||||
| 
 | 
 | ||||||
|   kopano_scheduler: |   kopano_scheduler: | ||||||
|     image: ${docker_repo:-zokradonh}/kopano_scheduler:${SCHEDULER_VERSION:-latest} |     image: ${docker_repo:-zokradonh}/kopano_scheduler:${SCHEDULER_VERSION:-latest} | ||||||
|  |     read_only: true | ||||||
|     restart: "no" |     restart: "no" | ||||||
|     container_name: ${COMPOSE_PROJECT_NAME}_scheduler |     container_name: ${COMPOSE_PROJECT_NAME}_scheduler | ||||||
|     networks: |     networks: | ||||||
| @ -515,6 +577,8 @@ services: | |||||||
|       - kopano_scheduler.env |       - kopano_scheduler.env | ||||||
|     volumes: |     volumes: | ||||||
|       - /var/run/docker.sock:/var/run/docker.sock:ro |       - /var/run/docker.sock:/var/run/docker.sock:ro | ||||||
|  |     tmpfs: | ||||||
|  |       - /tmp | ||||||
| 
 | 
 | ||||||
| volumes: | volumes: | ||||||
|   kdavstates: |   kdavstates: | ||||||
|  | |||||||
| @ -81,6 +81,11 @@ RUN \ | |||||||
| 
 | 
 | ||||||
| COPY --from=builder /usr/share/kdav /usr/share/kdav | COPY --from=builder /usr/share/kdav /usr/share/kdav | ||||||
| 
 | 
 | ||||||
|  | # tweaks to make the container read-only | ||||||
|  | RUN \ | ||||||
|  |     mv /usr/share/kdav/config.php /usr/share/kdav/config.php.dist && \ | ||||||
|  |     ln -s /tmp/config.php /usr/share/kdav/config.php | ||||||
|  | 
 | ||||||
| EXPOSE 80/tcp | EXPOSE 80/tcp | ||||||
| 
 | 
 | ||||||
| COPY start.sh /kopano/start.sh | COPY start.sh /kopano/start.sh | ||||||
|  | |||||||
| @ -8,6 +8,7 @@ ADDITIONAL_KOPANO_PACKAGES=${ADDITIONAL_KOPANO_PACKAGES:-""} | |||||||
| set -eu # unset variables are errors & non-zero return values exit the whole script | set -eu # unset variables are errors & non-zero return values exit the whole script | ||||||
| [ "$DEBUG" ] && set -x | [ "$DEBUG" ] && set -x | ||||||
| 
 | 
 | ||||||
|  | # TODO this is not compatible with a read-only container | ||||||
| ADDITIONAL_KOPANO_PACKAGES=$(echo "$ADDITIONAL_KOPANO_PACKAGES" | tr -d '"') | ADDITIONAL_KOPANO_PACKAGES=$(echo "$ADDITIONAL_KOPANO_PACKAGES" | tr -d '"') | ||||||
| [ -n "${ADDITIONAL_KOPANO_PACKAGES// }" ] && apt update | [ -n "${ADDITIONAL_KOPANO_PACKAGES// }" ] && apt update | ||||||
| [ -n "${ADDITIONAL_KOPANO_PACKAGES// }" ] && for installpkg in $ADDITIONAL_KOPANO_PACKAGES; do | [ -n "${ADDITIONAL_KOPANO_PACKAGES// }" ] && for installpkg in $ADDITIONAL_KOPANO_PACKAGES; do | ||||||
| @ -20,16 +21,20 @@ done | |||||||
| echo "Ensure directories" | echo "Ensure directories" | ||||||
| mkdir -p /run/sessions | mkdir -p /run/sessions | ||||||
| 
 | 
 | ||||||
|  | CONFIG_PHP=/tmp/config.php | ||||||
|  | # copy latest config template. This should be the mount point for preexisting config files. | ||||||
|  | cp /usr/share/kdav/config.php.dist $CONFIG_PHP | ||||||
|  | 
 | ||||||
| if [ "$KCCONF_SERVERHOSTNAME" == "127.0.0.1" ]; then | if [ "$KCCONF_SERVERHOSTNAME" == "127.0.0.1" ]; then | ||||||
| 	echo "kDAV is using the default: connection" | 	echo "kDAV is using the default: connection" | ||||||
| else | else | ||||||
| 	echo "kDAV is using an ip connection" | 	echo "kDAV is using an ip connection" | ||||||
| 	sed -e "s#define([\"']MAPI_SERVER[\"'],\s*[\"']default:[\"'])#define('MAPI_SERVER', 'https://${KCCONF_SERVERHOSTNAME}:${KCCONF_SERVERPORT}/kopano')#" \ | 	sed -e "s#define([\"']MAPI_SERVER[\"'],\s*[\"']default:[\"'])#define('MAPI_SERVER', 'https://${KCCONF_SERVERHOSTNAME}:${KCCONF_SERVERPORT}/kopano')#" \ | ||||||
| 		-i /usr/share/kdav/config.php | 		-i $CONFIG_PHP | ||||||
| fi | fi | ||||||
| 
 | 
 | ||||||
| # change root uri to /kdav | # change root uri to /kdav | ||||||
| sed -e "s#define('DAV_ROOT_URI', '/');#define('DAV_ROOT_URI', '/kdav/');#" -i /usr/share/kdav/config.php | sed -e "s#define('DAV_ROOT_URI', '/');#define('DAV_ROOT_URI', '/kdav/');#" -i $CONFIG_PHP | ||||||
| 
 | 
 | ||||||
| echo "Ensure config ownership" | echo "Ensure config ownership" | ||||||
| chown -R www-data:www-data /run/sessions | chown -R www-data:www-data /run/sessions | ||||||
| @ -40,10 +45,8 @@ dockerize \ | |||||||
| 	-wait file:///var/lib/dbus/machine-id | 	-wait file:///var/lib/dbus/machine-id | ||||||
| 
 | 
 | ||||||
| touch /var/log/kdav/kdav.log | touch /var/log/kdav/kdav.log | ||||||
| touch /var/log/kdav/kdav-error.log | chown www-data:www-data /var/log/kdav/kdav.log | ||||||
| chown www-data:www-data /var/log/kdav/kdav.log /var/log/kdav/kdav-error.log |  | ||||||
| tail --pid=$$ -F --lines=0 -q /var/log/kdav/kdav.log & | tail --pid=$$ -F --lines=0 -q /var/log/kdav/kdav.log & | ||||||
| tail --pid=$$ -F --lines=0 -q /var/log/kdav/kdav-error.log & |  | ||||||
| 
 | 
 | ||||||
| echo "Starting Apache" | echo "Starting Apache" | ||||||
| rm -f /run/apache2/apache2.pid | rm -f /run/apache2/apache2.pid | ||||||
|  | |||||||
| @ -78,7 +78,8 @@ if [ "${allow_client_guests:-}" = "yes" ]; then | |||||||
| 
 | 
 | ||||||
| 	echo "Patching identifier registration for use of the Meet guest mode" | 	echo "Patching identifier registration for use of the Meet guest mode" | ||||||
| 	/usr/local/bin/konnectd utils jwk-from-pem --use sig "$eckey" > /tmp/jwk-meet.json | 	/usr/local/bin/konnectd utils jwk-from-pem --use sig "$eckey" > /tmp/jwk-meet.json | ||||||
| 	CONFIG_JSON=/etc/kopano/konnectd-identifier-registration.yaml | 	cp /etc/kopano/konnectd-identifier-registration.yaml /tmp/konnectd-identifier-registration.yaml | ||||||
|  | 	CONFIG_JSON=/tmp/konnectd-identifier-registration.yaml | ||||||
| 	#yq -y ".clients += [{\"id\": \"grapi-explorer.js\", \"name\": \"Grapi Explorer\", \"application_type\": \"web\", \"trusted\": true, \"insecure\": true, \"redirect_uris\": [\"http://$FQDNCLEANED:3000/\"]}]" $CONFIG_JSON | sponge $CONFIG_JSON | 	#yq -y ".clients += [{\"id\": \"grapi-explorer.js\", \"name\": \"Grapi Explorer\", \"application_type\": \"web\", \"trusted\": true, \"insecure\": true, \"redirect_uris\": [\"http://$FQDNCLEANED:3000/\"]}]" $CONFIG_JSON | sponge $CONFIG_JSON | ||||||
| 	yq -y ".clients += [{\"id\": \"kpop-https://${FQDN%/*}/meet/\", \"name\": \"Kopano Meet\", \"application_type\": \"web\", \"trusted\": true, \"redirect_uris\": [\"https://${FQDN%/*}/meet/\"], \"trusted_scopes\": [\"konnect/guestok\", \"kopano/kwm\"], \"jwks\": {\"keys\": [{\"kty\": $(jq .kty /tmp/jwk-meet.json), \"use\": $(jq .use /tmp/jwk-meet.json), \"crv\": $(jq .crv /tmp/jwk-meet.json), \"d\": $(jq .d /tmp/jwk-meet.json), \"kid\": $(jq .kid /tmp/jwk-meet.json), \"x\": $(jq .x /tmp/jwk-meet.json), \"y\": $(jq .y /tmp/jwk-meet.json)}]},\"request_object_signing_alg\": \"ES256\"}]" $CONFIG_JSON | sponge $CONFIG_JSON | 	yq -y ".clients += [{\"id\": \"kpop-https://${FQDN%/*}/meet/\", \"name\": \"Kopano Meet\", \"application_type\": \"web\", \"trusted\": true, \"redirect_uris\": [\"https://${FQDN%/*}/meet/\"], \"trusted_scopes\": [\"konnect/guestok\", \"kopano/kwm\"], \"jwks\": {\"keys\": [{\"kty\": $(jq .kty /tmp/jwk-meet.json), \"use\": $(jq .use /tmp/jwk-meet.json), \"crv\": $(jq .crv /tmp/jwk-meet.json), \"d\": $(jq .d /tmp/jwk-meet.json), \"kid\": $(jq .kid /tmp/jwk-meet.json), \"x\": $(jq .x /tmp/jwk-meet.json), \"y\": $(jq .y /tmp/jwk-meet.json)}]},\"request_object_signing_alg\": \"ES256\"}]" $CONFIG_JSON | sponge $CONFIG_JSON | ||||||
| 	# TODO this last bit can likely go (but then we must default to a registry stored below /etc/kopano) | 	# TODO this last bit can likely go (but then we must default to a registry stored below /etc/kopano) | ||||||
|  | |||||||
| @ -49,8 +49,10 @@ RUN \ | |||||||
|         kopano-meet kopano-meet-webapp \ |         kopano-meet kopano-meet-webapp \ | ||||||
|         ${ADDITIONAL_KOPANO_PACKAGES} \ |         ${ADDITIONAL_KOPANO_PACKAGES} \ | ||||||
|         && \ |         && \ | ||||||
|     cp /usr/share/doc/kopano-meet-webapp/config.json.in /usr/share/kopano-kweb/www/config/kopano/meet.json && \ |     rm -rf /var/cache/apt /var/lib/apt/lists && \ | ||||||
|     rm -rf /var/cache/apt /var/lib/apt/lists |     # make configuration a symlink to prevent overwriting it | ||||||
|  |     # TODO better would be to override its configuration in kweb.cfg | ||||||
|  |     ln -s /tmp/meet.json /usr/share/kopano-kweb/www/config/kopano/meet.json | ||||||
| 
 | 
 | ||||||
| COPY defaultconfigs/ start-service.sh /kopano/ | COPY defaultconfigs/ start-service.sh /kopano/ | ||||||
| COPY goss.yaml /goss/ | COPY goss.yaml /goss/ | ||||||
|  | |||||||
| @ -2,4 +2,4 @@ import os | |||||||
| import kcconf | import kcconf | ||||||
| 
 | 
 | ||||||
| # Override configs from environment variables | # Override configs from environment variables | ||||||
| kcconf.configkopano(kcconf.parseenvironmentvariables(r"/etc/kopano/")) | kcconf.configkopano(kcconf.parseenvironmentvariables(r"/tmp/kopano/")) | ||||||
|  | |||||||
| @ -5,11 +5,16 @@ ADDITIONAL_KOPANO_PACKAGES=${ADDITIONAL_KOPANO_PACKAGES:-""} | |||||||
| set -eu # unset variables are errors & non-zero return values exit the whole script | set -eu # unset variables are errors & non-zero return values exit the whole script | ||||||
| [ "$DEBUG" ] && set -x | [ "$DEBUG" ] && set -x | ||||||
| 
 | 
 | ||||||
|  | # copy configuration files to /tmp/kopano to prevent modification of mounted config files | ||||||
|  | mkdir -p /tmp/kopano | ||||||
|  | cp /etc/kopano/*.cfg /tmp/kopano | ||||||
|  | 
 | ||||||
| if [ ! -e /kopano/"$SERVICE_TO_START".py ]; then | if [ ! -e /kopano/"$SERVICE_TO_START".py ]; then | ||||||
| 	echo "Invalid service specified: $SERVICE_TO_START" | ts | 	echo "Invalid service specified: $SERVICE_TO_START" | ts | ||||||
| 	exit 1 | 	exit 1 | ||||||
| fi | fi | ||||||
| 
 | 
 | ||||||
|  | # TODO how to best move this to /tmp?  | ||||||
| echo "Configure service '$SERVICE_TO_START'" | ts | echo "Configure service '$SERVICE_TO_START'" | ts | ||||||
| /usr/bin/python3 /kopano/"$SERVICE_TO_START".py | /usr/bin/python3 /kopano/"$SERVICE_TO_START".py | ||||||
| 
 | 
 | ||||||
| @ -22,7 +27,8 @@ if [ $# -gt 0 ]; then | |||||||
| 	exit | 	exit | ||||||
| fi | fi | ||||||
| 
 | 
 | ||||||
| CONFIG_JSON="/usr/share/kopano-kweb/www/config/kopano/meet.json" | cp /usr/share/doc/kopano-meet-webapp/config.json.in /tmp/meet.json | ||||||
|  | CONFIG_JSON="/tmp/meet.json" | ||||||
| echo "Updating $CONFIG_JSON" | echo "Updating $CONFIG_JSON" | ||||||
| for setting in $(compgen -A variable KCCONF_MEET); do | for setting in $(compgen -A variable KCCONF_MEET); do | ||||||
| 	setting2=${setting#KCCONF_MEET_} | 	setting2=${setting#KCCONF_MEET_} | ||||||
| @ -54,11 +60,12 @@ if [ "${GRID_WEBAPP:-yes}" = "yes" ]; then | |||||||
| 	jq '.apps.enabled += ["kopano-webapp"]' $CONFIG_JSON | sponge $CONFIG_JSON | 	jq '.apps.enabled += ["kopano-webapp"]' $CONFIG_JSON | sponge $CONFIG_JSON | ||||||
| fi | fi | ||||||
| 
 | 
 | ||||||
| sed -i s/\ *=\ */=/g /etc/kopano/kwebd.cfg | # todo do not replace here, but in a temp location | ||||||
|  | sed s/\ *=\ */=/g /tmp/kopano/kwebd.cfg > /tmp/kweb-env | ||||||
| # always disable tls | # always disable tls | ||||||
| export tls=no | export tls=no | ||||||
| # shellcheck disable=SC2046 | # shellcheck disable=SC2046 | ||||||
| export $(grep -v '^#' /etc/kopano/kwebd.cfg | xargs -d '\n') | export $(grep -v '^#' /tmp/kweb-env | xargs -d '\n') | ||||||
| 
 | 
 | ||||||
| # services need to be aware of the machine-id | # services need to be aware of the machine-id | ||||||
| dockerize \ | dockerize \ | ||||||
|  | |||||||
| @ -1,5 +1,5 @@ | |||||||
| tests: | tests: | ||||||
|   check mailbox language: # this needs a running kopano-server can can therefore not be executed in that container directly |   check mailbox language: # this needs a running kopano-server and can can therefore not be executed in that container directly | ||||||
|     command: "docker exec kopano_server kopano-storeadm -C -n user10; docker exec kopano_server show-folders.py --user user10" |     command: "docker exec kopano_server kopano-storeadm -C -n user10; docker exec kopano_server show-folders.py --user user10" | ||||||
|     exit-code: 0 |     exit-code: 0 | ||||||
|     stdout: |     stdout: | ||||||
| @ -12,13 +12,24 @@ tests: | |||||||
|     stdout: |     stdout: | ||||||
|       not-contains: |       not-contains: | ||||||
|         - "WARNING: Unable to get user store entry id. User possibly has no store." |         - "WARNING: Unable to get user store entry id. User possibly has no store." | ||||||
|   check mailbox language german: # this needs a running kopano-server can can therefore not be executed in that container directly |   check mailbox language german: # this needs a running kopano-server and can can therefore not be executed in that container directly | ||||||
|     command: "docker exec kopano_server kopano-storeadm -D user 11; docker exec kopano_server kopano-storeadm -C -l de_DE -n user11; docker exec kopano_server show-folders.py --user user11" |     command: "docker exec kopano_server kopano-storeadm -D -n user11; docker exec kopano_server kopano-storeadm -C -l de_DE -n user11; docker exec kopano_server show-folders.py --user user11" | ||||||
|     exit-code: 0 |     exit-code: 0 | ||||||
|     stdout: |     stdout: | ||||||
|       not-contains: |       not-contains: | ||||||
|         - "Inbox" |         - "Inbox" | ||||||
|         - "Drafts" |         - "Drafts" | ||||||
|  |       contains: | ||||||
|  |         - "Posteingang" | ||||||
|  |   check mailbox language dutch: # this needs a running kopano-server and can can therefore not be executed in that container directly | ||||||
|  |     command: "docker exec kopano_server kopano-storeadm -D -n user12; docker exec kopano_server kopano-storeadm -C -l nl_NL -n user12; docker exec kopano_server show-folders.py --user user12" | ||||||
|  |     exit-code: 0 | ||||||
|  |     stdout: | ||||||
|  |       not-contains: | ||||||
|  |         - "Inbox" | ||||||
|  |         - "Drafts" | ||||||
|  |       contains: | ||||||
|  |         - "Postvak IN" | ||||||
| #  test renaming of folders: | #  test renaming of folders: | ||||||
| #    command: docker exec kopano_server env KCCONF_ADMIN_DEFAULT_STORE_LOCALE=de_DE.UTF-8 /usr/bin/python3 /kopano/server.py && docker exec kopano_server kopano-storeadm -Y -n user12 | #    command: docker exec kopano_server env KCCONF_ADMIN_DEFAULT_STORE_LOCALE=de_DE.UTF-8 /usr/bin/python3 /kopano/server.py && docker exec kopano_server kopano-storeadm -Y -n user12 | ||||||
| #    exit-code: 0 | #    exit-code: 0 | ||||||
|  | |||||||
| @ -2,7 +2,7 @@ | |||||||
| 
 | 
 | ||||||
| set -eo pipefail | set -eo pipefail | ||||||
| 
 | 
 | ||||||
| cronfile=/etc/crontab | cronfile=/tmp/crontab | ||||||
| 
 | 
 | ||||||
| # purge existing entries from crontab | # purge existing entries from crontab | ||||||
| true > "$cronfile" | true > "$cronfile" | ||||||
| @ -15,7 +15,7 @@ done | |||||||
| 
 | 
 | ||||||
| for cronvar in ${!CRONDELAYED_*}; do | for cronvar in ${!CRONDELAYED_*}; do | ||||||
| 	cronvalue=${!cronvar} | 	cronvalue=${!cronvar} | ||||||
| 	echo "Adding $cronvalue to crontab" | 	echo "Adding $cronvalue to crontab (delayed)" | ||||||
| 	echo "$cronvalue" >> "$cronfile" | 	echo "$cronvalue" >> "$cronfile" | ||||||
| done | done | ||||||
| 
 | 
 | ||||||
| @ -26,7 +26,7 @@ dockerize \ | |||||||
| echo "creating public store" | echo "creating public store" | ||||||
| docker exec kopano_server kopano-storeadm -h default: -P || true | docker exec kopano_server kopano-storeadm -h default: -P || true | ||||||
| 
 | 
 | ||||||
| # run sheduled cron jobs once | echo "Running sheduled cron jobs once" | ||||||
| for cronvar in ${!CRON_*}; do | for cronvar in ${!CRON_*}; do | ||||||
| 	cronvalue=${!cronvar} | 	cronvalue=${!cronvar} | ||||||
| 	croncommand=$(echo "$cronvalue" | cut -d ' ' -f 6-) | 	croncommand=$(echo "$cronvalue" | cut -d ' ' -f 6-) | ||||||
| @ -34,5 +34,5 @@ for cronvar in ${!CRON_*}; do | |||||||
| 	$croncommand | 	$croncommand | ||||||
| done | done | ||||||
| 
 | 
 | ||||||
| supercronic -test /etc/crontab | supercronic -test $cronfile | ||||||
| exec supercronic /etc/crontab | exec supercronic $cronfile | ||||||
|  | |||||||
| @ -64,6 +64,13 @@ RUN \ | |||||||
|         ${ADDITIONAL_KOPANO_WEBAPP_PLUGINS} \ |         ${ADDITIONAL_KOPANO_WEBAPP_PLUGINS} \ | ||||||
|     && rm -rf /var/cache/apt /var/lib/apt/lists |     && rm -rf /var/cache/apt /var/lib/apt/lists | ||||||
| 
 | 
 | ||||||
|  | # tweak to make the container read-only | ||||||
|  | RUN mkdir -p /tmp/webapp/ && \ | ||||||
|  |     for i in /etc/kopano/webapp/* /etc/kopano/webapp/.[^.]*; do \ | ||||||
|  |         mv "$i" "$i.dist"; \ | ||||||
|  |         ln -s /tmp/webapp/"$(basename "$i")" "$i"; \ | ||||||
|  |     done | ||||||
|  | 
 | ||||||
| COPY start.sh /kopano/start.sh | COPY start.sh /kopano/start.sh | ||||||
| COPY goss* /goss/ | COPY goss* /goss/ | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -12,8 +12,9 @@ set -eu # unset variables are errors & non-zero return values exit the whole scr | |||||||
| # shellcheck source=php/start-helper.sh | # shellcheck source=php/start-helper.sh | ||||||
| source /kopano/start-helper.sh | source /kopano/start-helper.sh | ||||||
| 
 | 
 | ||||||
|  | # Hint: this is not compatible with a read-only container. | ||||||
|  | # The general recommendation is to already build a container that has all required packages installed. | ||||||
| ADDITIONAL_KOPANO_PACKAGES="$ADDITIONAL_KOPANO_PACKAGES $ADDITIONAL_KOPANO_WEBAPP_PLUGINS" | ADDITIONAL_KOPANO_PACKAGES="$ADDITIONAL_KOPANO_PACKAGES $ADDITIONAL_KOPANO_WEBAPP_PLUGINS" | ||||||
| 
 |  | ||||||
| ADDITIONAL_KOPANO_PACKAGES=$(echo "$ADDITIONAL_KOPANO_PACKAGES" | tr -d '"') | ADDITIONAL_KOPANO_PACKAGES=$(echo "$ADDITIONAL_KOPANO_PACKAGES" | tr -d '"') | ||||||
| [ -n "${ADDITIONAL_KOPANO_PACKAGES// }" ] && apt update | [ -n "${ADDITIONAL_KOPANO_PACKAGES// }" ] && apt update | ||||||
| [ -n "${ADDITIONAL_KOPANO_PACKAGES// }" ] && for installpkg in $ADDITIONAL_KOPANO_PACKAGES; do | [ -n "${ADDITIONAL_KOPANO_PACKAGES// }" ] && for installpkg in $ADDITIONAL_KOPANO_PACKAGES; do | ||||||
| @ -25,6 +26,13 @@ ADDITIONAL_KOPANO_PACKAGES=$(echo "$ADDITIONAL_KOPANO_PACKAGES" | tr -d '"') | |||||||
| 	fi | 	fi | ||||||
| done | done | ||||||
| 
 | 
 | ||||||
|  | # copy latest config template | ||||||
|  | mkdir -p /tmp/webapp/ | ||||||
|  | for i in /etc/kopano/webapp/*.dist /etc/kopano/webapp/.[^.]*.dist; do | ||||||
|  | 	filename=$(basename -- "$i") | ||||||
|  | 	cp "$i" "/tmp/webapp/${filename%.*}" | ||||||
|  | done | ||||||
|  | 
 | ||||||
| # Ensure directories exist | # Ensure directories exist | ||||||
| mkdir -p /run/sessions /tmp/webapp | mkdir -p /run/sessions /tmp/webapp | ||||||
| 
 | 
 | ||||||
| @ -37,13 +45,13 @@ if [ "$KCCONF_SERVERHOSTNAME" == "127.0.0.1" ]; then | |||||||
| 	echo "Kopano WebApp is using the default: connection" | 	echo "Kopano WebApp is using the default: connection" | ||||||
| else | else | ||||||
| 	echo "Kopano WebApp is using an ip connection" | 	echo "Kopano WebApp is using an ip connection" | ||||||
| 	php_cfg_gen /etc/kopano/webapp/config.php DEFAULT_SERVER "https://${KCCONF_SERVERHOSTNAME}:${KCCONF_SERVERPORT}/kopano" | 	php_cfg_gen /tmp/webapp/config.php DEFAULT_SERVER "https://${KCCONF_SERVERHOSTNAME}:${KCCONF_SERVERPORT}/kopano" | ||||||
| fi | fi | ||||||
| 
 | 
 | ||||||
| # configuring webapp from env | # configuring webapp from env | ||||||
| for setting in $(compgen -A variable KCCONF_WEBAPP_); do | for setting in $(compgen -A variable KCCONF_WEBAPP_); do | ||||||
| 	setting2=${setting#KCCONF_WEBAPP_} | 	setting2=${setting#KCCONF_WEBAPP_} | ||||||
| 	php_cfg_gen /etc/kopano/webapp/config.php "${setting2}" "${!setting}" | 	php_cfg_gen /tmp/webapp/config.php "${setting2}" "${!setting}" | ||||||
| done | done | ||||||
| 
 | 
 | ||||||
| # configuring webapp plugins from env | # configuring webapp plugins from env | ||||||
| @ -52,7 +60,7 @@ for setting in $(compgen -A variable KCCONF_WEBAPPPLUGIN_); do | |||||||
| 	filename="${setting2%%_*}" | 	filename="${setting2%%_*}" | ||||||
| 	setting3=${setting#KCCONF_WEBAPPPLUGIN_${filename}_} | 	setting3=${setting#KCCONF_WEBAPPPLUGIN_${filename}_} | ||||||
| 	identifier="${filename,,}" | 	identifier="${filename,,}" | ||||||
| 	php_cfg_gen /etc/kopano/webapp/config-"$identifier".php "${setting3}" "${!setting}" | 	php_cfg_gen /tmp/webapp/config-"$identifier".php "${setting3}" "${!setting}" | ||||||
| done | done | ||||||
| 
 | 
 | ||||||
| echo "Ensure config ownership" | echo "Ensure config ownership" | ||||||
|  | |||||||
| @ -61,6 +61,13 @@ RUN \ | |||||||
|         ${ADDITIONAL_KOPANO_PACKAGES} \ |         ${ADDITIONAL_KOPANO_PACKAGES} \ | ||||||
|     && rm -rf /var/cache/apt /var/lib/apt/lists |     && rm -rf /var/cache/apt /var/lib/apt/lists | ||||||
| 
 | 
 | ||||||
|  | # tweak to make the container read-only | ||||||
|  | RUN mkdir -p /tmp/z-push/ && \ | ||||||
|  |     for i in /etc/z-push/*; do \ | ||||||
|  |         mv "$i" "$i.dist"; \ | ||||||
|  |         ln -s /tmp/z-push/"$(basename "$i")" "$i"; \ | ||||||
|  |     done | ||||||
|  | 
 | ||||||
| COPY apache2-kopano.conf /etc/apache2/sites-available/kopano.conf | COPY apache2-kopano.conf /etc/apache2/sites-available/kopano.conf | ||||||
| 
 | 
 | ||||||
| # configure basics | # configure basics | ||||||
|  | |||||||
| @ -39,6 +39,8 @@ php_cfg_gen() { | |||||||
| 	fi | 	fi | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | # Hint: this is not compatible with a read-only container. | ||||||
|  | # The general recommendation is to already build a container that has all required packages installed. | ||||||
| ADDITIONAL_KOPANO_PACKAGES=$(echo "$ADDITIONAL_KOPANO_PACKAGES" | tr -d '"') | ADDITIONAL_KOPANO_PACKAGES=$(echo "$ADDITIONAL_KOPANO_PACKAGES" | tr -d '"') | ||||||
| [ -n "${ADDITIONAL_KOPANO_PACKAGES// }" ] && apt update | [ -n "${ADDITIONAL_KOPANO_PACKAGES// }" ] && apt update | ||||||
| [ -n "${ADDITIONAL_KOPANO_PACKAGES// }" ] && for installpkg in $ADDITIONAL_KOPANO_PACKAGES; do | [ -n "${ADDITIONAL_KOPANO_PACKAGES// }" ] && for installpkg in $ADDITIONAL_KOPANO_PACKAGES; do | ||||||
| @ -50,6 +52,13 @@ ADDITIONAL_KOPANO_PACKAGES=$(echo "$ADDITIONAL_KOPANO_PACKAGES" | tr -d '"') | |||||||
| 	fi | 	fi | ||||||
| done | done | ||||||
| 
 | 
 | ||||||
|  | # copy latest config template | ||||||
|  | mkdir -p /tmp/z-push/ | ||||||
|  | for i in /etc/z-push/*.dist; do | ||||||
|  | 	filename=$(basename -- "$i") | ||||||
|  | 	cp "$i" "/tmp/z-push/${filename%.*}" | ||||||
|  | done | ||||||
|  | 
 | ||||||
| # Ensure directories | # Ensure directories | ||||||
| mkdir -p /run/sessions | mkdir -p /run/sessions | ||||||
| 
 | 
 | ||||||
| @ -62,58 +71,58 @@ if [ "$KCCONF_SERVERHOSTNAME" == "127.0.0.1" ]; then | |||||||
| 	echo "Z-Push is using the default: connection" | 	echo "Z-Push is using the default: connection" | ||||||
| else | else | ||||||
| 	echo "Z-Push is using an ip connection" | 	echo "Z-Push is using an ip connection" | ||||||
| 	php_cfg_gen /etc/z-push/kopano.conf.php MAPI_SERVER "https://${KCCONF_SERVERHOSTNAME}:${KCCONF_SERVERPORT}/kopano" | 	php_cfg_gen /tmp/z-push/kopano.conf.php MAPI_SERVER "https://${KCCONF_SERVERHOSTNAME}:${KCCONF_SERVERPORT}/kopano" | ||||||
| fi | fi | ||||||
| 
 | 
 | ||||||
| echo "Configuring Z-Push for use behind a reverse proxy" | echo "Configuring Z-Push for use behind a reverse proxy" | ||||||
| php_cfg_gen /etc/z-push/z-push.conf.php USE_CUSTOM_REMOTE_IP_HEADER HTTP_X_FORWARDED_FOR | php_cfg_gen /tmp/z-push/z-push.conf.php USE_CUSTOM_REMOTE_IP_HEADER HTTP_X_FORWARDED_FOR | ||||||
| 
 | 
 | ||||||
| # configuring z-push from env | # configuring z-push from env | ||||||
| for setting in $(compgen -A variable KCCONF_ZPUSH_); do | for setting in $(compgen -A variable KCCONF_ZPUSH_); do | ||||||
| 	setting2=${setting#KCCONF_ZPUSH_} | 	setting2=${setting#KCCONF_ZPUSH_} | ||||||
| 	php_cfg_gen /etc/z-push/z-push.conf.php "${setting2}" "${!setting}" | 	php_cfg_gen /tmp/z-push/z-push.conf.php "${setting2}" "${!setting}" | ||||||
| done | done | ||||||
| 
 | 
 | ||||||
| # configuring autodiscover | # configuring autodiscover | ||||||
| for setting in $(compgen -A variable KCCONF_ZPUSHAUTODISCOVER_); do | for setting in $(compgen -A variable KCCONF_ZPUSHAUTODISCOVER_); do | ||||||
| 	setting2=${setting#KCCONF_ZPUSHAUTODISCOVER_} | 	setting2=${setting#KCCONF_ZPUSHAUTODISCOVER_} | ||||||
| 	php_cfg_gen /etc/z-push/autodiscover.conf.php "${setting2}" "${!setting}" | 	php_cfg_gen /tmp/z-push/autodiscover.conf.php "${setting2}" "${!setting}" | ||||||
| done | done | ||||||
| 
 | 
 | ||||||
| # configuring z-push gabsync | # configuring z-push gabsync | ||||||
| php_cfg_gen /etc/z-push/gabsync.conf.php USERNAME SYSTEM | php_cfg_gen /tmp/z-push/gabsync.conf.php USERNAME SYSTEM | ||||||
| 
 | 
 | ||||||
| for setting in $(compgen -A variable KCCONF_ZPUSHGABSYNC_); do | for setting in $(compgen -A variable KCCONF_ZPUSHGABSYNC_); do | ||||||
| 	setting2=${setting#KCCONF_ZPUSHGAVSYNC_} | 	setting2=${setting#KCCONF_ZPUSHGAVSYNC_} | ||||||
| 	php_cfg_gen /etc/z-push/z-push.conf.php "${setting2}" "${!setting}" | 	php_cfg_gen /tmp/z-push/z-push.conf.php "${setting2}" "${!setting}" | ||||||
| done | done | ||||||
| 
 | 
 | ||||||
| # configuring z-push sql state engine | # configuring z-push sql state engine | ||||||
| for setting in $(compgen -A variable KCCONF_ZPUSHSQL_); do | for setting in $(compgen -A variable KCCONF_ZPUSHSQL_); do | ||||||
| 	setting2=${setting#KCCONF_ZPUSHSQL_} | 	setting2=${setting#KCCONF_ZPUSHSQL_} | ||||||
| 	php_cfg_gen /etc/z-push/state-sql.conf.php "${setting2}" "${!setting}" | 	php_cfg_gen /tmp/z-push/state-sql.conf.php "${setting2}" "${!setting}" | ||||||
| done | done | ||||||
| 
 | 
 | ||||||
| # configuring z-push memcached | # configuring z-push memcached | ||||||
| for setting in $(compgen -A variable KCCONF_ZPUSHMEMCACHED_); do | for setting in $(compgen -A variable KCCONF_ZPUSHMEMCACHED_); do | ||||||
| 	setting2=${setting#KCCONF_ZPUSHMEMCACHED_} | 	setting2=${setting#KCCONF_ZPUSHMEMCACHED_} | ||||||
| 	php_cfg_gen /etc/z-push/memcached.conf.php "${setting2}" "${!setting}" | 	php_cfg_gen /tmp/z-push/memcached.conf.php "${setting2}" "${!setting}" | ||||||
| done | done | ||||||
| 
 | 
 | ||||||
| # configuring z-push gab2contacts | # configuring z-push gab2contacts | ||||||
| for setting in $(compgen -A variable KCCONF_ZPUSHGA2CONTACTS_); do | for setting in $(compgen -A variable KCCONF_ZPUSHGA2CONTACTS_); do | ||||||
| 	setting2=${setting#KCCONF_ZPUSHSQL_} | 	setting2=${setting#KCCONF_ZPUSHSQL_} | ||||||
| 	php_cfg_gen /etc/z-push/gab2contacts.conf.php "${setting2}" "${!setting}" | 	php_cfg_gen /tmp/z-push/gab2contacts.conf.php "${setting2}" "${!setting}" | ||||||
| done | done | ||||||
| 
 | 
 | ||||||
| # configuring z-push shared folders | # configuring z-push shared folders | ||||||
| perl -i -0pe 's/\$additionalFolders.*\);//s' /etc/z-push/z-push.conf.php | perl -i -0pe 's/\$additionalFolders.*\);//s' /tmp/z-push/z-push.conf.php | ||||||
| echo -e "  \$additionalFolders = array(" >> /etc/z-push/z-push.conf.php | echo -e "  \$additionalFolders = array(" >> /tmp/z-push/z-push.conf.php | ||||||
| echo "$ZPUSH_ADDITIONAL_FOLDERS" | jq -c '.[]' | while read -r folder; do | echo "$ZPUSH_ADDITIONAL_FOLDERS" | jq -c '.[]' | while read -r folder; do | ||||||
| 	eval "$(echo "$folder" | jq -r '@sh "NAME=\(.name) ID=\(.id) TYPE=\(.type) FLAGS=\(.flags)"')" | 	eval "$(echo "$folder" | jq -r '@sh "NAME=\(.name) ID=\(.id) TYPE=\(.type) FLAGS=\(.flags)"')" | ||||||
| 	echo -e "    array('store' => \"SYSTEM\", 'folderid' => \"$ID\", 'name' => \"$NAME\", 'type' => $TYPE, 'flags' => $FLAGS)," >> /etc/z-push/z-push.conf.php | 	echo -e "    array('store' => \"SYSTEM\", 'folderid' => \"$ID\", 'name' => \"$NAME\", 'type' => $TYPE, 'flags' => $FLAGS)," >> /etc/z-push/z-push.conf.php | ||||||
| done | done | ||||||
| echo -e '  );' >> /etc/z-push/z-push.conf.php | echo -e '  );' >> /tmp/z-push/z-push.conf.php | ||||||
| 
 | 
 | ||||||
| echo "Ensure config ownership" | echo "Ensure config ownership" | ||||||
| chown -R www-data:www-data /run/sessions | chown -R www-data:www-data /run/sessions | ||||||
| @ -124,6 +133,7 @@ dockerize \ | |||||||
| 	-wait file:///var/lib/dbus/machine-id | 	-wait file:///var/lib/dbus/machine-id | ||||||
| 
 | 
 | ||||||
| echo "Activate z-push log rerouting" | echo "Activate z-push log rerouting" | ||||||
|  | mkdir -p /var/log/z-push/ | ||||||
| touch /var/log/z-push/{z-push.log,z-push-error.log,autodiscover.log,autodiscover-error.log} | touch /var/log/z-push/{z-push.log,z-push-error.log,autodiscover.log,autodiscover-error.log} | ||||||
| chown -R www-data:www-data /var/log/z-push | chown -R www-data:www-data /var/log/z-push | ||||||
| tail --pid=$$ -F --lines=0 -q /var/log/z-push/z-push.log & | tail --pid=$$ -F --lines=0 -q /var/log/z-push/z-push.log & | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user