commit ea4cf732e8d8fda97a66b3872bb8a4246d6dbbcb Author: Tero Date: Mon Sep 14 18:58:01 2026 +0300 first commit diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..85a89a8 --- /dev/null +++ b/.env.example @@ -0,0 +1,31 @@ +# Copy this file to .env and fill in real values. Never commit the real .env file. + +# Project / container naming +PROJECT_NAME=eternitymail + +# Mail server hostname and domain +MAIL_HOSTNAME=mail.eternityproject.fi +MAIL_DOMAIN=eternityproject.fi + +# Host paths for persistent data +DATA_ROOT=/opt/eternitymail + +# Stalwart port bindings +STALWART_SMTP_PORT=25 +STALWART_SUBMISSION_PORT=587 +STALWART_IMAPS_PORT=993 +STALWART_ADMIN_BIND=127.0.0.1 +STALWART_ADMIN_PORT=8081 + +# Roundcube port bindings +ROUNDCUBE_BIND=127.0.0.1 +ROUNDCUBE_PORT=8091 + +# Roundcube database +RC_DB_NAME=roundcube +RC_DB_USER=roundcube +RC_DB_PASSWORD=changeme +RC_DB_ROOT_PASSWORD=changeme + +# Roundcube DES key (24 chars, used to encrypt stored IMAP passwords) +RC_DES_KEY=changeme_24_char_key!!! diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4c49bd7 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.env diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..b5351ef --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,107 @@ +services: + stalwart: + image: stalwartlabs/stalwart:v0.16@sha256:93c574e52249c1ebf90061da2c4c0756a7b72abfcc1fec34506a03c2e38b5977 + container_name: ${PROJECT_NAME:-eternitymail}-stalwart + restart: unless-stopped + + security_opt: + - no-new-privileges:true + + cap_drop: + - ALL + + cap_add: + - NET_BIND_SERVICE + + ports: + - "${STALWART_SMTP_PORT:-25}:25/tcp" + - "${STALWART_SUBMISSION_PORT:-587}:587/tcp" + - "${STALWART_IMAPS_PORT:-993}:993/tcp" + - "${STALWART_ADMIN_BIND:-127.0.0.1}:${STALWART_ADMIN_PORT:-8081}:8080/tcp" + + volumes: + - ${DATA_ROOT:-/opt/eternitymail}/stalwart/etc:/etc/stalwart + - ${DATA_ROOT:-/opt/eternitymail}/stalwart/data:/var/lib/stalwart + - ${DATA_ROOT:-/opt/eternitymail}/stalwart/certs:/etc/stalwart/certs:ro + + networks: + eternitymail: + aliases: + - ${MAIL_HOSTNAME} + + + roundcube-db: + image: mariadb:11.8-noble@sha256:2d2f4095530294735a857cfe22bb101e19b0849b416911c796ec4aa81b164a62 + container_name: ${PROJECT_NAME:-eternitymail}-roundcube-db + restart: unless-stopped + + security_opt: + - no-new-privileges:true + + environment: + MARIADB_DATABASE: ${RC_DB_NAME:-roundcube} + MARIADB_USER: ${RC_DB_USER:-roundcube} + MARIADB_PASSWORD: ${RC_DB_PASSWORD} + MARIADB_ROOT_PASSWORD: ${RC_DB_ROOT_PASSWORD} + + volumes: + - ${DATA_ROOT:-/opt/eternitymail}/roundcube-db:/var/lib/mysql + + networks: + - eternitymail + + healthcheck: + test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"] + interval: 10s + timeout: 5s + retries: 10 + start_period: 20s + + + roundcube: + image: roundcube/roundcubemail:1.7.4-apache@sha256:8a4f88846145c6c8801654d9c3b330071e162f0110b64d08af8e94aca50ffb89 + container_name: ${PROJECT_NAME:-eternitymail}-roundcube + restart: unless-stopped + + security_opt: + - no-new-privileges:true + + depends_on: + roundcube-db: + condition: service_healthy + + ports: + - "${ROUNDCUBE_BIND:-127.0.0.1}:${ROUNDCUBE_PORT:-8091}:80" + + volumes: + - ${DATA_ROOT:-/opt/eternitymail}/roundcube-config:/var/roundcube/config:ro + + environment: + ROUNDCUBEMAIL_DB_TYPE: mysql + ROUNDCUBEMAIL_DB_HOST: roundcube-db + ROUNDCUBEMAIL_DB_PORT: 3306 + ROUNDCUBEMAIL_DB_NAME: ${RC_DB_NAME:-roundcube} + ROUNDCUBEMAIL_DB_USER: ${RC_DB_USER:-roundcube} + ROUNDCUBEMAIL_DB_PASSWORD: ${RC_DB_PASSWORD} + + ROUNDCUBEMAIL_DES_KEY: ${RC_DES_KEY} + + ROUNDCUBEMAIL_DEFAULT_HOST: ssl://${MAIL_HOSTNAME} + ROUNDCUBEMAIL_DEFAULT_PORT: 993 + + ROUNDCUBEMAIL_SMTP_SERVER: tls://${MAIL_HOSTNAME} + ROUNDCUBEMAIL_SMTP_PORT: 587 + + ROUNDCUBEMAIL_USERNAME_DOMAIN: ${MAIL_DOMAIN} + + ROUNDCUBEMAIL_SKIN: elastic + ROUNDCUBEMAIL_PLUGINS: archive,zipdownload,newmail_notifier + ROUNDCUBEMAIL_UPLOAD_MAX_FILESIZE: 50M + + networks: + - eternitymail + + +networks: + eternitymail: + name: ${PROJECT_NAME:-eternitymail} \ No newline at end of file