Files
opencloud/devtools/deployments/opencloud_full/stalwart.yml

115 lines
3.7 KiB
YAML

---
services:
traefik:
networks:
opencloud-net:
aliases:
- ${STALWART_DOMAIN:-stalwart.opencloud.test}
stalwart:
image: ghcr.io/stalwartlabs/stalwart:v0.16.8-alpine
hostname: ${STALWART_DOMAIN:-stalwart.opencloud.test}
networks:
- opencloud-net
ports:
- "127.0.0.1:8443:443"
- "127.0.0.1:8080:8080"
- "127.0.0.1:143:143"
- "127.0.0.1:993:993"
- "127.0.0.1:1465:465"
volumes:
- ./config/stalwart/config.json:/etc/stalwart/config.json
- stalwart-data:/var/lib/stalwart
environment:
STALWART_RECOVERY_ADMIN: "admin:secret"
STALWART_PUBLIC_URL: "https://${STALWART_DOMAIN:-stalwart.opencloud.test}"
labels:
- "traefik.enable=true"
- "traefik.http.routers.stalwart.entrypoints=https"
- "traefik.http.routers.stalwart.rule=Host(`${STALWART_DOMAIN:-stalwart.opencloud.test}`)"
- "traefik.http.routers.stalwart.tls.certresolver=http"
- "traefik.http.routers.stalwart.service=stalwart"
- "traefik.http.services.stalwart.loadbalancer.server.port=8080"
logging:
driver: ${LOG_DRIVER:-local}
restart: unless-stopped
entrypoint: ["/bin/sh", "-c"]
command:
- |
if [ ! -f /var/lib/stalwart/.initialized ]; then
echo "Not initialized, starting in recovery mode"
STALWART_RECOVERY_MODE=1 /usr/local/bin/stalwart --config /etc/stalwart/config.json &
pid=$$!
while [ ! -f /var/lib/stalwart/.initialized ]; do sleep 1; done
echo "Initialized, stopping recovery mode"
kill -TERM $$pid
wait $$pid
fi
echo "Starting Stalwart in production mode"
exec /usr/local/bin/stalwart --config /etc/stalwart/config.json
stalwart-import:
image: stalwart-cli:latest
build:
context: ./config/stalwart/
args:
VERSION: "1.0.8"
dockerfile_inline: |
FROM alpine:latest AS downloader
ARG VERSION
RUN apk add --no-cache curl tar xz
RUN arch=$(apk --print-arch) && \
mkdir /cli && \
curl --proto '=https' --tlsv1.2 -LsSf \
https://github.com/stalwartlabs/cli/releases/download/v$${VERSION}/stalwart-cli-$${arch}-unknown-linux-musl.tar.xz \
| tar xJf - --strip-components=1 -C /cli
FROM scratch
COPY --from=downloader /cli/stalwart-cli /stalwart-cli
CMD ["/stalwart-cli"]
networks:
- opencloud-net
volumes:
- ./config/stalwart/${STALWART_AUTH_DIRECTORY:-idmldap}.json:/snapshot.json:ro
- stalwart-data:/var/lib/stalwart
environment:
STALWART_URL: "http://stalwart:8080"
STALWART_USER: "admin"
STALWART_PASSWORD: "secret"
entrypoint: ["/bin/sh", "-c"]
command:
- |
if [ -f /var/lib/stalwart/.initialized ]; then
echo "Already initialized, skipping stalwart-cli."
exit 0
fi
echo "Waiting for the Stalwart recovery API to become live"
until wget -qO- $$STALWART_URL/healthz/live >/dev/null 2>&1; do sleep 1; done
echo "Applying configuration"
/stalwart-cli --debug apply --file /snapshot.json
touch /var/lib/stalwart/.initialized
echo "Successfully initialized"
stdin_open: true
tty: true
depends_on:
- stalwart
stalwart-reset:
image: alpine:latest
profiles:
- maintenance
volumes:
- stalwart-data:/var/lib/stalwart
entrypoint: ["/bin/sh", "-c"]
command:
- |
if [ -f /var/lib/stalwart/.initialized ]; then
rm -f /var/lib/stalwart/.initialized
echo "Success: Lockfile removed. Next time 'stalwart' boots, it will run in recovery mode."
fi
volumes:
stalwart-data: