Page Menu
Home
Phorge
Search
Configure Global Search
Log In
Files
F117652098
D3845.1774870030.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Flag For Later
Award Token
Authored By
Unknown
Size
96 KB
Referenced Files
None
Subscribers
None
D3845.1774870030.diff
View Options
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -1,32 +1,41 @@
-## Quickstart Instructions
-
-Really quick?
-
-```
-$ bin/quickstart.sh
-```
-
-More detailed:
-
-```
-$ bin/regen-certs
-$ docker pull kolab/centos7:latest
-$ docker-compose down
-$ docker-compose up -d
-$ cd src/
-$ composer install
-$ npm install
-$ cp .env.example .env
-$ echo "" >> .env
-$ cat .env.local >> .env
-$ ./artisan key:generate
-$ ./artisan jwt:secret -f
-$ ./artisan clear-compiled
-$ npm run dev
-$ rm -rf database/database.sqlite
-$ touch database/database.sqlite
-$ ./artisan migrate:refresh --seed
-$ ./artisan serve
-```
-
-NOTE: Set `APP_PUBLIC_URL` and `MOLLIE_KEY` and other such private settings in `.env.local`
+## Quickstart Instructions to try it out
+
+* Make sure you have docker and docker-compose available.
+* Run 'make deploy' in the base directory.
+* Add an /etc/hosts entry "127.0.0.1 kolab.local"
+* navigate to https://kolab.local
+* login as "john@kolab.org" with password "simple123"
+
+# Setup env.local
+
+To customize the installation, create a file src/env.local to override setting in src/.env.example.
+
+The setup script with merge these settings into src/.env, which is what is ultimately used by the installation.
+
+Take a look at ansible/env.local for an example of typical modifications required for an installation.
+
+# Use the ansible setup
+
+The ansible/ directory contains setup scripts to setup a fresh Fedora system with a kolab deployment.
+Modify the Makefile with the required variables and then execute `make setup`.
+
+This will configure the remote system and execute bin/deploy.sh
+
+### Update
+
+* git pull
+* Run "bin/update.sh"
+
+### Backup / Restore
+
+The "bin/backup.sh" script will stop all containers, snapshot the volumes to the backup/ directory, and restart the containers.
+
+"bin/restore.sh" will stop all containers, restore the volumes from tarballs in the backup/ directory, and restart the containers.
+
+
+### Requirements
+* docker
+* openssl
+
+## TODO
+* Only seed admin user, but not all the development stuff?
diff --git a/ansible/env.local b/ansible/env.local
--- a/ansible/env.local
+++ b/ansible/env.local
@@ -1,4 +1,3 @@
-MFA_DSN=mysql://root:Welcome2KolabSystems@127.0.0.1/roundcube
APP_DOMAIN={{ host }}
APP_WEBSITE_DOMAIN={{ host }}
APP_KEY=base64:FG6ECzyAMSmyX+eYwO/FW3bwnarbKkBhqtO65vlMb1E=
@@ -9,10 +8,14 @@
MEET_WEBRTC_LISTEN_IP='{{ public_ip }}'
MEET_PUBLIC_DOMAIN={{ host }}
MEET_SERVER_URLS=https://{{ host }}/meetmedia/api/
-WEBMAIL_URL=/roundcubemail
APP_URL=https://{{ host }}
ASSET_URL=https://{{ host }}
+DB_HOST=mariadb
+REDIS_HOST=redis
+IMAP_URI=ssl://kolab:11993
+LDAP_HOSTS=kolab
+
MOLLIE_KEY=
STRIPE_KEY=
STRIPE_PUBLIC_KEY=
@@ -30,23 +33,11 @@
PASSPORT_COMPANIONAPP_OAUTH_CLIENT_ID=9566e018-f05d-425c-9915-420cdb9258bb
PASSPORT_COMPANIONAPP_OAUTH_CLIENT_SECRET=XjgV6SU9shO0QFKaU6pQPRC5rJpyRezDJTSoGLgz
-APP_TENANT_ID=42
APP_PASSPHRASE=simple123
-MAIL_DRIVER=log
-
KOLAB_SSL_CERTIFICATE=/etc/letsencrypt/live/{{ host }}/cert.pem
KOLAB_SSL_CERTIFICATE_FULLCHAIN=/etc/letsencrypt/live/{{ host }}/fullchain.pem
KOLAB_SSL_CERTIFICATE_KEY=/etc/letsencrypt/live/{{ host }}/privkey.pem
PROXY_SSL_CERTIFICATE=/etc/letsencrypt/live/{{ host }}/fullchain.pem
PROXY_SSL_CERTIFICATE_KEY=/etc/letsencrypt/live/{{ host }}/privkey.pem
-
-NGINX_SSL_CERTIFICATE=/etc/letsencrypt/live/{{ host }}/fullchain.pem
-NGINX_SSL_CERTIFICATE_KEY=/etc/letsencrypt/live/{{ host }}/privkey.pem
-
-PGP_ENABLE=true
-PGP_BINARY=/usr/bin/gpg
-PGP_AGENT=/usr/bin/gpg-agent
-PGP_GPGCONF=/usr/bin/gpgconf
-
diff --git a/bin/backup.sh b/bin/backup.sh
new file mode 100755
--- /dev/null
+++ b/bin/backup.sh
@@ -0,0 +1,25 @@
+#!/bin/bash
+mkdir -p backup
+
+backup_path="$(pwd)/backup/"
+
+function backup_volume {
+ volume_name=$1
+ backup_destination=$2
+
+ echo "Backing up $volume_name to $backup_destination"
+ docker run --rm -v $volume_name:/data -v $backup_destination:/backup quay.io/centos/centos:stream8 tar -zcvf /backup/$volume_name.tar /data
+}
+
+echo "Stopping containers"
+docker-compose stop
+
+echo "Backing up volumes"
+volumes=($(docker volume ls -f name=kolab | awk '{if (NR > 1) print $2}'))
+for v in "${volumes[@]}"
+do
+ backup_volume $v $backup_path
+done
+
+echo "Restarting containers"
+docker-compose start
diff --git a/bin/quickstart.sh b/bin/quickstart.sh
--- a/bin/quickstart.sh
+++ b/bin/quickstart.sh
@@ -27,16 +27,30 @@
export DOCKER_BUILDKIT=0
+COMPOSE_ARGS=
+if [ "$1" != "--nodev" ]; then
+ COMPOSE_ARGS="-f docker-compose.yml -f docker-compose.local.yml"
+fi
docker-compose down --remove-orphans
-src/artisan octane:stop >/dev/null 2>&1 || :
-src/artisan horizon:terminate >/dev/null 2>&1 || :
-
-docker-compose build coturn kolab mariadb meet pdns proxy redis haproxy
+docker volume rm kolab_mariadb || :
+docker volume rm kolab_imap || :
+docker volume rm kolab_ldap || :
+
+if [ "$1" != "--nodev" ]; then
+ src/artisan octane:stop >/dev/null 2>&1 || :
+ src/artisan horizon:terminate >/dev/null 2>&1 || :
+else
+ # If we switch from an existing development setup to a compose deployment,
+ # we don't have a nice way to terminate octane/horizon.
+ # We can't use the artisan command because it will just block if redis is,
+ # no longer available, so we just kill all artisan processes running.
+ pkill -9 -f artisan || :
+fi
bin/regen-certs
-
-docker-compose up -d coturn kolab mariadb meet pdns proxy redis haproxy
+docker-compose build coturn kolab mariadb meet pdns proxy redis haproxy
+docker-compose ${COMPOSE_ARGS} up -d coturn kolab mariadb meet pdns redis
# Workaround until we have docker-compose --wait (https://github.com/docker/compose/pull/8777)
function wait_for_container {
@@ -60,15 +74,11 @@
done;
}
-# Ensure the containers we depend on are fully started
-wait_for_container 'kolab'
-wait_for_container 'kolab-redis'
-
if [ "$1" == "--nodev" ]; then
echo "starting everything in containers"
- docker-compose build swoole
+ docker-compose -f docker-compose.build.yml build swoole
docker-compose build webapp
- docker-compose up -d webapp proxy
+ docker-compose up -d webapp proxy haproxy
wait_for_container 'kolab-webapp'
exit 0
fi
@@ -97,6 +107,10 @@
test ! -z "$(php --modules | grep swoole)" || \
die "Is swoole installed?"
+# Ensure the containers we depend on are fully started
+wait_for_container 'kolab'
+wait_for_container 'kolab-redis'
+
pushd ${base_dir}/src/
rm -rf vendor/ composer.lock
@@ -137,4 +151,7 @@
./artisan data:import || :
nohup ./artisan octane:start --host=$(grep OCTANE_HTTP_HOST .env | tail -n1 | sed "s/OCTANE_HTTP_HOST=//") > octane.out &
nohup ./artisan horizon > horizon.out &
+
popd
+
+docker-compose ${COMPOSE_ARGS} up --no-deps -d proxy haproxy
diff --git a/bin/restore.sh b/bin/restore.sh
new file mode 100755
--- /dev/null
+++ b/bin/restore.sh
@@ -0,0 +1,29 @@
+#!/bin/bash
+backup_path="$(pwd)/backup/"
+
+function restore_volume {
+ volume_name=$1
+ backup_destination=$2
+
+ echo "Restoring $volume_name from $backup_destination"
+ docker run --rm -v $volume_name:/data -v $backup_destination:/backup quay.io/centos/centos:stream8 bash -c "rm -rf /data/* && tar xvf /backup/$volume_name.tar -C /data --strip 1"
+}
+
+echo "Stopping containers"
+docker-compose stop
+
+# We currently expect the volumes to exist.
+# We could alternatively create volumes form existing tar files
+# for f in backup/*.tar; do
+# echo "$(basename $f .tar)" ;
+# done
+
+echo "Restoring volumes"
+volumes=($(docker volume ls -f name=kolab | awk '{if (NR > 1) print $2}'))
+for v in "${volumes[@]}"
+do
+ restore_volume $v $backup_path
+done
+echo "Restarting containers"
+docker-compose start
+
diff --git a/bin/update.sh b/bin/update.sh
new file mode 100755
--- /dev/null
+++ b/bin/update.sh
@@ -0,0 +1,5 @@
+#!/bin/bash
+docker-compose down --remove-orphans
+docker-compose build coturn kolab mariadb meet pdns proxy redis haproxy webapp
+bin/regen-certs
+docker-compose up -d coturn kolab mariadb meet pdns proxy redis haproxy webapp
diff --git a/ci/Makefile b/ci/Makefile
--- a/ci/Makefile
+++ b/ci/Makefile
@@ -17,13 +17,13 @@
cd .. && bin/quickstart.sh --nodev
build:
- cd .. && DOCKER_BUILDKIT=0 docker compose build swoole && DOCKER_BUILDKIT=0 docker compose build tests && cd ci
+ cd .. && DOCKER_BUILDKIT=0 docker compose -f docker-compose.yml -f docker-compose.build.yml build swoole && DOCKER_BUILDKIT=0 docker compose -f docker-compose.yml -f docker-compose.build.yml build tests && cd ci
lint:
docker run -v ${PWD}/../:/src/kolab.orig -t kolab-tests /lint.sh
test:
- docker run --network=host -v ${PWD}/../src:/src/kolabsrc.orig -t kolab-tests /init.sh
+ docker run --network=kolab_kolab -v ${PWD}/../src:/src/kolabsrc.orig -t kolab-tests /init.sh
all: configure setup build lint test
diff --git a/ci/env.local b/ci/env.local
--- a/ci/env.local
+++ b/ci/env.local
@@ -1,4 +1,4 @@
-MFA_DSN=mysql://root:Welcome2KolabSystems@127.0.0.1/roundcube
+MFA_DSN=mysql://root:Welcome2KolabSystems@mariadb/roundcube
APP_DOMAIN={{ host }}
APP_WEBSITE_DOMAIN={{ host }}
APP_KEY=base64:FG6ECzyAMSmyX+eYwO/FW3bwnarbKkBhqtO65vlMb1E=
@@ -9,10 +9,16 @@
MEET_WEBRTC_LISTEN_IP='{{ public_ip }}'
MEET_PUBLIC_DOMAIN={{ host }}
MEET_SERVER_URLS=https://{{ host }}/meetmedia/api/
+MEET_LISTENING_HOST=172.18.0.1
WEBMAIL_URL=/roundcubemail
APP_URL=https://{{ host }}
ASSET_URL=https://{{ host }}
+DB_HOST=mariadb
+REDIS_HOST=redis
+IMAP_URI=ssl://kolab:11993
+LDAP_HOSTS=kolab
+
MOLLIE_KEY=
STRIPE_KEY=
STRIPE_PUBLIC_KEY=
@@ -39,8 +45,5 @@
KOLAB_SSL_CERTIFICATE_FULLCHAIN=/etc/pki/tls/certs/kolab.hosted.com.chain.pem
KOLAB_SSL_CERTIFICATE_KEY=/etc/pki/tls/certs/kolab.hosted.com.key
-PROXY_SSL_CERTIFICATE=/etc/pki/tls/certs/imap.hosted.com.cert
-PROXY_SSL_CERTIFICATE_KEY=/etc/pki/tls/certs/imap.hosted.com.key
-
-NGINX_SSL_CERTIFICATE=/etc/pki/tls/certs/imap.hosted.com.cert
-NGINX_SSL_CERTIFICATE_KEY=/etc/pki/tls/certs/imap.hosted.com.key
+PROXY_SSL_CERTIFICATE=/etc/certs/imap.hosted.com.cert
+PROXY_SSL_CERTIFICATE_KEY=/etc/certs/imap.hosted.com.key
diff --git a/docker-compose.build.yml b/docker-compose.build.yml
new file mode 100644
--- /dev/null
+++ b/docker-compose.build.yml
@@ -0,0 +1,12 @@
+version: '3'
+services:
+ swoole:
+ build:
+ context: ./docker/swoole/
+ container_name: kolab-swoole
+ image: apheleia/swoole:4.8.x
+ tests:
+ build:
+ context: ./docker/tests/
+ container_name: kolab-tests
+ image: kolab-tests
diff --git a/docker-compose.local.yml b/docker-compose.local.yml
new file mode 100644
--- /dev/null
+++ b/docker-compose.local.yml
@@ -0,0 +1,21 @@
+version: '3'
+services:
+ kolab:
+ ports:
+ - "389:389"
+ - "8880:8880"
+ - "8443:8443"
+ - "10143:10143"
+ - "10587:10587"
+ - "11143:11143"
+ - "11993:11993"
+ - "12143:12143"
+ mariadb:
+ ports:
+ - "3306:3306"
+ redis:
+ ports:
+ - "6379:6379"
+ proxy:
+ extra_hosts:
+ - "webapp:127.0.0.1"
diff --git a/docker-compose.yml b/docker-compose.yml
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -26,10 +26,15 @@
depends_on:
mariadb:
condition: service_healthy
+ pdns:
+ condition: service_healthy
extra_hosts:
- "kolab.mgmt.com:127.0.0.1"
environment:
- - DB_HOST=${DB_HOST}
+ - LDAP_HOST=127.0.0.1
+ - LDAP_ADMIN_BIND_DN="cn=Directory Manager"
+ - LDAP_ADMIN_BIND_PW=Welcome2KolabSystems
+ - DB_HOST=mariadb
- DB_ROOT_PASSWORD=Welcome2KolabSystems
- DB_HKCCP_DATABASE=${DB_DATABASE}
- DB_HKCCP_USERNAME=${DB_USERNAME}
@@ -48,12 +53,20 @@
- MAIL_PORT=10587
healthcheck:
interval: 10s
- test: test -f /tmp/kolab-init.done
+ test: "systemctl is-active kolab-init || exit 1"
timeout: 5s
retries: 30
+ start_period: 5m
+ # This makes docker's dns, resolve via pdns for this container.
+ # Please note it does not affect /etc/resolv.conf
+ dns: 172.18.0.11
hostname: kolab.mgmt.com
image: kolab
- network_mode: host
+ networks:
+ kolab:
+ ipv4_address: 172.18.0.5
+ ports:
+ - "12143:12143"
tmpfs:
- /run
- /tmp
@@ -65,24 +78,36 @@
- /etc/letsencrypt/:/etc/letsencrypt/:ro
- ./docker/certs/ca.cert:/etc/pki/tls/certs/ca.cert:ro
- ./docker/certs/ca.cert:/etc/pki/ca-trust/source/anchors/ca.cert:ro
- - ./docker/certs/kolab.hosted.com.cert:/etc/pki/tls/certs/kolab.hosted.com.cert
- - ./docker/certs/kolab.hosted.com.chain.pem:/etc/pki/tls/certs/kolab.hosted.com.chain.pem
- - ./docker/certs/kolab.hosted.com.key:/etc/pki/tls/certs/kolab.hosted.com.key
+ - ./docker/certs/kolab.hosted.com.cert:${KOLAB_SSL_CERTIFICATE:?err}
+ - ./docker/certs/kolab.hosted.com.chain.pem:${KOLAB_SSL_CERTIFICATE_FULLCHAIN:?err}
+ - ./docker/certs/kolab.hosted.com.key:${KOLAB_SSL_CERTIFICATE_KEY:?err}
- ./docker/kolab/utils:/root/utils:ro
- /sys/fs/cgroup:/sys/fs/cgroup:ro
+ - imap:/imapdata
+ - ldap:/ldapdata
mariadb:
container_name: kolab-mariadb
environment:
- MYSQL_ROOT_PASSWORD: Welcome2KolabSystems
- TZ: "+02:00"
+ - MARIADB_ROOT_PASSWORD=Welcome2KolabSystems
+ - TZ="+02:00"
+ - DB_HKCCP_DATABASE=${DB_DATABASE}
+ - DB_HKCCP_USERNAME=${DB_USERNAME}
+ - DB_HKCCP_PASSWORD=${DB_PASSWORD}
healthcheck:
interval: 10s
test: test -e /var/run/mysqld/mysqld.sock
timeout: 5s
retries: 30
- image: mariadb
- network_mode: host
+ image: mariadb:latest
+ networks:
+ - kolab
+ volumes:
+ - ./docker/mariadb/mysql-init/:/docker-entrypoint-initdb.d/
+ - mariadb:/var/lib/mysql
haproxy:
+ depends_on:
+ proxy:
+ condition: service_healthy
build:
context: ./docker/haproxy/
healthcheck:
@@ -93,7 +118,8 @@
container_name: kolab-haproxy
hostname: haproxy.hosted.com
image: kolab-haproxy
- network_mode: host
+ networks:
+ - kolab
tmpfs:
- /run
- /tmp
@@ -107,6 +133,7 @@
build:
context: ./docker/pdns/
container_name: kolab-pdns
+ hostname: pdns
depends_on:
mariadb:
condition: service_healthy
@@ -115,9 +142,10 @@
test: "systemctl status pdns || exit 1"
timeout: 5s
retries: 30
- hostname: pdns
- image: apheleia/kolab-pdns
- network_mode: host
+ image: kolab-pdns
+ networks:
+ kolab:
+ ipv4_address: 172.18.0.11
tmpfs:
- /run
- /tmp
@@ -127,6 +155,11 @@
volumes:
- /sys/fs/cgroup:/sys/fs/cgroup:ro
proxy:
+ depends_on:
+ kolab:
+ condition: service_healthy
+ webapp:
+ condition: service_healthy
build:
context: ./docker/proxy/
args:
@@ -139,9 +172,13 @@
timeout: 5s
retries: 30
container_name: kolab-proxy
- hostname: ${APP_WEBSITE_DOMAIN:?err}
+ hostname: proxy
image: kolab-proxy
- network_mode: host
+ extra_hosts:
+ - "meet:${MEET_LISTENING_HOST}"
+ networks:
+ kolab:
+ ipv4_address: 172.18.0.7
tmpfs:
- /run
- /tmp
@@ -151,6 +188,13 @@
volumes:
- ./docker/certs/:/etc/certs/:ro
- /etc/letsencrypt/:/etc/letsencrypt/:ro
+ ports:
+ # - "80:80"
+ - "443:443"
+ - "465:465"
+ - "587:587"
+ - "143:143"
+ - "993:993"
redis:
build:
context: ./docker/redis/
@@ -162,14 +206,12 @@
container_name: kolab-redis
hostname: redis
image: redis
- network_mode: host
+ networks:
+ - kolab
volumes:
- ./docker/redis/redis.conf:/usr/local/etc/redis/redis.conf:ro
- swoole:
- build:
- context: ./docker/swoole/
- container_name: kolab-swoole
- image: apheleia/swoole:4.8.x
+ # ports:
+ # - "6379:6379"
webapp:
build:
context: ./docker/webapp/
@@ -180,35 +222,31 @@
test: "/src/kolabsrc/artisan octane:status || exit 1"
timeout: 5s
retries: 30
+ start_period: 5m
depends_on:
kolab:
condition: service_healthy
- network_mode: host
- volumes:
- - ./src:/src/kolabsrc.orig:ro
- tests:
- build:
- context: ./docker/tests/
- container_name: kolab-tests
- image: kolab-tests
- depends_on:
- kolab:
+ redis:
condition: service_healthy
- network_mode: host
+ networks:
+ - kolab
volumes:
- ./src:/src/kolabsrc.orig:ro
+ ports:
+ - "8000:8000"
meet:
build:
context: ./docker/meet/
healthcheck:
interval: 10s
- test: "curl --insecure -H 'X-AUTH-TOKEN: ${MEET_SERVER_TOKEN}' --fail https://localhost:12443/meetmedia/api/health || exit 1"
+ test: "curl --insecure -H 'X-AUTH-TOKEN: ${MEET_SERVER_TOKEN}' --fail https://${MEET_LISTENING_HOST}:12443/meetmedia/api/health || exit 1"
timeout: 5s
retries: 30
+ start_period: 5m
environment:
- WEBRTC_LISTEN_IP=${MEET_WEBRTC_LISTEN_IP:?err}
- PUBLIC_DOMAIN=${MEET_PUBLIC_DOMAIN:?err}
- - LISTENING_HOST=0.0.0.0
+ - LISTENING_HOST=${MEET_LISTENING_HOST:?err}
- LISTENING_PORT=12443
- TURN_SERVER=${MEET_TURN_SERVER}
- TURN_STATIC_SECRET=${COTURN_STATIC_SECRET}
@@ -224,3 +262,13 @@
- ./meet/server:/src/meet/:ro
- ./docker/certs/meet.${APP_WEBSITE_DOMAIN}.cert:/etc/pki/tls/certs/meet.${APP_WEBSITE_DOMAIN}.cert
- ./docker/certs/meet.${APP_WEBSITE_DOMAIN}.key:/etc/pki/tls/private/meet.${APP_WEBSITE_DOMAIN}.key
+networks:
+ kolab:
+ driver: bridge
+ ipam:
+ config:
+ - subnet: "172.18.0.0/24"
+volumes:
+ mariadb:
+ imap:
+ ldap:
diff --git a/docker/haproxy/haproxy.cfg b/docker/haproxy/haproxy.cfg
--- a/docker/haproxy/haproxy.cfg
+++ b/docker/haproxy/haproxy.cfg
@@ -73,4 +73,4 @@
stick store-request src
stick-table type ip size 200k expire 30m
# NGINX imap with proxy protocol enabled
- server s1 127.0.0.1:144 check send-proxy-v2
+ server s1 proxy:144 check send-proxy-v2
diff --git a/docker/kolab/Dockerfile b/docker/kolab/Dockerfile
--- a/docker/kolab/Dockerfile
+++ b/docker/kolab/Dockerfile
@@ -15,6 +15,7 @@
epel-release epel-next-release && \
dnf -y module enable 389-directory-server:stable/default && \
dnf -y module enable mariadb:10.3 && \
+ dnf -y install iputils vim-enhanced bind-utils && \
dnf clean all
RUN rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-8
@@ -28,28 +29,44 @@
COPY kolab-init.service /etc/systemd/system/kolab-init.service
COPY kolab-setenv.service /etc/systemd/system/kolab-setenv.service
-COPY kolab-vlv.service /etc/systemd/system/kolab-vlv.service
COPY utils /root/utils
RUN rm -rf /etc/systemd/system/multi-user.target.wants/{avahi-daemon,sshd}.* && \
ln -s /etc/systemd/system/kolab-init.service \
/etc/systemd/system/multi-user.target.wants/kolab-init.service && \
ln -s /etc/systemd/system/kolab-setenv.service \
- /etc/systemd/system/multi-user.target.wants/kolab-setenv.service && \
- ln -s /etc/systemd/system/kolab-vlv.service \
- /etc/systemd/system/multi-user.target.wants/kolab-vlv.service
+ /etc/systemd/system/multi-user.target.wants/kolab-setenv.service
-RUN sed -i -r -e 's/^SELINUX=.*$/SELINUX=permissive/g' /etc/selinux/config 2>/dev/null || :
+RUN sed -i -r -e 's/^SELINUX=.*$/SELINUX=permissive/g' /etc/selinux/config 2>/dev/null || :
RUN sed -i -r -e 's/^Listen 80$/Listen 9080/g' /etc/httpd/conf/httpd.conf
#RUN sed -i -r -e 's/^Listen 443$/Listen 9443/g' /etc/httpd/conf/httpd.conf
COPY kolab-init.sh /usr/local/sbin/
RUN chmod 750 /usr/local/sbin/kolab-init.sh
-COPY kolab-vlv.sh /usr/local/sbin/
-RUN chmod 750 /usr/local/sbin/kolab-vlv.sh
+
+COPY kolab.conf /etc/kolab/kolab.conf
+COPY cyrus.conf /etc/cyrus.conf
+COPY imapd.conf /etc/imapd.conf
+COPY imapd.annotations.conf /etc/imapd.annotations.conf
+COPY guam.conf /etc/guam/sys.config
+
+
+RUN mkdir -p /imapdata/{spool,lib} && \
+ rm -rf /var/spool/imap && ln -s /imapdata/spool /var/spool/imap && \
+ mv /var/lib/imap /var/lib/imap-bak && ln -s /imapdata/lib /var/lib/imap && \
+ chmod -R 777 /imapdata && \
+ chown cyrus:mail /var/spool/imap /var/lib/imap
+
+RUN mkdir -p /ldapdata/{config,ssca,run} /var/run/dirsrv && \
+ ln -s /ldapdata/config /etc/dirsrv/slapd-kolab && \
+ ln -s /ldapdata/ssca /etc/dirsrv/ssca && \
+ ln -s /ldapdata/run /var/run/dirsrv && \
+ chmod -R 777 /ldapdata /etc/dirsrv
VOLUME [ "/sys/fs/cgroup" ]
+VOLUME [ "/imapdata" ]
+VOLUME [ "/ldapdata" ]
WORKDIR /root/
diff --git a/docker/kolab/cyrus.conf b/docker/kolab/cyrus.conf
new file mode 100644
--- /dev/null
+++ b/docker/kolab/cyrus.conf
@@ -0,0 +1,46 @@
+# standard standalone server implementation
+
+START {
+ # do not delete this entry!
+ recover cmd="ctl_cyrusdb -r"
+
+ idled cmd="idled"
+}
+
+# UNIX sockets start with a slash and are put into /var/lib/imap/sockets
+SERVICES {
+ nginx cmd="imapd" listen=0.0.0.0:12143 prefork=1
+ guam cmd="imapd" listen=0.0.0.0:13143 prefork=1
+ imap cmd="imapd" listen=0.0.0.0:11143 prefork=1
+ imaps cmd="imapd -s" listen=0.0.0.0:11993 prefork=5
+
+ sieve cmd="timsieved" listen="sieve" prefork=0
+
+ ptloader cmd="ptloader" listen="/var/lib/imap/socket/ptsock" prefork=0
+
+ lmtpunix cmd="lmtpd" listen="/var/lib/imap/socket/lmtp" prefork=1
+
+ notify cmd="notifyd" listen="/var/lib/imap/socket/notify" proto="udp" prefork=1
+}
+
+EVENTS {
+ # this is required
+ checkpoint cmd="ctl_cyrusdb -c" period=30
+
+ # this is only necessary if using duplicate delivery suppression,
+ # Sieve or NNTP
+ duplicateprune cmd="cyr_expire -E 3" at=0400
+
+ # Expire data older then 69 days. Two full months of 31 days
+ # each includes two full backup cycles, plus 1 week margin
+ # because we run our full backups on the first sat/sun night
+ # of each month.
+ deleteprune cmd="cyr_expire -E 4 -D 69" at=0430
+ expungeprune cmd="cyr_expire -E 4 -X 69" at=0445
+
+ # this is only necessary if caching TLS sessions
+ tlsprune cmd="tls_prune" at=0400
+
+ # Create search indexes regularly (remove -s for cyrus 3+)
+ #squatter cmd="squatter -s -i" at=0530
+}
diff --git a/docker/kolab/utils/10-change-port-numbers.sh b/docker/kolab/guam.conf
old mode 100755
new mode 100644
rename from docker/kolab/utils/10-change-port-numbers.sh
rename to docker/kolab/guam.conf
--- a/docker/kolab/utils/10-change-port-numbers.sh
+++ b/docker/kolab/guam.conf
@@ -1,75 +1,3 @@
-#!/bin/bash
-
-cat ${SSL_CERTIFICATE} ${SSL_CERTIFICATE_FULLCHAIN} ${SSL_CERTIFICATE_KEY} > /etc/pki/cyrus-imapd/cyrus-imapd.bundle.pem
-chown cyrus:mail /etc/pki/cyrus-imapd/cyrus-imapd.bundle.pem
-
-cp /etc/pki/cyrus-imapd/cyrus-imapd.bundle.pem /etc/pki/tls/private/postfix.pem
-chown postfix:mail /etc/pki/tls/private/postfix.pem
-chmod 655 /etc/pki/tls/private/postfix.pem
-
-sed -i "s/tls_server_cert:.*/tls_server_cert: \/etc\/pki\/cyrus-imapd\/cyrus-imapd.bundle.pem/" /etc/imapd.conf
-sed -i "s/tls_server_key:.*/tls_server_key: \/etc\/pki\/cyrus-imapd\/cyrus-imapd.bundle.pem/" /etc/imapd.conf
-sed -i "s/tls_server_ca_file:.*/tls_server_ca_file: \/etc\/pki\/cyrus-imapd\/cyrus-imapd.bundle.pem/" /etc/imapd.conf
-
-sed -i "s/smtpd_tls_key_file =.*/smtpd_tls_key_file = \/etc\/pki\/tls\/private\/postfix.pem/" /etc/postfix/main.cf
-sed -i "s/smtpd_tls_cert_file =.*/smtpd_tls_cert_file = \/etc\/pki\/tls\/private\/postfix.pem/" /etc/postfix/main.cf
-
-sed -i -r \
- -e '/allowplaintext/ a\
-guam_allowplaintext: yes' \
- -e '/allowplaintext/ a\
-nginx_allowplaintext: yes' \
- /etc/imapd.conf
-
-sed -i \
- -e '/SERVICES/ a\
- nginx cmd="imapd" listen=127.0.0.1:12143 prefork=1' \
- -e '/SERVICES/ a\
- guam cmd="imapd" listen=127.0.0.1:13143 prefork=1' \
- -e '/SERVICES/ a\
- imap cmd="imapd" listen=127.0.0.1:11143 prefork=1' \
- -e 's/listen="127.0.0.1:9993"/listen=127.0.0.1:11993/g' \
- /etc/cyrus.conf
-
-systemctl restart cyrus-imapd
-
-# Remove the submission block, by matching from submission until the next empty line
-sed -i -e '/submission inet/,/^$/d' /etc/postfix/master.cf
-
-# Insert a new submission block with a modified port
-cat >> /etc/postfix/master.cf << EOF
-127.0.0.1:10587 inet n - n - - smtpd
- -o cleanup_service_name=cleanup_submission
- -o syslog_name=postfix/submission
- #-o smtpd_tls_security_level=encrypt
- -o smtpd_sasl_auth_enable=yes
- -o smtpd_sasl_authenticated_header=yes
- -o smtpd_client_restrictions=permit_sasl_authenticated,reject
- -o smtpd_data_restrictions=\$submission_data_restrictions
- -o smtpd_recipient_restrictions=\$submission_recipient_restrictions
- -o smtpd_sender_restrictions=\$submission_sender_restrictions
-
-127.0.0.1:10465 inet n - n - - smtpd
- -o cleanup_service_name=cleanup_submission
- -o rewrite_service_name=rewrite_submission
- -o syslog_name=postfix/smtps
- -o mydestination=
- -o local_recipient_maps=
- -o relay_domains=
- -o relay_recipient_maps=
- #-o smtpd_tls_wrappermode=yes
- -o smtpd_sasl_auth_enable=yes
- -o smtpd_sasl_authenticated_header=yes
- -o smtpd_client_restrictions=permit_sasl_authenticated,reject
- -o smtpd_sender_restrictions=\$submission_sender_restrictions
- -o smtpd_recipient_restrictions=\$submission_recipient_restrictions
- -o smtpd_data_restrictions=\$submission_data_restrictions
-EOF
-
-systemctl restart postfix
-
-cat > /etc/guam/sys.config << EOF
-%% Example configuration for Guam.
[
{
kolab_guam, [
@@ -158,6 +86,3 @@
]
}
].
-EOF
-
-systemctl restart guam
diff --git a/docker/kolab/imapd.annotations.conf b/docker/kolab/imapd.annotations.conf
new file mode 100644
--- /dev/null
+++ b/docker/kolab/imapd.annotations.conf
@@ -0,0 +1,11 @@
+/vendor/kolab/activesync,mailbox,string,backend,value.priv,r
+/vendor/kolab/color,mailbox,string,backend,value.shared value.priv,a
+/vendor/kolab/displayname,mailbox,string,backend,value.shared value.priv,a
+/vendor/kolab/folder-test,mailbox,string,backend,value.shared value.priv,a
+/vendor/kolab/folder-type,mailbox,string,backend,value.shared value.priv,a
+/vendor/kolab/incidences-for,mailbox,string,backend,value.shared value.priv,a
+/vendor/kolab/pxfb-readable-for,mailbox,string,backend,value.shared value.priv,a
+/vendor/kolab/uniqueid,mailbox,string,backend,value.shared value.priv,a
+/vendor/kolab/h-share-attr-desc,mailbox,string,backend,value.shared value.priv,a
+/vendor/horde/share-params,mailbox,string,backend,value.shared value.priv,a
+/vendor/x-toltec/test,mailbox,string,backend,value.shared value.priv,a
diff --git a/docker/kolab/imapd.conf b/docker/kolab/imapd.conf
new file mode 100644
--- /dev/null
+++ b/docker/kolab/imapd.conf
@@ -0,0 +1,58 @@
+defaultpartition: default
+configdirectory: /var/lib/imap/
+partition-default: /var/spool/imap/
+admins: cyrus-admin
+sievedir: /var/lib/imap/sieve/
+sendmail: /usr/sbin/sendmail
+sasl_pwcheck_method: saslauthd
+sasl_mech_list: PLAIN LOGIN
+allowplaintext: no
+guam_allowplaintext: yes
+nginx_allowplaintext: yes
+tls_server_cert: /etc/pki/cyrus-imapd/cyrus-imapd.bundle.pem
+tls_server_key: /etc/pki/cyrus-imapd/cyrus-imapd.bundle.pem
+# uncomment this if you're operating in a DSCP environment (RFC-4594)
+# qosmarking: af13
+auth_mech: pts
+pts_module: ldap
+ptloader_sock: /var/lib/imap/socket/ptsock
+ldap_uri: ldap://127.0.0.1:389
+ldap_sasl: 0
+ldap_base: dc=hosted,dc=com
+ldap_bind_dn: uid=kolab-service,ou=Special Users,dc=mgmt,dc=com
+ldap_password: Welcome2KolabSystems
+ldap_filter: (|(&(|(uid=cyrus-admin)(uid=cyrus-murder))(uid=%U))(&(|(uid=%U)(mail=%U@%d)(mail=%U@%r))(objectclass=kolabinetorgperson)))
+ldap_user_attribute: mail
+ldap_group_base: dc=mgmt,dc=com
+ldap_group_filter: (&(cn=%u)(objectclass=ldapsubentry)(objectclass=nsroledefinition))
+ldap_group_scope: one
+ldap_member_base: dc=mgmt,dc=com
+ldap_member_method: attribute
+ldap_member_attribute: nsrole
+ldap_restart: 1
+ldap_timeout: 10
+ldap_time_limit: 10
+unixhierarchysep: 1
+virtdomains: userid
+annotation_definitions: /etc/imapd.annotations.conf
+sieve_extensions: fileinto reject envelope body vacation imapflags notify include regex subaddress relational copy date index
+allowallsubscribe: 0
+allowusermoves: 1
+altnamespace: 1
+hashimapspool: 1
+anysievefolder: 1
+fulldirhash: 0
+sieveusehomedir: 0
+sieve_allowreferrals: 0
+lmtp_downcase_rcpt: 1
+lmtp_fuzzy_mailbox_match: 1
+username_tolower: 1
+deletedprefix: DELETED
+delete_mode: delayed
+expunge_mode: delayed
+postuser: shared
+# on systems with cyrus 3+ specify search engine
+# search_engine: squat
+ldap_domain_base_dn: ou=Domains,dc=mgmt,dc=com
+chatty: 1
+debug: 1
diff --git a/docker/kolab/kolab-init.service b/docker/kolab/kolab-init.service
--- a/docker/kolab/kolab-init.service
+++ b/docker/kolab/kolab-init.service
@@ -1,12 +1,13 @@
[Unit]
Description=Kolab Setup Service
Requires=kolab-setenv.service
-After=kolab-setenv.service
+After=kolab-setenv.service ldapdata.mount imapdata.mount
[Service]
Type=oneshot
EnvironmentFile=/etc/openshift-environment
ExecStart=/usr/local/sbin/kolab-init.sh
+RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
diff --git a/docker/kolab/kolab-init.sh b/docker/kolab/kolab-init.sh
--- a/docker/kolab/kolab-init.sh
+++ b/docker/kolab/kolab-init.sh
@@ -1,38 +1,15 @@
#!/bin/bash
-if [ -d "/etc/dirsrv/slapd-kolab/" ]; then
- exit 0
-fi
-
-cp -av /bin/true /usr/sbin/ds_systemd_ask_password_acl
-
pushd /root/utils/
./01-reverse-etc-hosts.sh && echo "01 done"
./02-write-my.cnf.sh && echo "02 done"
-./03-setup-kolab.sh && echo "03 done"
+./03-setup-ldap.sh && echo "03 ldap done"
+./03-setup-kolab.sh && echo "03 kolab done"
./04-reset-mysql-kolab-password.sh && echo "04 done"
-./05-replace-localhost.sh && echo "05 done"
-./06-mysql-for-kolabdev.sh && echo "06 done"
-./07-adjust-base-dns.sh && echo "07 done"
-./08-disable-amavisd.sh && echo "08 done"
-./09-enable-debugging.sh && echo "09 done"
-./10-change-port-numbers.sh && echo "10 done"
+./05-adjust-configs.sh && echo "05 done"
./10-reset-kolab-service-password.sh && echo "10 done"
./11-reset-cyrus-admin-password.sh && echo "11 done"
-./12-create-hosted-kolab-service.sh && echo "12 done"
-./13-create-ou-domains.sh && echo "13 done"
-./14-create-management-domain.sh && echo "14 done"
-./15-create-hosted-domain.sh && echo "15 done"
-./16-remove-cn-kolab-cn-config.sh && echo "16 done"
-./17-remove-hosted-service-access-from-mgmt-domain.sh && echo "17 done"
-./18-adjust-kolab-conf.sh && echo "18 done"
-./19-turn-on-vlv-in-roundcube.sh && echo "19 done"
-./20-add-alias-attribute-index.sh && echo "20 done"
-./21-adjust-postfix-config.sh && echo "21 done"
-# FIXME we can only create the resource once the owner exists
-#./22-create-resource.sh && echo "22 done"
./23-patch-system.sh && echo "23 done"
-./24-roundcubeconfig.sh && echo "24 done"
touch /tmp/kolab-init.done
diff --git a/docker/kolab/kolab-vlv.service b/docker/kolab/kolab-vlv.service
deleted file mode 100644
--- a/docker/kolab/kolab-vlv.service
+++ /dev/null
@@ -1,9 +0,0 @@
-[Unit]
-Description=Kolab VLV and SSS Service
-
-[Service]
-Type=oneshot
-ExecStart=/usr/local/sbin/kolab-vlv.sh
-
-[Install]
-WantedBy=multi-user.target
diff --git a/docker/kolab/kolab-vlv.sh b/docker/kolab/kolab-vlv.sh
deleted file mode 100755
--- a/docker/kolab/kolab-vlv.sh
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/bash
-
-pushd /root/utils/
-
-while [ ! -f /tmp/kolab-init.done ]; do
- sleep 5
-done
-
-./50-add-vlv-searches.sh
-./51-add-vlv-indexes.sh
-./52-run-vlv-index-tasks.sh
diff --git a/docker/kolab/kolab.conf b/docker/kolab/kolab.conf
new file mode 100644
--- /dev/null
+++ b/docker/kolab/kolab.conf
@@ -0,0 +1,83 @@
+[kolab]
+primary_domain = mgmt.com
+auth_mechanism = ldap
+imap_backend = cyrus-imap
+default_locale = en_US
+sync_interval = 300
+domain_sync_interval = 600
+policy_uid = %(surname)s.lower()
+daemon_rcpt_policy = False
+[imap]
+virtual_domains = userid
+
+[ldap]
+ldap_uri = ldap://127.0.0.1:389
+timeout = 10
+supported_controls = 0,2,3
+base_dn = dc=mgmt,dc=com
+bind_dn = cn=Directory Manager
+bind_pw = Welcome2KolabSystems
+service_bind_dn = uid=kolab-service,ou=Special Users,dc=mgmt,dc=com
+service_bind_pw = Welcome2KolabSystems
+user_base_dn = dc=hosted,dc=com
+user_scope = sub
+user_filter = (objectclass=inetorgperson)
+kolab_user_base_dn = dc=hosted,dc=com
+kolab_user_filter = (objectclass=kolabinetorgperson)
+group_base_dn = dc=hosted,dc=com
+group_filter = (|(objectclass=groupofuniquenames)(objectclass=groupofurls))
+group_scope = sub
+kolab_group_filter = (|(objectclass=kolabgroupofuniquenames)(objectclass=kolabgroupofurls))
+sharedfolder_base_dn = dc=hosted,dc=com
+sharedfolder_filter = (objectclass=kolabsharedfolder)
+sharedfolder_acl_entry_attribute = acl
+resource_base_dn = dc=hosted,dc=com
+resource_filter = (|%(group_filter)s(objectclass=kolabsharedfolder))
+domain_base_dn = ou=Domains,dc=mgmt,dc=com
+domain_filter = (&(associatedDomain=*))
+domain_name_attribute = associateddomain
+domain_rootdn_attribute = inetdomainbasedn
+quota_attribute = mailquota
+modifytimestamp_format = %Y%m%d%H%M%SZ
+unique_attribute = nsuniqueid
+mail_attributes = mail, alias
+mailserver_attribute = mailhost
+auth_attributes = mail, uid
+
+[kolab_smtp_access_policy]
+cache_uri = mysql://kolab:Welcome2KolabSystems@mariadb/kolab
+cache_retention = 86400
+address_search_attrs = mail, alias
+delegate_sender_header = True
+alias_sender_header = True
+sender_header = True
+xsender_header = True
+empty_sender_hosts = 3.2.1.0/24, 6.6.6.0/24
+
+[kolab_wap]
+mgmt_root_dn = dc=mgmt,dc=com
+hosted_root_dn = dc=hosted,dc=com
+api_url = http://127.0.0.1:9080/kolab-webadmin/api
+skin = default
+sql_uri = mysql://kolab:Welcome2KolabSystems@mariadb/kolab
+ssl_verify_peer = false
+ssl_verify_host = false
+
+[cyrus-imap]
+uri = imaps://127.0.0.1:11993
+admin_login = cyrus-admin
+admin_password = Welcome2KolabSystems
+
+[cyrus-sasl]
+result_attribute = mail
+
+[wallace]
+webmail_url = https://%(domain)s/roundcubemail
+modules = resources, invitationpolicy
+kolab_invitation_policy = ACT_ACCEPT_IF_NO_CONFLICT:example.org, ACT_MANUAL
+invitationpolicy_autoupdate_other_attendees_on_reply = false
+resource_calendar_expire_days = 100
+
+[mgmt.com]
+default_quota = 1048576
+daemon_rcpt_policy = False
diff --git a/docker/kolab/utils/02-write-my.cnf.sh b/docker/kolab/utils/02-write-my.cnf.sh
--- a/docker/kolab/utils/02-write-my.cnf.sh
+++ b/docker/kolab/utils/02-write-my.cnf.sh
@@ -2,7 +2,7 @@
cat > /root/.my.cnf << EOF
[client]
-host=${DB_HOST:-127.0.0.1}
+host=${DB_HOST}
user=root
password=${DB_ROOT_PASSWORD}
EOF
diff --git a/docker/kolab/utils/03-setup-kolab.sh b/docker/kolab/utils/03-setup-kolab.sh
--- a/docker/kolab/utils/03-setup-kolab.sh
+++ b/docker/kolab/utils/03-setup-kolab.sh
@@ -2,20 +2,6 @@
. ./settings.sh
-if [ -f /root/kolab.conf.template ]; then
- eval "echo \"$(cat /root/kolab.conf.template)\"" > /root/kolab.conf.ref
- KOLAB_CONFIG_REF="--config=/root/kolab.conf.ref"
- cp -f ${KOLAB_CONFIG_REF#--config=} /etc/kolab/kolab.conf
-fi
-
-CMD="$(which setup-kolab) \
- --default ${LDAP_HOST+--without-ldap} ${KOLAB_CONFIG_REF} \
- --fqdn=kolab.${domain} \
- --timezone=Europe/Zurich \
- --mysqlhost=${DB_HOST:-127.0.0.1} \
- --mysqlserver=existing \
- --mysqlrootpw=${DB_ROOT_PASSWORD:-Welcome2KolabSystems} \
- --directory-manager-pwd=${LDAP_ADMIN_BIND_PW:-Welcome2KolabSystems}"
echo ${CMD} | tee -a /root/setup-kolab.log
echo -n "Wait for MariaDB container: " | tee -a /root/setup-kolab.log
@@ -25,14 +11,76 @@
done | tee -a /root/setup-kolab.log
echo "OK!" | tee -a /root/setup-kolab.log
-if [ ! -z "${LDAP_HOST}" ]; then
- echo -n "Wait for DS389 container: " | tee -a /root/setup-kolab.log
- while ! ldapsearch -h ${LDAP_HOST} -D "${LDAP_ADMIN_BIND_DN}" -w "${LDAP_ADMIN_BIND_PW}" -b "" -s base > /dev/null 2>&1 ; do
- echo -n '.'
- sleep 3
- done | tee -a /root/setup-kolab.log
- echo "OK!" | tee -a /root/setup-kolab.log
+echo -n "Wait for DS389 container: " | tee -a /root/setup-kolab.log
+while ! ldapsearch -h ${LDAP_HOST} -D "${LDAP_ADMIN_BIND_DN}" -w "${LDAP_ADMIN_BIND_PW}" -b "" -s base > /dev/null 2>&1 ; do
+ echo -n '.'
+ sleep 3
+done | tee -a /root/setup-kolab.log
+echo "OK!" | tee -a /root/setup-kolab.log
+
+
+cat > /tmp/kolab-setup-my.cnf << EOF
+[client]
+host=${DB_HOST}
+user=root
+password=${DB_ROOT_PASSWORD}
+EOF
+
+
+CMD="$(which setup-kolab) mta \
+ --default"
+${CMD} 2>&1 | tee -a /root/setup-kolab.log
+
+
+
+CMD="$(which setup-kolab) php \
+ --default \
+ --timezone=Europe/Zurich"
+${CMD} 2>&1 | tee -a /root/setup-kolab.log
+
+# setup imap
+if [ -f "/var/lib/imap/db" ]; then
+ echo "IMAP directory exists, nothing to do"
+else
+ echo "Initializing IMAP volume"
+ cp -ar /var/lib/imap-bak/* /var/lib/imap/
+ systemctl start cyrus-imapd
fi
+systemctl stop saslauthd
+systemctl start kolab-saslauthd
+systemctl enable kolab-saslauthd
+#Setup guam
+systemctl start guam
+systemctl enable guam
+
+
+#TODO just add /etc/kolab-freebusy/
+# CMD="$(which setup-kolab) freebusy \
+# --default"
+# ${CMD} 2>&1 | tee -a /root/setup-kolab.log
+
+cat > /tmp/kolab-setup-my.cnf << EOF
+[client]
+host=${DB_HOST}
+user=root
+password=${DB_ROOT_PASSWORD}
+EOF
+
+# Configure roundcube and setup db
+# The db setup will just fail if the db already exists,
+# but no harm done
+CMD="$(which setup-kolab) roundcube \
+ --default"
+${CMD} 2>&1 | tee -a /root/setup-kolab.log
+
+cat > /tmp/kolab-setup-my.cnf << EOF
+[client]
+host=${DB_HOST}
+user=root
+password=${DB_ROOT_PASSWORD}
+EOF
+CMD="$(which setup-kolab) syncroton \
+ --default"
${CMD} 2>&1 | tee -a /root/setup-kolab.log
diff --git a/docker/kolab/utils/03-setup-ldap.sh b/docker/kolab/utils/03-setup-ldap.sh
new file mode 100755
--- /dev/null
+++ b/docker/kolab/utils/03-setup-ldap.sh
@@ -0,0 +1,259 @@
+#!/bin/bash
+
+. ./settings.sh
+
+cp -av /bin/true /usr/sbin/ds_systemd_ask_password_acl
+
+if [ -f "/etc/dirsrv/slapd-kolab/dse.ldif" ]; then
+ echo "LDAP directory exists, nothing to do"
+
+ mkdir -p /var/log/dirsrv/slapd-kolab/
+ chmod 777 /var/log/dirsrv/slapd-kolab/
+ systemctl start dirsrv@kolab
+ mkdir /run/dirsrv
+ chmod 777 /run/dirsrv
+ mkdir -p /run/lock/dirsrv/slapd-kolab/
+ chmod 777 /run/lock/dirsrv/slapd-kolab/
+ mkdir -p /var/lib/dirsrv/slapd-kolab
+ chown dirsrv:dirsrv /var/lib/dirsrv/slapd-kolab
+
+ systemctl start dirsrv@kolab
+else
+ sed -i -e 's/sys.exit/print("exit") #sys.exit/' /usr/lib/python3.6/site-packages/pykolab/setup/setup_ldap.py
+
+ echo "LDAP directory does not exist, setting it up."
+ CMD="$(which setup-kolab) ldap \
+ --default ${LDAP_HOST} \
+ --fqdn=kolab.${domain} \
+ --directory-manager-pwd=${LDAP_ADMIN_BIND_PW}"
+ ${CMD} 2>&1 | tee -a /root/setup-kolab.log
+
+
+ # Create hosted kolab service
+ (
+ echo "dn: uid=hosted-kolab-service,ou=Special Users,${rootdn}"
+ echo "objectclass: top"
+ echo "objectclass: inetorgperson"
+ echo "objectclass: person"
+ echo "uid: hosted-kolab-service"
+ echo "cn: Hosted Kolab Service Account"
+ echo "sn: Service Account"
+ echo "givenname: Hosted Kolab"
+ echo "userpassword: ${hosted_kolab_service_pw}"
+ echo ""
+ ) | ldapadd -x -h ${ldap_host} -D "${ldap_binddn}" -w "${ldap_bindpw}"
+
+ # Create ou domain
+ (
+ echo "dn: ou=Domains,${rootdn}"
+ echo "ou: Domains"
+ echo "objectClass: top"
+ echo "objectClass: organizationalunit"
+ echo ""
+ ) | ldapadd -x -h ${ldap_host} -D "${ldap_binddn}" -w "${ldap_bindpw}"
+
+ # Create management domain
+ (
+ echo "dn: associateddomain=${domain},${domain_base_dn}"
+ echo "aci: (targetattr = \"*\")(version 3.0;acl \"Deny Rest\";deny (all)(userdn != \"ldap:///uid=kolab-service,ou=Special Users,${rootdn} || ldap:///${rootdn}??sub?(objectclass=*)\");)"
+ echo "aci: (targetattr = \"*\")(version 3.0;acl \"Deny Hosted Kolab\";deny (all)(userdn = \"ldap:///uid=hosted-kolab-service,ou=Special Users,${rootdn}\");)"
+ echo "inetDomainStatus: active"
+ echo "objectClass: top"
+ echo "objectClass: domainrelatedobject"
+ echo "objectClass: inetdomain"
+ echo "associatedDomain: ${domain}"
+ echo ""
+ ) | ldapadd -x -h ${ldap_host} -D "${ldap_binddn}" -w "${ldap_bindpw}"
+
+
+ # Create hosted domains
+ (
+ echo "dn: associateddomain=${hosted_domain},${domain_base_dn}"
+ echo "objectclass: top"
+ echo "objectclass: domainrelatedobject"
+ echo "objectclass: inetdomain"
+ echo "inetdomainstatus: active"
+ echo "associateddomain: ${hosted_domain}"
+ echo "inetdomainbasedn: ${hosted_domain_rootdn}"
+ echo ""
+ ) | ldapadd -x -h ${ldap_host} -D "${ldap_binddn}" -w "${ldap_bindpw}"
+
+ (
+ echo "dn: cn=$(echo ${hosted_domain} | sed -e 's/\./_/g'),cn=ldbm database,cn=plugins,cn=config"
+ echo "objectClass: top"
+ echo "objectClass: extensibleobject"
+ echo "objectClass: nsbackendinstance"
+ echo "cn: $(echo ${hosted_domain} | sed -e 's/\./_/g')"
+ echo "nsslapd-suffix: ${hosted_domain_rootdn}"
+ echo "nsslapd-cachesize: -1"
+ echo "nsslapd-cachememsize: 10485760"
+ echo "nsslapd-readonly: off"
+ echo "nsslapd-require-index: off"
+ echo "nsslapd-directory: /var/lib/dirsrv/slapd-${DS_INSTANCE_NAME:-$(hostname -s)}/db/$(echo ${hosted_domain} | sed -e 's/\./_/g')"
+ echo "nsslapd-dncachememsize: 10485760"
+ echo ""
+ ) | ldapadd -x -h ${ldap_host} -D "${ldap_binddn}" -w "${ldap_bindpw}"
+
+ (
+ #On centos7
+ #echo "dn: cn=$(echo ${hosted_domain_rootdn} | sed -e 's/=/\\3D/g' -e 's/,/\\2D/g'),cn=mapping tree,cn=config"
+ #On centos8
+ echo "dn: cn=\"${hosted_domain_rootdn}\",cn=mapping tree,cn=config"
+ echo "objectClass: top"
+ echo "objectClass: extensibleObject"
+ echo "objectClass: nsMappingTree"
+ echo "nsslapd-state: backend"
+ echo "cn: ${hosted_domain_rootdn}"
+ echo "nsslapd-backend: $(echo ${hosted_domain} | sed -e 's/\./_/g')"
+ echo ""
+ ) | ldapadd -x -h ${ldap_host} -D "${ldap_binddn}" -w "${ldap_bindpw}"
+
+ (
+ echo "dn: ${hosted_domain_rootdn}"
+ echo "aci: (targetattr=\"carLicense || description || displayName || facsimileTelephoneNumber || homePhone || homePostalAddress || initials || jpegPhoto || labeledURI || mobile || pager || photo || postOfficeBox || postalAddress || postalCode || preferredDeliveryMethod || preferredLanguage || registeredAddress || roomNumber || secretary || seeAlso || st || street || telephoneNumber || telexNumber || title || userCertificate || userPassword || userSMIMECertificate || x500UniqueIdentifier\")(version 3.0; acl \"Enable self write for common attributes\"; allow (write) userdn=\"ldap:///self\";)"
+ echo "aci: (targetattr =\"*\")(version 3.0;acl \"Directory Administrators Group\";allow (all) (groupdn=\"ldap:///cn=Directory Administrators,${hosted_domain_rootdn}\" or roledn=\"ldap:///cn=kolab-admin,${hosted_domain_rootdn}\");)"
+ echo "aci: (targetattr=\"*\")(version 3.0; acl \"Configuration Administrators Group\"; allow (all) groupdn=\"ldap:///cn=Configuration Administrators,ou=Groups,ou=TopologyManagement,o=NetscapeRoot\";)"
+ echo "aci: (targetattr=\"*\")(version 3.0; acl \"Configuration Administrator\"; allow (all) userdn=\"ldap:///uid=admin,ou=Administrators,ou=TopologyManagement,o=NetscapeRoot\";)"
+ echo "aci: (targetattr = \"*\")(version 3.0; acl \"SIE Group\"; allow (all) groupdn = \"ldap:///cn=slapd-$(hostname -s),cn=389 Directory Server,cn=Server Group,cn=$(hostname -f),ou=${domain},o=NetscapeRoot\";)"
+ echo "aci: (targetattr = \"*\") (version 3.0;acl \"Search Access\";allow (read,compare,search)(userdn = \"ldap:///${hosted_domain_rootdn}??sub?(objectclass=*)\");)"
+ echo "aci: (targetattr = \"*\") (version 3.0;acl \"Service Search Access\";allow (read,compare,search)(userdn = \"ldap:///uid=kolab-service,ou=Special Users,${rootdn}\");)"
+ echo "objectClass: top"
+ echo "objectClass: domain"
+ echo "dc: $(echo ${hosted_domain} | cut -d'.' -f 1)"
+ echo ""
+ ) | ldapadd -x -h ${ldap_host} -D "${ldap_binddn}" -w "${ldap_bindpw}"
+
+ (
+ for role in "2fa-user" "activesync-user" "imap-user"; do
+ echo "dn: cn=${role},${hosted_domain_rootdn}"
+ echo "cn: ${role}"
+ echo "description: ${role} role"
+ echo "objectclass: top"
+ echo "objectclass: ldapsubentry"
+ echo "objectclass: nsmanagedroledefinition"
+ echo "objectclass: nsroledefinition"
+ echo "objectclass: nssimpleroledefinition"
+ echo ""
+ done
+
+ echo "dn: ou=Groups,${hosted_domain_rootdn}"
+ echo "ou: Groups"
+ echo "objectClass: top"
+ echo "objectClass: organizationalunit"
+ echo ""
+
+ echo "dn: ou=People,${hosted_domain_rootdn}"
+ echo "aci: (targetattr = \"*\") (version 3.0;acl \"Hosted Kolab Services\";allow (all)(userdn = \"ldap:///uid=hosted-kolab-service,ou=Special Users,${rootdn}\");)"
+ echo "ou: People"
+ echo "objectClass: top"
+ echo "objectClass: organizationalunit"
+ echo ""
+
+ echo "dn: ou=Special Users,${hosted_domain_rootdn}"
+ echo "ou: Special Users"
+ echo "objectClass: top"
+ echo "objectClass: organizationalunit"
+ echo ""
+
+ echo "dn: ou=Resources,${hosted_domain_rootdn}"
+ echo "ou: Resources"
+ echo "objectClass: top"
+ echo "objectClass: organizationalunit"
+ echo ""
+
+ echo "dn: ou=Shared Folders,${hosted_domain_rootdn}"
+ echo "ou: Shared Folders"
+ echo "objectClass: top"
+ echo "objectClass: organizationalunit"
+ echo ""
+
+ echo "dn: uid=cyrus-admin,ou=Special Users,${hosted_domain_rootdn}"
+ echo "sn: Administrator"
+ echo "uid: cyrus-admin"
+ echo "objectClass: top"
+ echo "objectClass: person"
+ echo "objectClass: inetorgperson"
+ echo "objectClass: organizationalperson"
+ echo "givenName: Cyrus"
+ echo "cn: Cyrus Administrator"
+ echo ""
+
+ ) | ldapadd -x -h ${ldap_host} -D "${ldap_binddn}" -w "${ldap_bindpw}"
+
+
+ # Remove cn kolab cn config
+ (
+ echo "associateddomain=${domain},cn=kolab,cn=config"
+ echo "cn=kolab,cn=config"
+ ) | ldapdelete -x -h ${ldap_host} -D "${ldap_binddn}" -w "${ldap_bindpw}" -c
+
+
+ # Remove hosted service access from mgmt domain
+ (
+ echo "dn: associateddomain=${domain},ou=Domains,${rootdn}"
+ echo "changetype: modify"
+ echo "replace: aci"
+ echo "aci: (targetattr = \"*\")(version 3.0;acl \"Deny Rest\";deny (all)(userdn != \"ldap:///uid=kolab-service,ou=Special Users,${rootdn} || ldap:///${rootdn}??sub?(objectclass=*)\");)"
+ echo "aci: (targetattr = \"*\")(version 3.0;acl \"Deny Hosted Kolab\";deny (all)(userdn = \"ldap:///uid=hosted-kolab-service,ou=Special Users,${rootdn}\");)"
+ echo ""
+ ) | ldapmodify -x -h ${ldap_host} -D "${ldap_binddn}" -w "${ldap_bindpw}"
+
+
+ # Add alias attribute index
+ #
+ export index_attr=alias
+
+ (
+ echo "dn: cn=${index_attr},cn=index,cn=${hosted_domain_db},cn=ldbm database,cn=plugins,cn=config"
+ echo "objectclass: top"
+ echo "objectclass: nsindex"
+ echo "cn: ${index_attr}"
+ echo "nsSystemIndex: false"
+ echo "nsindextype: pres"
+ echo "nsindextype: eq"
+ echo "nsindextype: sub"
+
+ ) | ldapadd -x -h ${ldap_host} -D "${ldap_binddn}" -w "${ldap_bindpw}" -c
+
+
+ (
+ echo "dn: cn=${hosted_domain_db} ${index_attr} index,cn=index,cn=tasks,cn=config"
+ echo "objectclass: top"
+ echo "objectclass: extensibleObject"
+ echo "cn: ${hosted_domain_db} ${index_attr} index"
+ echo "nsinstance: ${hosted_domain_db}"
+ echo "nsIndexAttribute: ${index_attr}:pres"
+ echo "nsIndexAttribute: ${index_attr}:eq"
+ echo "nsIndexAttribute: ${index_attr}:sub"
+ echo ""
+ ) | ldapadd -x -h ${ldap_host} -D "${ldap_binddn}" -w "${ldap_bindpw}" -c
+
+ ldap_complete=0
+
+ while [ ${ldap_complete} -ne 1 ]; do
+ result=$(
+ ldapsearch \
+ -x \
+ -h "${ldap_host}" \
+ -D "${ldap_binddn}" \
+ -w "${ldap_bindpw}" \
+ -c \
+ -LLL \
+ -b "cn=${hosted_domain_db} ${index_attr} index,cn=index,cn=tasks,cn=config" \
+ '(!(nstaskexitcode=0))' \
+ -s base 2>/dev/null
+ )
+ if [ -z "$result" ]; then
+ ldap_complete=1
+ echo ""
+ else
+ echo -n "."
+ sleep 1
+ fi
+ done
+
+ ./50-add-vlv-searches.sh
+ ./51-add-vlv-indexes.sh
+ ./52-run-vlv-index-tasks.sh
+fi
+
diff --git a/docker/kolab/utils/04-reset-mysql-kolab-password.sh b/docker/kolab/utils/04-reset-mysql-kolab-password.sh
--- a/docker/kolab/utils/04-reset-mysql-kolab-password.sh
+++ b/docker/kolab/utils/04-reset-mysql-kolab-password.sh
@@ -18,3 +18,5 @@
mysql -h ${DB_HOST:-127.0.0.1} -u root --password=${DB_ROOT_PASSWORD} \
-e "SET PASSWORD FOR '${DB_RC_USERNAME}'@'%' = PASSWORD('${DB_RC_PASSWORD}');"
+mysql -h ${DB_HOST:-127.0.0.1} -u root --password=${DB_ROOT_PASSWORD} \
+ -e "GRANT ALL PRIVILEGES ON roundcube.* TO '${DB_RC_USERNAME}'@'%' IDENTIFIED BY '${DB_RC_PASSWORD}';"
diff --git a/docker/kolab/utils/05-adjust-configs.sh b/docker/kolab/utils/05-adjust-configs.sh
new file mode 100755
--- /dev/null
+++ b/docker/kolab/utils/05-adjust-configs.sh
@@ -0,0 +1,166 @@
+#!/bin/bash
+
+# Replace localhost
+sed -i -e "/hosts/s/localhost/${LDAP_HOST}/" /etc/iRony/dav.inc.php
+sed -i -e "/host/s/localhost/${LDAP_HOST}/g" \
+ -e "/fbsource/s/localhost/${IMAP_HOST}/g" /etc/kolab-freebusy/config.ini
+#sed -i -e "s/server_host.*/server_host = ${LDAP_HOST}/g" /etc/postfix/ldap/*
+sed -i -e "/password_ldap_host/s/localhost/${LDAP_HOST}/" /etc/roundcubemail/password.inc.php
+sed -i -e "/hosts/s/localhost/${LDAP_HOST}/" /etc/roundcubemail/kolab_auth.inc.php
+sed -i -e "s#.*db_dsnw.*# \$config['db_dsnw'] = 'mysql://${DB_RC_USERNAME}:${DB_RC_PASSWORD}@${DB_HOST}/roundcube';#" \
+ -e "/default_host/s|= .*$|= 'ssl://${IMAP_HOST}';|" \
+ -e "/default_port/s|= .*$|= ${IMAP_PORT};|" \
+ -e "/smtp_server/s|= .*$|= 'tls://${MAIL_HOST}';|" \
+ -e "/smtp_port/s/= .*$/= ${MAIL_PORT};/" \
+ -e "/hosts/s/localhost/${LDAP_HOST}/" /etc/roundcubemail/config.inc.php
+sed -i -e "/hosts/s/localhost/${LDAP_HOST}/" /etc/roundcubemail/calendar.inc.php
+
+
+. ./settings.sh
+
+#Adjust basedn
+sed -i -r \
+ -e "s/(\s+)base => '.*',$/\1base => '${hosted_domain_rootdn}',/g" \
+ -e "/\\\$mydomain = / a\
+\$myhostname = '${HOSTNAME:-kolab}.${DOMAIN:-mgmt.com}';" \
+ -e "s/^base_dn = .*$/base_dn = ${hosted_domain_rootdn}/g" \
+ -e "s/^search_base = .*$/search_base = ${hosted_domain_rootdn}/g" \
+ -e "s/(\s+)'base_dn'(\s+)=> '.*',/\1'base_dn'\2=> '${hosted_domain_rootdn}',/g" \
+ -e "s/(\s+)'search_base_dn'(\s+)=> '.*',/\1'search_base_dn'\2=> '${hosted_domain_rootdn}',/g" \
+ -e "s/(\s+)'user_specific'(\s+)=> false,/\1'user_specific'\2=> true,/g" \
+ /etc/amavisd/amavisd.conf \
+ /etc/kolab-freebusy/config.ini \
+ /etc/postfix/ldap/*.cf \
+ /etc/roundcubemail/config.inc.php \
+ /etc/roundcubemail/calendar.inc.php \
+ /etc/roundcubemail/kolab_auth.inc.php
+
+sed -i -r \
+ -e "s/^search_base = .*$/search_base = ${domain_base_dn}/g" \
+ /etc/postfix/ldap/mydestination.cf
+
+
+#Disable amavisd
+postconf -e content_filter='smtp-wallace:[127.0.0.1]:10026'
+
+systemctl stop amavisd
+systemctl disable amavisd
+
+systemctl stop clamd@amavisd
+systemctl disable clamd@amavisd
+
+
+# Change port numbers
+cat ${SSL_CERTIFICATE} ${SSL_CERTIFICATE_FULLCHAIN} ${SSL_CERTIFICATE_KEY} > /etc/pki/cyrus-imapd/cyrus-imapd.bundle.pem
+chown cyrus:mail /etc/pki/cyrus-imapd/cyrus-imapd.bundle.pem
+
+cp /etc/pki/cyrus-imapd/cyrus-imapd.bundle.pem /etc/pki/tls/private/postfix.pem
+chown postfix:mail /etc/pki/tls/private/postfix.pem
+chmod 655 /etc/pki/tls/private/postfix.pem
+
+sed -i "s/smtpd_tls_key_file =.*/smtpd_tls_key_file = \/etc\/pki\/tls\/private\/postfix.pem/" /etc/postfix/main.cf
+sed -i "s/smtpd_tls_cert_file =.*/smtpd_tls_cert_file = \/etc\/pki\/tls\/private\/postfix.pem/" /etc/postfix/main.cf
+
+# Remove the submission block, by matching from submission until the next empty line
+sed -i -e '/submission inet/,/^$/d' /etc/postfix/master.cf
+
+# Insert a new submission block with a modified port
+cat >> /etc/postfix/master.cf << EOF
+127.0.0.1:10587 inet n - n - - smtpd
+ -o cleanup_service_name=cleanup_submission
+ -o syslog_name=postfix/submission
+ #-o smtpd_tls_security_level=encrypt
+ -o smtpd_sasl_auth_enable=yes
+ -o smtpd_sasl_authenticated_header=yes
+ -o smtpd_client_restrictions=permit_sasl_authenticated,reject
+ -o smtpd_data_restrictions=\$submission_data_restrictions
+ -o smtpd_recipient_restrictions=\$submission_recipient_restrictions
+ -o smtpd_sender_restrictions=\$submission_sender_restrictions
+
+127.0.0.1:10465 inet n - n - - smtpd
+ -o cleanup_service_name=cleanup_submission
+ -o rewrite_service_name=rewrite_submission
+ -o syslog_name=postfix/smtps
+ -o mydestination=
+ -o local_recipient_maps=
+ -o relay_domains=
+ -o relay_recipient_maps=
+ #-o smtpd_tls_wrappermode=yes
+ -o smtpd_sasl_auth_enable=yes
+ -o smtpd_sasl_authenticated_header=yes
+ -o smtpd_client_restrictions=permit_sasl_authenticated,reject
+ -o smtpd_sender_restrictions=\$submission_sender_restrictions
+ -o smtpd_recipient_restrictions=\$submission_recipient_restrictions
+ -o smtpd_data_restrictions=\$submission_data_restrictions
+EOF
+
+
+sed -i -r \
+ -e "s/'vlv'(\s+)=> false,/'vlv'\1=> true,/g" \
+ -e "s/'vlv_search'(\s+)=> false,/'vlv_search'\1=> true,/g" \
+ -e "s/inetOrgPerson/inetorgperson/g" \
+ -e "s/kolabInetOrgPerson/inetorgperson/g" \
+ /etc/roundcubemail/*.inc.php
+
+
+# Adjust postfix
+
+# new: (inetdomainstatus:1.2.840.113556.1.4.803:=1)
+# active: (inetdomainstatus:1.2.840.113556.1.4.803:=2)
+# suspended: (inetdomainstatus:1.2.840.113556.1.4.803:=4)
+# deleted: (inetdomainstatus:1.2.840.113556.1.4.803:=8)
+# confirmed: (inetdomainstatus:1.2.840.113556.1.4.803:=16)
+# verified: (inetdomainstatus:1.2.840.113556.1.4.803:=32)
+# ready: (inetdomainstatus:1.2.840.113556.1.4.803:=64)
+
+sed -i -r \
+ -e 's/^query_filter.*$/query_filter = (\&(associatedDomain=%s)(inetdomainstatus:1.2.840.113556.1.4.803:=18)(!(inetdomainstatus:1.2.840.113556.1.4.803:=4)))/g' \
+ /etc/postfix/ldap/mydestination.cf
+
+# new: (inetuserstatus:1.2.840.113556.1.4.803:=1)
+# active: (inetuserstatus:1.2.840.113556.1.4.803:=2)
+# suspended: (inetuserstatus:1.2.840.113556.1.4.803:=4)
+# deleted: (inetuserstatus:1.2.840.113556.1.4.803:=8)
+# ldapready: (inetuserstatus:1.2.840.113556.1.4.803:=16)
+# imapready: (inetuserstatus:1.2.840.113556.1.4.803:=32)
+
+sed -i -r \
+ -e 's/^query_filter.*$/query_filter = (\&(|(mail=%s)(alias=%s))(|(objectclass=kolabinetorgperson)(|(objectclass=kolabgroupofuniquenames)(objectclass=kolabgroupofurls))(|(|(objectclass=groupofuniquenames)(objectclass=groupofurls))(objectclass=kolabsharedfolder))(objectclass=kolabsharedfolder))(!(inetuserstatus:1.2.840.113556.1.4.803:=4)))/g' \
+ /etc/postfix/ldap/local_recipient_maps.cf
+
+systemctl restart postfix
+
+
+
+sed -i -r -e "s|$config\['kolab_files_url'\] = .*$|$config['kolab_files_url'] = 'https://' \. \$_SERVER['HTTP_HOST'] . '/chwala/';|g" /etc/roundcubemail/kolab_files.inc.php
+
+sed -i -r -e "s|$config\['kolab_invitation_calendars'\] = .*$|$config['kolab_invitation_calendars'] = true;|g" /etc/roundcubemail/calendar.inc.php
+
+sed -i -r -e "/^.*'contextmenu',$/a 'enigma'," /etc/roundcubemail/config.inc.php
+
+sed -i -r -e "s|$config\['enigma_passwordless'\] = .*$|$config['enigma_passwordless'] = true;|g" /etc/roundcubemail/enigma.inc.php
+sed -i -r -e "s|$config\['enigma_multihost'\] = .*$|$config['enigma_multihost'] = true;|g" /etc/roundcubemail/enigma.inc.php
+
+echo "\$config['enigma_woat'] = true;" >> /etc/roundcubemail/enigma.inc.php
+
+# Run it over haproxy then nginx for 2fa. We need to use startls because otherwise the proxy protocol doesn't work.
+sed -i -r -e "s|$config\['default_host'\] = .*$|$config['default_host'] = 'tls://haproxy';|g" /etc/roundcubemail/config.inc.php
+sed -i -r -e "s|$config\['default_port'\] = .*$|$config['default_port'] = 145;|g" /etc/roundcubemail/config.inc.php
+
+# So we can just append
+sed -i "s/?>//g" /etc/roundcubemail/config.inc.php
+
+# Enable the PROXY protocol
+cat << EOF >> /etc/roundcubemail/config.inc.php
+ \$config['imap_conn_options'] = Array(
+ 'ssl' => Array(
+ 'verify_peer_name' => false,
+ 'verify_peer' => false,
+ 'allow_self_signed' => true
+ ),
+ 'proxy_protocol' => 2
+ );
+ \$config['proxy_whitelist'] = array('127.0.0.1', '172.18.0.7');
+EOF
+
+echo "?>" >> /etc/roundcubemail/config.inc.php
diff --git a/docker/kolab/utils/05-replace-localhost.sh b/docker/kolab/utils/05-replace-localhost.sh
deleted file mode 100755
--- a/docker/kolab/utils/05-replace-localhost.sh
+++ /dev/null
@@ -1,30 +0,0 @@
-#!/bin/bash
-
-if [[ ${DB_HOST} == "localhost" || ${DB_HOST} == "127.0.0.1" ]]; then
- mysql -h ${DB_HOST} -u root --password=${DB_ROOT_PASSWORD} \
- -e "UPDATE mysql.db SET Host = '127.0.0.1' WHERE Host = 'localhost';"
-
- mysql -h ${DB_HOST} -u root --password=${DB_ROOT_PASSWORD} \
- -e "FLUSH PRIVILEGES;"
-fi
-
-sed -i -e "s#^ldap_servers:.*#ldap_servers: ldap://${LDAP_HOST:-127.0.0.1}:389#" /etc/imapd.conf
-sed -i -e "/hosts/s/localhost/${LDAP_HOST:-127.0.0.1}/" /etc/iRony/dav.inc.php
-sed -i -e "s#^ldap_uri.*#ldap_uri = ldap://${LDAP_HOST:-127.0.0.1}:389#" \
- -e "s#^cache_uri.*mysql://\(.*\):\(.*\)@\(.*\)\/\(.*\)#cache_uri = mysql://${DB_KOLAB_USERNAME}:${DB_KOLAB_PASSWORD}@${DB_HOST}/${DB_KOLAB_DATABASE}#" \
- -e "s#^sql_uri.*mysql://\(.*\):\(.*\)@\(.*\)\/\(.*\)#sql_uri = mysql://${DB_KOLAB_USERNAME}:${DB_KOLAB_PASSWORD}@${DB_HOST}/${DB_KOLAB_DATABASE}#" \
- -e "s#^uri.*#uri = imaps://${IMAP_HOST:-127.0.0.1}:11993#" /etc/kolab/kolab.conf
-sed -i -e "/host/s/localhost/${LDAP_HOST:-127.0.0.1}/g" \
- -e "/fbsource/s/localhost/${IMAP_HOST:-127.0.0.1}/g" /etc/kolab-freebusy/config.ini
-#sed -i -e "s/server_host.*/server_host = ${LDAP_HOST:-127.0.0.1}/g" /etc/postfix/ldap/*
-sed -i -e "/password_ldap_host/s/localhost/${LDAP_HOST:-127.0.0.1}/" /etc/roundcubemail/password.inc.php
-sed -i -e "/hosts/s/localhost/${LDAP_HOST:-127.0.0.1}/" /etc/roundcubemail/kolab_auth.inc.php
-sed -i -e "s#.*db_dsnw.*# \$config['db_dsnw'] = 'mysql://${DB_RC_USERNAME}:${DB_RC_PASSWORD}@${DB_HOST}/roundcube';#" \
- -e "/default_host/s|= .*$|= 'ssl://${IMAP_HOST:-127.0.0.1}';|" \
- -e "/default_port/s|= .*$|= ${IMAP_PORT:-11993};|" \
- -e "/smtp_server/s|= .*$|= 'tls://${MAIL_HOST:-127.0.0.1}';|" \
- -e "/smtp_port/s/= .*$/= ${MAIL_PORT:-10587};/" \
- -e "/hosts/s/localhost/${LDAP_HOST:-127.0.0.1}/" /etc/roundcubemail/config.inc.php
-sed -i -e "/hosts/s/localhost/${LDAP_HOST:-127.0.0.1}/" /etc/roundcubemail/calendar.inc.php
-
-systemctl restart cyrus-imapd postfix
diff --git a/docker/kolab/utils/06-mysql-for-kolabdev.sh b/docker/kolab/utils/06-mysql-for-kolabdev.sh
deleted file mode 100755
--- a/docker/kolab/utils/06-mysql-for-kolabdev.sh
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/bash
-
-mysql -h ${DB_HOST:-127.0.0.1} -u root --password=${DB_ROOT_PASSWORD} \
- -e "CREATE DATABASE IF NOT EXISTS ${DB_HKCCP_DATABASE};"
-
-mysql -h ${DB_HOST:-127.0.0.1} -u root --password=${DB_ROOT_PASSWORD} \
- -e "GRANT ALL PRIVILEGES ON ${DB_HKCCP_DATABASE}.* TO '${DB_HKCCP_USERNAME}'@'%' IDENTIFIED BY '${DB_HKCCP_PASSWORD}';"
-
-mysql -h ${DB_HOST:-127.0.0.1} -u root --password=${DB_ROOT_PASSWORD} \
- -e "FLUSH PRIVILEGES;"
-
diff --git a/docker/kolab/utils/07-adjust-base-dns.sh b/docker/kolab/utils/07-adjust-base-dns.sh
deleted file mode 100755
--- a/docker/kolab/utils/07-adjust-base-dns.sh
+++ /dev/null
@@ -1,31 +0,0 @@
-#!/bin/bash
-
-. ./settings.sh
-
-echo "ldap_domain_base_dn: ${domain_base_dn}" >> /etc/imapd.conf
-
-sed -i -r \
- -e "s/^ldap_base: .*$/ldap_base: ${hosted_domain_rootdn}/g" \
- /etc/imapd.conf
-
-sed -i -r \
- -e "s/(\s+)base => '.*',$/\1base => '${hosted_domain_rootdn}',/g" \
- -e "/\\\$mydomain = / a\
-\$myhostname = '${HOSTNAME:-kolab}.${DOMAIN:-mgmt.com}';" \
- -e "s/^base_dn = .*$/base_dn = ${hosted_domain_rootdn}/g" \
- -e "s/^search_base = .*$/search_base = ${hosted_domain_rootdn}/g" \
- -e "s/(\s+)'base_dn'(\s+)=> '.*',/\1'base_dn'\2=> '${hosted_domain_rootdn}',/g" \
- -e "s/(\s+)'search_base_dn'(\s+)=> '.*',/\1'search_base_dn'\2=> '${hosted_domain_rootdn}',/g" \
- -e "s/(\s+)'user_specific'(\s+)=> false,/\1'user_specific'\2=> true,/g" \
- /etc/amavisd/amavisd.conf \
- /etc/kolab-freebusy/config.ini \
- /etc/postfix/ldap/*.cf \
- /etc/roundcubemail/config.inc.php \
- /etc/roundcubemail/calendar.inc.php \
- /etc/roundcubemail/kolab_auth.inc.php
-
-sed -i -r \
- -e "s/^search_base = .*$/search_base = ${domain_base_dn}/g" \
- /etc/postfix/ldap/mydestination.cf
-
-systemctl restart cyrus-imapd postfix
diff --git a/docker/kolab/utils/08-disable-amavisd.sh b/docker/kolab/utils/08-disable-amavisd.sh
deleted file mode 100755
--- a/docker/kolab/utils/08-disable-amavisd.sh
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/bash
-
-postconf -e content_filter='smtp-wallace:[127.0.0.1]:10026'
-
-systemctl restart postfix
-
-systemctl stop amavisd
-systemctl disable amavisd
-
-systemctl stop clamd@amavisd
-systemctl disable clamd@amavisd
diff --git a/docker/kolab/utils/12-create-hosted-kolab-service.sh b/docker/kolab/utils/12-create-hosted-kolab-service.sh
deleted file mode 100755
--- a/docker/kolab/utils/12-create-hosted-kolab-service.sh
+++ /dev/null
@@ -1,17 +0,0 @@
-#!/bin/bash
-
-. ./settings.sh
-
-(
- echo "dn: uid=hosted-kolab-service,ou=Special Users,${rootdn}"
- echo "objectclass: top"
- echo "objectclass: inetorgperson"
- echo "objectclass: person"
- echo "uid: hosted-kolab-service"
- echo "cn: Hosted Kolab Service Account"
- echo "sn: Service Account"
- echo "givenname: Hosted Kolab"
- echo "userpassword: ${hosted_kolab_service_pw}"
- echo ""
-) | ldapadd -x -h ${ldap_host} -D "${ldap_binddn}" -w "${ldap_bindpw}"
-
diff --git a/docker/kolab/utils/13-create-ou-domains.sh b/docker/kolab/utils/13-create-ou-domains.sh
deleted file mode 100755
--- a/docker/kolab/utils/13-create-ou-domains.sh
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/bash
-
- . ./settings.sh
-
-(
- echo "dn: ou=Domains,${rootdn}"
- echo "ou: Domains"
- echo "objectClass: top"
- echo "objectClass: organizationalunit"
- echo ""
-) | ldapadd -x -h ${ldap_host} -D "${ldap_binddn}" -w "${ldap_bindpw}"
diff --git a/docker/kolab/utils/14-create-management-domain.sh b/docker/kolab/utils/14-create-management-domain.sh
deleted file mode 100755
--- a/docker/kolab/utils/14-create-management-domain.sh
+++ /dev/null
@@ -1,15 +0,0 @@
-#!/bin/bash
-
-. ./settings.sh
-
-(
- echo "dn: associateddomain=${domain},${domain_base_dn}"
- echo "aci: (targetattr = \"*\")(version 3.0;acl \"Deny Rest\";deny (all)(userdn != \"ldap:///uid=kolab-service,ou=Special Users,${rootdn} || ldap:///${rootdn}??sub?(objectclass=*)\");)"
- echo "aci: (targetattr = \"*\")(version 3.0;acl \"Deny Hosted Kolab\";deny (all)(userdn = \"ldap:///uid=hosted-kolab-service,ou=Special Users,${rootdn}\");)"
- echo "inetDomainStatus: active"
- echo "objectClass: top"
- echo "objectClass: domainrelatedobject"
- echo "objectClass: inetdomain"
- echo "associatedDomain: ${domain}"
- echo ""
-) | ldapadd -x -h ${ldap_host} -D "${ldap_binddn}" -w "${ldap_bindpw}"
diff --git a/docker/kolab/utils/15-create-hosted-domain.sh b/docker/kolab/utils/15-create-hosted-domain.sh
deleted file mode 100755
--- a/docker/kolab/utils/15-create-hosted-domain.sh
+++ /dev/null
@@ -1,116 +0,0 @@
-#!/bin/bash
-
-. ./settings.sh
-
- (
- echo "dn: associateddomain=${hosted_domain},${domain_base_dn}"
- echo "objectclass: top"
- echo "objectclass: domainrelatedobject"
- echo "objectclass: inetdomain"
- echo "inetdomainstatus: active"
- echo "associateddomain: ${hosted_domain}"
- echo "inetdomainbasedn: ${hosted_domain_rootdn}"
- echo ""
- ) | ldapadd -x -h ${ldap_host} -D "${ldap_binddn}" -w "${ldap_bindpw}"
-
- (
- echo "dn: cn=$(echo ${hosted_domain} | sed -e 's/\./_/g'),cn=ldbm database,cn=plugins,cn=config"
- echo "objectClass: top"
- echo "objectClass: extensibleobject"
- echo "objectClass: nsbackendinstance"
- echo "cn: $(echo ${hosted_domain} | sed -e 's/\./_/g')"
- echo "nsslapd-suffix: ${hosted_domain_rootdn}"
- echo "nsslapd-cachesize: -1"
- echo "nsslapd-cachememsize: 10485760"
- echo "nsslapd-readonly: off"
- echo "nsslapd-require-index: off"
- echo "nsslapd-directory: /var/lib/dirsrv/slapd-${DS_INSTANCE_NAME:-$(hostname -s)}/db/$(echo ${hosted_domain} | sed -e 's/\./_/g')"
- echo "nsslapd-dncachememsize: 10485760"
- echo ""
- ) | ldapadd -x -h ${ldap_host} -D "${ldap_binddn}" -w "${ldap_bindpw}"
-
-(
- #On centos7
- #echo "dn: cn=$(echo ${hosted_domain_rootdn} | sed -e 's/=/\\3D/g' -e 's/,/\\2D/g'),cn=mapping tree,cn=config"
- #On centos8
- echo "dn: cn=\"${hosted_domain_rootdn}\",cn=mapping tree,cn=config"
- echo "objectClass: top"
- echo "objectClass: extensibleObject"
- echo "objectClass: nsMappingTree"
- echo "nsslapd-state: backend"
- echo "cn: ${hosted_domain_rootdn}"
- echo "nsslapd-backend: $(echo ${hosted_domain} | sed -e 's/\./_/g')"
- echo ""
-) | ldapadd -x -h ${ldap_host} -D "${ldap_binddn}" -w "${ldap_bindpw}"
-
-(
- echo "dn: ${hosted_domain_rootdn}"
- echo "aci: (targetattr=\"carLicense || description || displayName || facsimileTelephoneNumber || homePhone || homePostalAddress || initials || jpegPhoto || labeledURI || mobile || pager || photo || postOfficeBox || postalAddress || postalCode || preferredDeliveryMethod || preferredLanguage || registeredAddress || roomNumber || secretary || seeAlso || st || street || telephoneNumber || telexNumber || title || userCertificate || userPassword || userSMIMECertificate || x500UniqueIdentifier\")(version 3.0; acl \"Enable self write for common attributes\"; allow (write) userdn=\"ldap:///self\";)"
- echo "aci: (targetattr =\"*\")(version 3.0;acl \"Directory Administrators Group\";allow (all) (groupdn=\"ldap:///cn=Directory Administrators,${hosted_domain_rootdn}\" or roledn=\"ldap:///cn=kolab-admin,${hosted_domain_rootdn}\");)"
- echo "aci: (targetattr=\"*\")(version 3.0; acl \"Configuration Administrators Group\"; allow (all) groupdn=\"ldap:///cn=Configuration Administrators,ou=Groups,ou=TopologyManagement,o=NetscapeRoot\";)"
- echo "aci: (targetattr=\"*\")(version 3.0; acl \"Configuration Administrator\"; allow (all) userdn=\"ldap:///uid=admin,ou=Administrators,ou=TopologyManagement,o=NetscapeRoot\";)"
- echo "aci: (targetattr = \"*\")(version 3.0; acl \"SIE Group\"; allow (all) groupdn = \"ldap:///cn=slapd-$(hostname -s),cn=389 Directory Server,cn=Server Group,cn=$(hostname -f),ou=${domain},o=NetscapeRoot\";)"
- echo "aci: (targetattr = \"*\") (version 3.0;acl \"Search Access\";allow (read,compare,search)(userdn = \"ldap:///${hosted_domain_rootdn}??sub?(objectclass=*)\");)"
- echo "aci: (targetattr = \"*\") (version 3.0;acl \"Service Search Access\";allow (read,compare,search)(userdn = \"ldap:///uid=kolab-service,ou=Special Users,${rootdn}\");)"
- echo "objectClass: top"
- echo "objectClass: domain"
- echo "dc: $(echo ${hosted_domain} | cut -d'.' -f 1)"
- echo ""
-) | ldapadd -x -h ${ldap_host} -D "${ldap_binddn}" -w "${ldap_bindpw}"
-
-(
- for role in "2fa-user" "activesync-user" "imap-user"; do
- echo "dn: cn=${role},${hosted_domain_rootdn}"
- echo "cn: ${role}"
- echo "description: ${role} role"
- echo "objectclass: top"
- echo "objectclass: ldapsubentry"
- echo "objectclass: nsmanagedroledefinition"
- echo "objectclass: nsroledefinition"
- echo "objectclass: nssimpleroledefinition"
- echo ""
- done
-
- echo "dn: ou=Groups,${hosted_domain_rootdn}"
- echo "ou: Groups"
- echo "objectClass: top"
- echo "objectClass: organizationalunit"
- echo ""
-
- echo "dn: ou=People,${hosted_domain_rootdn}"
- echo "aci: (targetattr = \"*\") (version 3.0;acl \"Hosted Kolab Services\";allow (all)(userdn = \"ldap:///uid=hosted-kolab-service,ou=Special Users,${rootdn}\");)"
- echo "ou: People"
- echo "objectClass: top"
- echo "objectClass: organizationalunit"
- echo ""
-
- echo "dn: ou=Special Users,${hosted_domain_rootdn}"
- echo "ou: Special Users"
- echo "objectClass: top"
- echo "objectClass: organizationalunit"
- echo ""
-
- echo "dn: ou=Resources,${hosted_domain_rootdn}"
- echo "ou: Resources"
- echo "objectClass: top"
- echo "objectClass: organizationalunit"
- echo ""
-
- echo "dn: ou=Shared Folders,${hosted_domain_rootdn}"
- echo "ou: Shared Folders"
- echo "objectClass: top"
- echo "objectClass: organizationalunit"
- echo ""
-
- echo "dn: uid=cyrus-admin,ou=Special Users,${hosted_domain_rootdn}"
- echo "sn: Administrator"
- echo "uid: cyrus-admin"
- echo "objectClass: top"
- echo "objectClass: person"
- echo "objectClass: inetorgperson"
- echo "objectClass: organizationalperson"
- echo "givenName: Cyrus"
- echo "cn: Cyrus Administrator"
- echo ""
-
-) | ldapadd -x -h ${ldap_host} -D "${ldap_binddn}" -w "${ldap_bindpw}"
diff --git a/docker/kolab/utils/16-remove-cn-kolab-cn-config.sh b/docker/kolab/utils/16-remove-cn-kolab-cn-config.sh
deleted file mode 100755
--- a/docker/kolab/utils/16-remove-cn-kolab-cn-config.sh
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/bin/bash
-
-. ./settings.sh
-
-(
- echo "associateddomain=${domain},cn=kolab,cn=config"
- echo "cn=kolab,cn=config"
-) | ldapdelete -x -h ${ldap_host} -D "${ldap_binddn}" -w "${ldap_bindpw}" -c
diff --git a/docker/kolab/utils/17-remove-hosted-service-access-from-mgmt-domain.sh b/docker/kolab/utils/17-remove-hosted-service-access-from-mgmt-domain.sh
deleted file mode 100755
--- a/docker/kolab/utils/17-remove-hosted-service-access-from-mgmt-domain.sh
+++ /dev/null
@@ -1,12 +0,0 @@
-#!/bin/bash
-
-. ./settings.sh
-
-(
- echo "dn: associateddomain=${domain},ou=Domains,${rootdn}"
- echo "changetype: modify"
- echo "replace: aci"
- echo "aci: (targetattr = \"*\")(version 3.0;acl \"Deny Rest\";deny (all)(userdn != \"ldap:///uid=kolab-service,ou=Special Users,${rootdn} || ldap:///${rootdn}??sub?(objectclass=*)\");)"
- echo "aci: (targetattr = \"*\")(version 3.0;acl \"Deny Hosted Kolab\";deny (all)(userdn = \"ldap:///uid=hosted-kolab-service,ou=Special Users,${rootdn}\");)"
- echo ""
-) | ldapmodify -x -h ${ldap_host} -D "${ldap_binddn}" -w "${ldap_bindpw}"
diff --git a/docker/kolab/utils/18-adjust-kolab-conf.sh b/docker/kolab/utils/18-adjust-kolab-conf.sh
deleted file mode 100755
--- a/docker/kolab/utils/18-adjust-kolab-conf.sh
+++ /dev/null
@@ -1,31 +0,0 @@
-#!/bin/bash
-
-. ./settings.sh
-
-sed -r -i \
- -e "s/^base_dn.*$/base_dn = ${rootdn}/g" \
- -e "s/^domain_base_dn.*$/domain_base_dn = ${domain_base_dn}/g" \
- -e "s/^user_base_dn.*$/user_base_dn = ${hosted_domain_rootdn}/g" \
- -e "s/^kolab_user_base_dn.*$/kolab_user_base_dn = ${hosted_domain_rootdn}/g" \
- -e "s/^group_base_dn.*$/group_base_dn = ${hosted_domain_rootdn}/g" \
- -e "s/^sharedfolder_base_dn.*$/sharedfolder_base_dn = ${hosted_domain_rootdn}/g" \
- -e "s/^resource_base_dn.*$/resource_base_dn = ${hosted_domain_rootdn}/g" \
- -e '/^primary_mail/ a\
-daemon_rcpt_policy = False' \
- -e '/^primary_mail/d' \
- -e '/secondary_mail/,+10d' \
- -e '/autocreate_folders/,+77d' \
- -e "/^\[kolab_wap\]/ a\
-mgmt_root_dn = ${rootdn}" \
- -e "/^\[kolab_wap\]/ a\
-hosted_root_dn = ${hosted_domain_rootdn}" \
- -e "/^\[kolab_wap\]/ a\
-api_url = http://127.0.0.1:9080/kolab-webadmin/api" \
- -e 's/^auth_attributes.*$/auth_attributes = mail, uid/g' \
- -e 's|^uri = imaps.*$|uri = imaps://127.0.0.1:11993|g' \
- -e "/^\[wallace\]/ a\
-webmail_url = https://%(domain)s/roundcubemail" \
- /etc/kolab/kolab.conf
-
-systemctl restart kolabd
-systemctl restart kolab-saslauthd
diff --git a/docker/kolab/utils/19-turn-on-vlv-in-roundcube.sh b/docker/kolab/utils/19-turn-on-vlv-in-roundcube.sh
deleted file mode 100755
--- a/docker/kolab/utils/19-turn-on-vlv-in-roundcube.sh
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/bin/bash
-
-sed -i -r \
- -e "s/'vlv'(\s+)=> false,/'vlv'\1=> true,/g" \
- -e "s/'vlv_search'(\s+)=> false,/'vlv_search'\1=> true,/g" \
- -e "s/inetOrgPerson/inetorgperson/g" \
- -e "s/kolabInetOrgPerson/inetorgperson/g" \
- /etc/roundcubemail/*.inc.php
diff --git a/docker/kolab/utils/20-add-alias-attribute-index.sh b/docker/kolab/utils/20-add-alias-attribute-index.sh
deleted file mode 100755
--- a/docker/kolab/utils/20-add-alias-attribute-index.sh
+++ /dev/null
@@ -1,55 +0,0 @@
-#!/bin/bash
-
-. ./settings.sh
-
-export index_attr=alias
-
-(
- echo "dn: cn=${index_attr},cn=index,cn=${hosted_domain_db},cn=ldbm database,cn=plugins,cn=config"
- echo "objectclass: top"
- echo "objectclass: nsindex"
- echo "cn: ${index_attr}"
- echo "nsSystemIndex: false"
- echo "nsindextype: pres"
- echo "nsindextype: eq"
- echo "nsindextype: sub"
-
-) | ldapadd -x -h ${ldap_host} -D "${ldap_binddn}" -w "${ldap_bindpw}" -c
-
-
-(
- echo "dn: cn=${hosted_domain_db} ${index_attr} index,cn=index,cn=tasks,cn=config"
- echo "objectclass: top"
- echo "objectclass: extensibleObject"
- echo "cn: ${hosted_domain_db} ${index_attr} index"
- echo "nsinstance: ${hosted_domain_db}"
- echo "nsIndexAttribute: ${index_attr}:pres"
- echo "nsIndexAttribute: ${index_attr}:eq"
- echo "nsIndexAttribute: ${index_attr}:sub"
- echo ""
-) | ldapadd -x -h ${ldap_host} -D "${ldap_binddn}" -w "${ldap_bindpw}" -c
-
-ldap_complete=0
-
-while [ ${ldap_complete} -ne 1 ]; do
- result=$(
- ldapsearch \
- -x \
- -h ${ldap_host} \
- -D "${ldap_binddn}" \
- -w "${ldap_bindpw}" \
- -c \
- -LLL \
- -b "cn=${hosted_domain_db} ${index_attr} index,cn=index,cn=tasks,cn=config" \
- '(!(nstaskexitcode=0))' \
- -s base 2>/dev/null
- )
- if [ -z "$result" ]; then
- ldap_complete=1
- echo ""
- else
- echo -n "."
- sleep 1
- fi
-done
-
diff --git a/docker/kolab/utils/21-adjust-postfix-config.sh b/docker/kolab/utils/21-adjust-postfix-config.sh
deleted file mode 100755
--- a/docker/kolab/utils/21-adjust-postfix-config.sh
+++ /dev/null
@@ -1,26 +0,0 @@
-#!/bin/bash
-
-# new: (inetdomainstatus:1.2.840.113556.1.4.803:=1)
-# active: (inetdomainstatus:1.2.840.113556.1.4.803:=2)
-# suspended: (inetdomainstatus:1.2.840.113556.1.4.803:=4)
-# deleted: (inetdomainstatus:1.2.840.113556.1.4.803:=8)
-# confirmed: (inetdomainstatus:1.2.840.113556.1.4.803:=16)
-# verified: (inetdomainstatus:1.2.840.113556.1.4.803:=32)
-# ready: (inetdomainstatus:1.2.840.113556.1.4.803:=64)
-
-sed -i -r \
- -e 's/^query_filter.*$/query_filter = (\&(associatedDomain=%s)(inetdomainstatus:1.2.840.113556.1.4.803:=18)(!(inetdomainstatus:1.2.840.113556.1.4.803:=4)))/g' \
- /etc/postfix/ldap/mydestination.cf
-
-# new: (inetuserstatus:1.2.840.113556.1.4.803:=1)
-# active: (inetuserstatus:1.2.840.113556.1.4.803:=2)
-# suspended: (inetuserstatus:1.2.840.113556.1.4.803:=4)
-# deleted: (inetuserstatus:1.2.840.113556.1.4.803:=8)
-# ldapready: (inetuserstatus:1.2.840.113556.1.4.803:=16)
-# imapready: (inetuserstatus:1.2.840.113556.1.4.803:=32)
-
-sed -i -r \
- -e 's/^query_filter.*$/query_filter = (\&(|(mail=%s)(alias=%s))(|(objectclass=kolabinetorgperson)(|(objectclass=kolabgroupofuniquenames)(objectclass=kolabgroupofurls))(|(|(objectclass=groupofuniquenames)(objectclass=groupofurls))(objectclass=kolabsharedfolder))(objectclass=kolabsharedfolder))(!(inetuserstatus:1.2.840.113556.1.4.803:=4)))/g' \
- /etc/postfix/ldap/local_recipient_maps.cf
-
-systemctl restart postfix
diff --git a/docker/kolab/utils/22-create-resource.sh b/docker/kolab/utils/22-create-resource.sh
deleted file mode 100755
--- a/docker/kolab/utils/22-create-resource.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/bin/bash
-
- . ./settings.sh
-
-(
- echo "dn: cn=TestResource,ou=Resources,ou=kolab.org,${hosted_domain_rootdn}"
- echo "cn: TestResource"
- echo "owner: uid=jack@kolab.org,ou=People,ou=kolab.org,${hosted_domain_rootdn}"
- echo "kolabTargetFolder: shared/Resources/TestResource@kolab.org"
- echo "mail: resource-confroom-testresource@kolab.org"
- echo "objectClass: top"
- echo "objectClass: kolabsharedfolder"
- echo "objectClass: kolabresource"
- echo "objectClass: mailrecipient"
- echo "kolabFolderType: event"
- echo "kolabInvitationPolicy: ACT_STORE_AND_NOTIFY"
- echo ""
-) | ldapadd -x -h ${ldap_host} -D "${ldap_binddn}" -w "${ldap_bindpw}"
diff --git a/docker/kolab/utils/24-roundcubeconfig.sh b/docker/kolab/utils/24-roundcubeconfig.sh
deleted file mode 100755
--- a/docker/kolab/utils/24-roundcubeconfig.sh
+++ /dev/null
@@ -1,39 +0,0 @@
-#!/bin/bash
-
-sed -i -r -e "s|$config\['kolab_files_url'\] = .*$|$config['kolab_files_url'] = 'https://' \. \$_SERVER['HTTP_HOST'] . '/chwala/';|g" /etc/roundcubemail/kolab_files.inc.php
-
-sed -i -r -e "s|$config\['kolab_invitation_calendars'\] = .*$|$config['kolab_invitation_calendars'] = true;|g" /etc/roundcubemail/calendar.inc.php
-
-sed -i -r -e "/^.*'contextmenu',$/a 'enigma'," /etc/roundcubemail/config.inc.php
-
-sed -i -r -e "s|$config\['enigma_passwordless'\] = .*$|$config['enigma_passwordless'] = true;|g" /etc/roundcubemail/enigma.inc.php
-sed -i -r -e "s|$config\['enigma_multihost'\] = .*$|$config['enigma_multihost'] = true;|g" /etc/roundcubemail/enigma.inc.php
-
-echo "\$config['enigma_woat'] = true;" >> /etc/roundcubemail/enigma.inc.php
-
-# Run it over haproxy then nginx for 2fa. We need to use startls because otherwise the proxy protocol doesn't work.
-sed -i -r -e "s|$config\['default_host'\] = .*$|$config['default_host'] = 'tls://127.0.0.1';|g" /etc/roundcubemail/config.inc.php
-sed -i -r -e "s|$config\['default_port'\] = .*$|$config['default_port'] = 145;|g" /etc/roundcubemail/config.inc.php
-
-# So we can just append
-sed -i "s/?>//g" /etc/roundcubemail/config.inc.php
-
-# Enable the PROXY protocol
-cat << EOF >> /etc/roundcubemail/config.inc.php
- \$config['imap_conn_options'] = Array(
- 'ssl' => Array(
- 'verify_peer_name' => false,
- 'verify_peer' => false,
- 'allow_self_signed' => true
- ),
- 'proxy_protocol' => 2
- );
- \$config['proxy_whitelist'] = array('127.0.0.1');
-EOF
-
-echo "?>" >> /etc/roundcubemail/config.inc.php
-
-
-# Send dns queries over powerdns
-rm -f /etc/resolv.conf
-echo "nameserver 127.0.0.1:9953" > /etc/resolv.conf
diff --git a/docker/kolab/utils/settings.sh b/docker/kolab/utils/settings.sh
--- a/docker/kolab/utils/settings.sh
+++ b/docker/kolab/utils/settings.sh
@@ -3,13 +3,13 @@
export rootdn=${LDAP_ADMIN_ROOT_DN:-"dc=mgmt,dc=com"}
export domain=${DOMAIN:-"mgmt.com"}
export domain_db=${DOMAIN_DB:-"mgmt_com"}
-export ldap_host=${LDAP_HOST:-"127.0.0.1"}
+export ldap_host=${LDAP_HOST}
export ldap_binddn=${LDAP_ADMIN_BIND_DN:-"cn=Directory Manager"}
export ldap_bindpw=${LDAP_ADMIN_BIND_PW:-"Welcome2KolabSystems"}
export cyrus_admin=${IMAP_ADMIN_LOGIN:-"cyrus-admin"}
-export imap_host=${IMAP_HOST:-"127.0.0.1"}
+export imap_host=${IMAP_HOST}
export cyrus_admin_pw=${IMAP_ADMIN_PASSWORD:-"Welcome2KolabSystems"}
export kolab_service_pw=${LDAP_SERVICE_BIND_PW:-"Welcome2KolabSystems"}
diff --git a/docker/mariadb/mysql-init/80-add-users.sh b/docker/mariadb/mysql-init/80-add-users.sh
deleted file mode 100644
--- a/docker/mariadb/mysql-init/80-add-users.sh
+++ /dev/null
@@ -1,29 +0,0 @@
-create_arbitrary_users() {
-
- # Do not care what option is compulsory here, just create what is specified
- log_info "Creating user specified by (${2}) ..."
-mysql $mysql_flags <<EOSQL
- CREATE USER '${2}'@'${4}' IDENTIFIED BY '${3}';
-EOSQL
-
- log_info "Granting privileges to user ${2} for ${1} ..."
-mysql $mysql_flags <<EOSQL
- GRANT ALL ON \`${1}\`.* TO '${2}'@'${4}' ;
- FLUSH PRIVILEGES ;
-EOSQL
-}
-
-DB_NO=1
-while [[ ${DB_NO} -ne 0 ]]; do
- DB_CUR="DB_${DB_NO}"
- if [[ -n $(eval echo '${!'${DB_CUR}'*}') ]]; then
- NAME="${DB_CUR}_NAME"
- USER="${DB_CUR}_USER"
- PASS="${DB_CUR}_PASS"
- HOST="${DB_CUR}_HOST"
- create_arbitrary_users ${!NAME} ${!USER} ${!PASS:-Welcome2KolabSystems} ${!HOST:-127.0.0.1} || true
- let "DB_NO+=1"
- else
- DB_NO=0
- fi
-done
diff --git a/docker/mariadb/mysql-init/81-update-root-user.sh b/docker/mariadb/mysql-init/81-update-root-user.sh
deleted file mode 100644
--- a/docker/mariadb/mysql-init/81-update-root-user.sh
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/bin/bash
-
-if [ ! -v ${MYSQL_ROOT_PASSWORD} ]; then
- log_info "Update root user for host 127.0.0.1 ..."
-mysql $mysql_flags <<EOSQL
- UPDATE mysql.user SET Password = PASSWORD('${MYSQL_ROOT_PASSWORD}') WHERE User = 'root' AND Host = '127.0.0.1';
- FLUSH PRIVILEGES;
-EOSQL
-fi
-
diff --git a/docker/mariadb/mysql-init/setup.sh b/docker/mariadb/mysql-init/setup.sh
new file mode 100755
--- /dev/null
+++ b/docker/mariadb/mysql-init/setup.sh
@@ -0,0 +1,79 @@
+#!/bin/bash
+
+MYSQL_PWD=$MARIADB_ROOT_PASSWORD mysql --protocol=socket -uroot -hlocalhost --socket="/run/mysqld/mysqld.sock" << EOF
+CREATE DATABASE IF NOT EXISTS ${DB_HKCCP_DATABASE};
+CREATE USER '${DB_HKCCP_USERNAME}'@'%' IDENTIFIED BY '${DB_HKCCP_PASSWORD}';
+GRANT ALL PRIVILEGES ON ${DB_HKCCP_DATABASE}.* TO '${DB_HKCCP_USERNAME}'@'%' IDENTIFIED BY '${DB_HKCCP_PASSWORD}';
+FLUSH PRIVILEGES;
+EOF
+
+# Powerdns setup according to https://github.com/PowerDNS/pdns/blob/master/modules/gmysqlbackend/schema.mysql.sql
+# Required for the first boot, afterwards the laravel migration will take over.
+# This is only required so pdns can start cleanly, indexes etc are handled by the laravel migration.
+MYSQL_PWD=$MARIADB_ROOT_PASSWORD mysql --protocol=socket -uroot -hlocalhost --socket="/run/mysqld/mysqld.sock" ${DB_HKCCP_DATABASE} << EOF
+CREATE TABLE powerdns_domains (
+ id INT AUTO_INCREMENT,
+ name VARCHAR(255) NOT NULL,
+ master VARCHAR(128) DEFAULT NULL,
+ last_check INT DEFAULT NULL,
+ type VARCHAR(8) NOT NULL,
+ notified_serial INT UNSIGNED DEFAULT NULL,
+ account VARCHAR(40) CHARACTER SET 'utf8' DEFAULT NULL,
+ options VARCHAR(64000) DEFAULT NULL,
+ catalog VARCHAR(255) DEFAULT NULL,
+ PRIMARY KEY (id)
+) Engine=InnoDB CHARACTER SET 'latin1';
+
+CREATE TABLE powerdns_records (
+ id BIGINT AUTO_INCREMENT,
+ domain_id INT DEFAULT NULL,
+ name VARCHAR(255) DEFAULT NULL,
+ type VARCHAR(10) DEFAULT NULL,
+ content VARCHAR(64000) DEFAULT NULL,
+ ttl INT DEFAULT NULL,
+ prio INT DEFAULT NULL,
+ disabled TINYINT(1) DEFAULT 0,
+ ordername VARCHAR(255) BINARY DEFAULT NULL,
+ auth TINYINT(1) DEFAULT 1,
+ PRIMARY KEY (id)
+) Engine=InnoDB CHARACTER SET 'latin1';
+
+CREATE TABLE powerdns_masters (
+ ip VARCHAR(64) NOT NULL,
+ nameserver VARCHAR(255) NOT NULL,
+ account VARCHAR(40) CHARACTER SET 'utf8' NOT NULL,
+ PRIMARY KEY (ip, nameserver)
+) Engine=InnoDB CHARACTER SET 'latin1';
+
+CREATE TABLE powerdns_comments (
+ id INT AUTO_INCREMENT,
+ domain_id INT NOT NULL,
+ name VARCHAR(255) NOT NULL,
+ type VARCHAR(10) NOT NULL,
+ modified_at INT NOT NULL,
+ account VARCHAR(40) CHARACTER SET 'utf8' DEFAULT NULL,
+ comment TEXT CHARACTER SET 'utf8' NOT NULL,
+ PRIMARY KEY (id)
+) Engine=InnoDB CHARACTER SET 'latin1';
+
+
+CREATE TABLE powerdns_cryptokeys (
+ id INT AUTO_INCREMENT,
+ domain_id INT NOT NULL,
+ flags INT NOT NULL,
+ active BOOL,
+ published BOOL DEFAULT 1,
+ content TEXT,
+ PRIMARY KEY(id)
+) Engine=InnoDB CHARACTER SET 'latin1';
+
+
+CREATE TABLE powerdns_tsigkeys (
+ id INT AUTO_INCREMENT,
+ name VARCHAR(255),
+ algorithm VARCHAR(50),
+ secret VARCHAR(255),
+ PRIMARY KEY (id)
+) Engine=InnoDB CHARACTER SET 'latin1';
+
+EOF
diff --git a/docker/pdns/Dockerfile b/docker/pdns/Dockerfile
--- a/docker/pdns/Dockerfile
+++ b/docker/pdns/Dockerfile
@@ -6,9 +6,9 @@
RUN dnf -y install \
--setopt 'tsflags=nodocs' \
bind-utils \
- cronie \
iproute \
iptables \
+ iputils \
net-tools \
pdns \
pdns-backend-mysql \
@@ -23,7 +23,7 @@
COPY pdns.conf /etc/pdns/pdns.conf
COPY recursor.conf /etc/pdns-recursor/recursor.conf
-RUN systemctl enable pdns && systemctl enable pdns-recursor
+RUN systemctl disable systemd-resolved && systemctl enable pdns && systemctl enable pdns-recursor
# This is how we could run pdns without systemd
# ENV PDNS_guardian=yes \
@@ -34,4 +34,4 @@
# CMD ["/usr/sbin/pdns_server", "--guardian=no", "--daemon=no", "--disable-syslog", "--log-timestamp=no", "--write-pid=no"]
CMD ["/lib/systemd/systemd", "--system"]
-EXPOSE 9953 9953/udp
+EXPOSE 53 53/udp
diff --git a/docker/pdns/pdns.conf b/docker/pdns/pdns.conf
--- a/docker/pdns/pdns.conf
+++ b/docker/pdns/pdns.conf
@@ -2,11 +2,11 @@
log-dns-details
query-logging=yes
-local-address=127.0.0.1:5300, [::1]:5300
+local-address=127.0.0.1:5300
edns-subnet-processing
-gmysql-host=127.0.0.1
+gmysql-host=mariadb
gmysql-dbname=kolabdev
gmysql-password=kolab
gmysql-user=kolabdev
diff --git a/docker/pdns/recursor.conf b/docker/pdns/recursor.conf
--- a/docker/pdns/recursor.conf
+++ b/docker/pdns/recursor.conf
@@ -1,4 +1,6 @@
-local-address=127.0.0.1
-local-port=9953
+local-address=0.0.0.0
+local-port=53
allow-from=0.0.0.0/0
forward-zones=_woat.kolab.org=127.0.0.1:5300
+# Forward everything else to the docker resolver, so we can still resolve other containers when using pdns
+forward-zones-recurse=.=127.0.0.11
diff --git a/docker/proxy/Dockerfile b/docker/proxy/Dockerfile
--- a/docker/proxy/Dockerfile
+++ b/docker/proxy/Dockerfile
@@ -26,4 +26,4 @@
CMD ["nginx", "-g", "daemon off;"]
-EXPOSE 80/tcp 443/tcp 110/tcp 143/tcp 993/tcp 995/tcp
+EXPOSE 80/tcp 443/tcp 465/tcp 587/tcp 143/tcp 144/tcp 993/tcp
diff --git a/docker/proxy/rootfs/etc/nginx/nginx.conf b/docker/proxy/rootfs/etc/nginx/nginx.conf
--- a/docker/proxy/rootfs/etc/nginx/nginx.conf
+++ b/docker/proxy/rootfs/etc/nginx/nginx.conf
@@ -55,7 +55,7 @@
include /etc/nginx/default.d/*.conf;
location / {
- proxy_pass http://127.0.0.1:8000;
+ proxy_pass http://webapp:8000;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
@@ -69,7 +69,7 @@
}
location /meetmedia {
- proxy_pass https://127.0.0.1:12443;
+ proxy_pass https://meet:12443;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
@@ -77,7 +77,7 @@
}
location /meetmedia/api {
- proxy_pass https://127.0.0.1:12443;
+ proxy_pass https://meet:12443;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
@@ -89,7 +89,7 @@
}
location /roundcubemail {
- proxy_pass http://127.0.0.1:9080;
+ proxy_pass http://kolab:9080;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
@@ -101,7 +101,7 @@
}
location /kolab-webadmin {
- proxy_pass http://127.0.0.1:9080;
+ proxy_pass http://kolab:9080;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
@@ -116,7 +116,7 @@
auth_request /auth;
#auth_request_set $auth_status $upstream_status;
- proxy_pass http://127.0.0.1:9080;
+ proxy_pass http://kolab:9080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
@@ -127,7 +127,7 @@
}
location ~* ^/\\.well-known/(caldav|carddav) {
- proxy_pass http://127.0.0.1:9080;
+ proxy_pass http://kolab:9080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
@@ -137,7 +137,7 @@
auth_request /auth;
#auth_request_set $auth_status $upstream_status;
- proxy_pass http://127.0.0.1:9080;
+ proxy_pass http://kolab:9080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
@@ -145,7 +145,7 @@
location = /auth {
internal;
- proxy_pass http://127.0.0.1:8000/api/webhooks/nginx-httpauth;
+ proxy_pass http://webapp:8000/api/webhooks/nginx-httpauth;
proxy_pass_request_body off;
proxy_set_header Host services.APP_WEBSITE_DOMAIN;
proxy_set_header Content-Length "";
@@ -169,7 +169,7 @@
mail {
server_name imap.hosted.com;
- auth_http 127.0.0.1:8000/api/webhooks/nginx;
+ auth_http webapp:8000/api/webhooks/nginx;
auth_http_header Host services.APP_WEBSITE_DOMAIN;
proxy_pass_error_message on;
@@ -193,7 +193,7 @@
listen 144 proxy_protocol;
protocol imap;
- auth_http 127.0.0.1:8000/api/webhooks/nginx-roundcube;
+ auth_http webapp:8000/api/webhooks/nginx-roundcube;
proxy on;
starttls on;
diff --git a/docker/redis/Dockerfile b/docker/redis/Dockerfile
--- a/docker/redis/Dockerfile
+++ b/docker/redis/Dockerfile
@@ -1,7 +1,6 @@
-FROM fedora:34
+FROM fedora:35
ENV container docker
-ENV SYSTEMD_PAGER=''
RUN dnf -y install \
--setopt 'tsflags=nodocs' \
@@ -12,16 +11,15 @@
net-tools \
procps-ng \
redis \
- suricata \
vim-enhanced \
wget \
which && \
dnf clean all
-COPY redis.conf /etc/redis.conf
-
-RUN systemctl enable redis
+COPY redis.conf /etc/redis/redis.conf
WORKDIR /root/
-CMD ["/usr/bin/redis-server"]
+CMD ["/usr/bin/redis-server", "/etc/redis/redis.conf"]
+
+EXPOSE 6379/tcp
diff --git a/docker/redis/redis.conf b/docker/redis/redis.conf
--- a/docker/redis/redis.conf
+++ b/docker/redis/redis.conf
@@ -61,7 +61,7 @@
# Examples:
#
# bind 192.168.1.100 10.0.0.1
-bind 127.0.0.1
+#bind 127.0.0.1
# Specify the path for the Unix socket that will be used to listen for
# incoming connections. There is no default, so Redis will not listen
@@ -825,3 +825,6 @@
# in order to commit the file to the disk more incrementally and avoid
# big latency spikes.
aof-rewrite-incremental-fsync yes
+
+# We need to connect over non-localhost
+protected-mode no
diff --git a/docker/webapp/init.sh b/docker/webapp/init.sh
--- a/docker/webapp/init.sh
+++ b/docker/webapp/init.sh
@@ -24,11 +24,6 @@
PASSPORT_PUBLIC_KEY="$(cat storage/oauth-public.key)"
EOF
-if rpm -qv chromium 2>/dev/null; then
- chver=$(rpmquery --queryformat="%{VERSION}" chromium | awk -F'.' '{print $1}')
- ./artisan dusk:chrome-driver ${chver}
-fi
-
if [ ! -f 'resources/countries.php' ]; then
./artisan data:countries
fi
diff --git a/src/.env.example b/src/.env.example
--- a/src/.env.example
+++ b/src/.env.example
@@ -2,11 +2,11 @@
APP_ENV=local
APP_KEY=
APP_DEBUG=true
-APP_URL=http://127.0.0.1:8000
+APP_URL=https://kolab.local
#APP_PASSPHRASE=
-APP_PUBLIC_URL=
-APP_DOMAIN=kolabnow.com
-APP_WEBSITE_DOMAIN=kolabnow.com
+APP_PUBLIC_URL=https://kolab.local
+APP_DOMAIN=kolab.local
+APP_WEBSITE_DOMAIN=kolab.local
APP_THEME=default
APP_TENANT_ID=5
APP_LOCALE=en
@@ -23,9 +23,9 @@
SIGNUP_LIMIT_EMAIL=0
SIGNUP_LIMIT_IP=0
-ASSET_URL=http://127.0.0.1:8000
+ASSET_URL=https://kolab.local
-WEBMAIL_URL=/apps
+WEBMAIL_URL=/roundcubemail/
SUPPORT_URL=/support
SUPPORT_EMAIL=
@@ -36,7 +36,7 @@
DB_CONNECTION=mysql
DB_DATABASE=kolabdev
-DB_HOST=127.0.0.1
+DB_HOST=mariadb
DB_PASSWORD=kolab
DB_PORT=3306
DB_USERNAME=kolabdev
@@ -51,12 +51,13 @@
OPENEXCHANGERATES_API_KEY="from openexchangerates.org"
-MFA_DSN=mysql://roundcube:Welcome2KolabSystems@127.0.0.1/roundcube
+MFA_DSN=mysql://roundcube:Welcome2KolabSystems@mariadb/roundcube
MFA_TOTP_DIGITS=6
MFA_TOTP_INTERVAL=30
MFA_TOTP_DIGEST=sha1
-IMAP_URI=ssl://127.0.0.1:11993
+IMAP_URI=ssl://kolab:11993
+IMAP_HOST=172.18.0.5
IMAP_ADMIN_LOGIN=cyrus-admin
IMAP_ADMIN_PASSWORD=Welcome2KolabSystems
IMAP_VERIFY_HOST=false
@@ -64,7 +65,7 @@
LDAP_BASE_DN="dc=mgmt,dc=com"
LDAP_DOMAIN_BASE_DN="ou=Domains,dc=mgmt,dc=com"
-LDAP_HOSTS=127.0.0.1
+LDAP_HOSTS=kolab
LDAP_PORT=389
LDAP_SERVICE_BIND_DN="uid=kolab-service,ou=Special Users,dc=mgmt,dc=com"
LDAP_SERVICE_BIND_PW="Welcome2KolabSystems"
@@ -81,22 +82,24 @@
LDAP_HOSTED_BIND_PW="Welcome2KolabSystems"
LDAP_HOSTED_ROOT_DN="dc=hosted,dc=com"
-COTURN_PUBLIC_IP=127.0.0.1
+COTURN_PUBLIC_IP='172.18.0.1'
COTURN_STATIC_SECRET="Welcome2KolabSystems"
MEET_WEBHOOK_TOKEN=Welcome2KolabSystems
MEET_SERVER_TOKEN=Welcome2KolabSystems
-MEET_SERVER_URLS=https://localhost:12443/meetmedia/api/
-MEET_SERVER_VERIFY_TLS=true
+MEET_SERVER_URLS=https://kolab.local/meetmedia/api/
+MEET_SERVER_VERIFY_TLS=false
-MEET_WEBRTC_LISTEN_IP=
-MEET_PUBLIC_DOMAIN=127.0.0.1:12443
-MEET_TURN_SERVER='turn:127.0.0.1:3478?transport=tcp'
+MEET_WEBRTC_LISTEN_IP='172.18.0.1'
+MEET_PUBLIC_DOMAIN=kolab.local
+MEET_TURN_SERVER='turn:172.18.0.1:3478'
+MEET_LISTENING_HOST=172.18.0.1
-PGP_ENABLED=
-PGP_BINARY=
-PGP_AGENT=
-PGP_GPGCONF=
+
+PGP_ENABLE=true
+PGP_BINARY=/usr/bin/gpg
+PGP_AGENT=/usr/bin/gpg-agent
+PGP_GPGCONF=/usr/bin/gpgconf
PGP_LENGTH=
# Set these to IP addresses you serve WOAT with.
@@ -104,7 +107,7 @@
WOAT_NS1=ns01.domain.tld
WOAT_NS2=ns02.domain.tld
-REDIS_HOST=127.0.0.1
+REDIS_HOST=redis
REDIS_PASSWORD=null
REDIS_PORT=6379
@@ -117,6 +120,7 @@
STRIPE_PUBLIC_KEY=
STRIPE_WEBHOOK_SECRET=
+MAIL_DRIVER=log
MAIL_MAILER=smtp
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525
@@ -179,13 +183,5 @@
KOLAB_SSL_CERTIFICATE_FULLCHAIN=/etc/pki/tls/certs/kolab.hosted.com.chain.pem
KOLAB_SSL_CERTIFICATE_KEY=/etc/pki/tls/certs/kolab.hosted.com.key
-PROXY_SSL_CERTIFICATE=/etc/pki/tls/certs/imap.hosted.com.cert
-PROXY_SSL_CERTIFICATE_KEY=/etc/pki/tls/certs/imap.hosted.com.key
-
-NGINX_SSL_CERTIFICATE=/etc/pki/tls/certs/imap.hosted.com.cert
-NGINX_SSL_CERTIFICATE_KEY=/etc/pki/tls/certs/imap.hosted.com.key
-
-PGP_ENABLE=true
-PGP_BINARY=/usr/bin/gpg
-PGP_AGENT=/usr/bin/gpg-agent
-PGP_GPGCONF=/usr/bin/gpgconf
+PROXY_SSL_CERTIFICATE=/etc/certs/imap.hosted.com.cert
+PROXY_SSL_CERTIFICATE_KEY=/etc/certs/imap.hosted.com.key
diff --git a/src/config/imap.php b/src/config/imap.php
--- a/src/config/imap.php
+++ b/src/config/imap.php
@@ -1,12 +1,12 @@
<?php
return [
- 'uri' => env('IMAP_URI', '127.0.0.1'),
+ 'uri' => env('IMAP_URI', 'ssl://kolab:11993'),
'admin_login' => env('IMAP_ADMIN_LOGIN', 'cyrus-admin'),
'admin_password' => env('IMAP_ADMIN_PASSWORD', null),
'verify_peer' => env('IMAP_VERIFY_PEER', true),
'verify_host' => env('IMAP_VERIFY_HOST', true),
- 'host' => env('IMAP_HOST', '127.0.0.1'),
+ 'host' => env('IMAP_HOST', '172.18.0.5'),
'imap_port' => env('IMAP_PORT', 12143),
'guam_port' => env('IMAP_GUAM_PORT', 9143),
];
diff --git a/src/config/smtp.php b/src/config/smtp.php
--- a/src/config/smtp.php
+++ b/src/config/smtp.php
@@ -1,6 +1,6 @@
<?php
return [
- 'host' => env('SMTP_HOST', '127.0.0.1'),
+ 'host' => env('SMTP_HOST', '172.18.0.5'),
'port' => env('SMTP_PORT', 10465),
];
diff --git a/src/database/migrations/2020_06_04_115409_create_powerdns_tables.php b/src/database/migrations/2020_06_04_115409_create_powerdns_tables.php
--- a/src/database/migrations/2020_06_04_115409_create_powerdns_tables.php
+++ b/src/database/migrations/2020_06_04_115409_create_powerdns_tables.php
@@ -14,6 +14,15 @@
*/
public function up()
{
+ //Drop the tables from the mysql initialization
+ Schema::dropIfExists('powerdns_domains');
+ Schema::dropIfExists('powerdns_records');
+ Schema::dropIfExists('powerdns_masters');
+ Schema::dropIfExists('powerdns_comments');
+ Schema::dropIfExists('powerdns_domain_settings');
+ Schema::dropIfExists('powerdns_cryptokeys');
+ Schema::dropIfExists('powerdns_tsigkeys');
+
Schema::create(
'powerdns_domains',
function (Blueprint $table) {
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Mon, Mar 30, 11:27 AM (1 w, 1 d ago)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
18806217
Default Alt Text
D3845.1774870030.diff (96 KB)
Attached To
Mode
D3845: Persistency for mariadb, ldap, imap & bridged networking
Attached
Detach File
Event Timeline