Compare commits

..
Author SHA1 Message Date
notplants d59ce5ff3a fix: restore Mailu SQLite database in place
continuous-integration/drone/tag Build is passing
2026-11-02 18:19:56 +00:00
autonomic-bot fb245e26cd chore: upgrade redis to 8.10.3-alpine 2026-10-30 04:48:18 +00:00
autonomic-bot 5ad2ca6552 chore: upgrade redis to 8.10.3-alpine; add sqlite restore hook 2026-10-30 04:40:28 +00:00
autonomic-bot b018431cda chore: upgrade redis to 8.10.3-alpine 2026-10-30 04:25:35 +00:00
ammaratef45 78421d9c5a release 4.0.0+2024.06.67
continuous-integration/drone/tag Build is passing
2026-10-23 18:45:57 -07:00
ammaratef45 5b6328b68f chore: update image tags 2026-10-23 18:39:10 -07:00
ammaratef45 77659e75c3 add backup support 2026-10-23 18:37:30 -07:00
kawaiipunk ebe01e00cc chore: publish 3.2.1+2024.06.66 release
continuous-integration/drone/tag Build is passing
2026-10-22 16:36:00 +01:00
kawaiipunk 73787fef14 Merge pull request 'chore(deps): update ghcr.io/mailu/postfix docker tag to v2024.06.66' (#23) from renovate/ghcr.io-mailu-postfix-2024.x into main
Reviewed-on: #23
2026-10-22 15:29:47 +00:00
kawaiipunk c029f4e65a Merge pull request 'chore(deps): update ghcr.io/mailu/nginx docker tag to v2024.06.66' (#22) from renovate/ghcr.io-mailu-nginx-2024.x into main
Reviewed-on: #22
2026-10-22 15:29:40 +00:00
kawaiipunk 6d2bdf5303 Merge pull request 'chore(deps): update ghcr.io/mailu/dovecot docker tag to v2024.06.66' (#20) from renovate/ghcr.io-mailu-dovecot-2024.x into main
Reviewed-on: #20
2026-10-22 15:29:32 +00:00
kawaiipunk 5042e50f55 Merge pull request 'chore(deps): update ghcr.io/mailu/rspamd docker tag to v2024.06.66' (#24) from renovate/ghcr.io-mailu-rspamd-2024.x into main
Reviewed-on: #24
2026-10-22 15:29:23 +00:00
kawaiipunk 789a9d0f42 Merge pull request 'chore(deps): update ghcr.io/mailu/admin docker tag to v2024.06.66' (#19) from renovate/ghcr.io-mailu-admin-2024.x into main
Reviewed-on: #19
2026-10-22 15:29:09 +00:00
kawaiipunk 19afffd8cd chore: publish 3.2.0+2024.06.61 release
continuous-integration/drone/tag Build is passing
2026-10-22 16:14:31 +01:00
kawaiipunk 95b096c442 Merge pull request 'chore(deps): update ghcr.io/mailu/webmail docker tag to v2024.06.66' (#25) from renovate/ghcr.io-mailu-webmail-2024.x into main
Reviewed-on: #25
Reviewed-by: KawaiiPunk <5+kawaiipunk@noreply.git.coopcloud.tech>

This includes a mitigation for php2shell
2026-10-22 15:13:38 +00:00
renovate-bot 88f6f0b876 chore(deps): update ghcr.io/mailu/webmail docker tag to v2024.06.66 2026-10-22 14:15:50 +00:00
renovate-bot 872e098bb9 chore(deps): update ghcr.io/mailu/rspamd docker tag to v2024.06.66 2026-10-22 14:15:46 +00:00
renovate-bot 57fadc2ea4 chore(deps): update ghcr.io/mailu/postfix docker tag to v2024.06.66 2026-10-22 14:15:44 +00:00
renovate-bot 0f5ee292df chore(deps): update ghcr.io/mailu/nginx docker tag to v2024.06.66 2026-10-22 14:15:41 +00:00
renovate-bot 74e8c1a3cc chore(deps): update ghcr.io/mailu/dovecot docker tag to v2024.06.66 2026-10-22 14:15:39 +00:00
renovate-bot 2b721698b0 chore(deps): update ghcr.io/mailu/admin docker tag to v2024.06.66 2026-10-22 14:15:36 +00:00
renovate-bot bdaab88f08 Add renovate.json 2026-10-22 11:06:58 +00:00
autonomic-bot 69afb8706b chore: upgrade mailu to 2024.06.64 2026-10-16 03:12:25 +00:00
notplants 89f88ce384 chore: publish 3.1.5+2024.06.61 release
continuous-integration/drone/tag Build is passing
2026-10-05 13:07:23 -04:00
autonomic-bot b244c2d855 chore: upgrade to 2024.06.61 (mailu) 2026-10-02 03:08:51 +00:00
autonomic-bot 302dfd23b7 chore: upgrade to 2024.06.60 (mailu + redis 8.10.2-alpine) 2026-09-28 21:18:06 +00:00
trav d31aa15791 chore: publish 3.1.4+2024.06.58 release
continuous-integration/drone/tag Build is passing
2026-08-24 12:42:11 -04:00
trav ec37f16553 Merge pull request 'Upgrade ee4e727' (#18) from upgrade-ee4e727 into main
Reviewed-on: #18
2026-08-24 16:41:40 +00:00
autonomic-bot 6edc435e32 chore: upgrade mailu to 2024.06.58, redis to 8.10.1-alpine 2026-08-21 03:21:11 +00:00
autonomic-bot ee4e7270c8 chore: upgrade mailu to 2024.06.58 2026-08-15 19:53:40 +00:00
notplants c75df76fa6 chore: publish 3.1.3+2024.06.57 release
continuous-integration/drone/tag Build is passing
2026-08-10 12:34:24 -04:00
notplants 0b33e79f1e Merge pull request 'chore: upgrade mailu to 2024.06.57, redis to 8.10.0-alpine' (#17) from upgrade-e19297a into main
Reviewed-on: #17
2026-08-10 16:33:51 +00:00
recipe-upgrade-bot e19297ab07 chore: upgrade mailu to 2024.06.57, redis to 8.10.0-alpine 2026-08-04 01:23:31 +00:00
notplants b1761be669 chore: publish 3.1.2+2024.06.55 release
continuous-integration/drone/tag Build is passing
2026-08-03 16:40:48 -04:00
notplants 68c5c8be4d Merge pull request 'upgrade mailu to 2024.06.55' (#16) from upgrade-e7f4b8d into main
Reviewed-on: #16
2026-08-03 20:40:21 +00:00
autonomic-bot 164736e6fe chore: upgrade mailu to 2024.06.55 2026-07-24 09:20:13 +00:00
autonomic-bot 6b3b891b98 chore: upgrade mailu to 2024.06.54 2026-07-13 23:09:47 +00:00
autonomic-bot e7f4b8d86d chore: upgrade mailu to 2024.06.53 2026-07-04 04:33:47 +00:00
trav 75da49770d chore: publish 3.1.1+2024.06.52 release
continuous-integration/drone/tag Build is passing
2026-06-22 15:27:36 -04:00
trav dff19033f6 Merge pull request 'upgrade-3.2.0+2024.06.52' (#15) from upgrade-3.2.0+2024.06.52 into main
Reviewed-on: #15
2026-06-22 19:26:53 +00:00
autonomic-bot 2e4a082408 chore: upgrade traefik-certs-dumper to v2.11.4 2026-06-19 03:12:56 +00:00
autonomic-bot 682ccaaa2d chore: upgrade to 3.2.0+2024.06.52 2026-06-12 03:49:28 +00:00
trav d5939e433b Merge pull request 'chore: bump recipe version to 3.1.0+2024.06.52' (#14) from upgrade-3.1.0+2024.06.52 into main
Reviewed-on: #14
2026-06-09 16:50:25 +00:00
notplants c5bb97fa6b chore: bump recipe version to 3.1.0+2024.06.52
continuous-integration/drone/tag Build is passing
Corrective semver bump. 3.0.1+2024.06.52 was published reusing the 3.0.1
recipe semver from the previous release (3.0.1+2024.06.37); per the recipe
semver convention the recipe version must bump when the image version changes.
Minor bump (no breaking changes / no required operator action).
2026-06-09 12:48:18 -04:00
trav 90154fdd84 Merge pull request 'upgrade-3.0.1+2024.06.52' (#13) from upgrade-3.0.1+2024.06.52 into main
Reviewed-on: #13
2026-06-09 16:29:08 +00:00
autonomic-bot 05995e7855 fix: use redis 8.0.6 (stay on 8.0.x patch series)
continuous-integration/drone/tag Build is passing
2026-06-05 03:07:40 +00:00
autonomic-bot 37491ade51 chore: upgrade to 3.0.1+2024.06.52 2026-06-02 04:22:48 +00:00
3wordchant 23309a1a80 chore: publish 3.0.1+2024.06.37 release
continuous-integration/drone/tag Build is passing
2025-07-26 21:26:49 +01:00
3wordchant 86f63e65c3 chore: publish 3.0.0+2024.06.27 release
continuous-integration/drone/tag Build is passing
2025-01-15 12:43:34 -05:00
3wordchant 60f0f8ba73 Revert "wip: experimental fetchmail support"
This reverts commit 1437715364.
2025-01-15 12:37:38 -05:00
3wordchant 7b5a6979f2 Add PORTS setting, to reënable STARTTLS 2025-01-15 12:33:58 -05:00
cas f95b2e687d Update .drone.yml 2025-01-08 10:09:13 -08:00
knoflook 1437715364 wip: experimental fetchmail support 2025-01-08 10:01:45 -08:00
3wordchant a0b1794920 chore: publish 2.0.0+2024.06.27 release
continuous-integration/drone/tag Build is failing
2025-01-08 12:41:48 -05:00
3wordchant 21868cf5e9 Update to latest Mailu 2025-01-08 12:41:02 -05:00
3wordchant e471ec6fd8 chore: publish 1.1.1+2.0.41 release
continuous-integration/drone/tag Build is passing
2024-05-11 13:02:05 -03:00
12 changed files with 131 additions and 32 deletions
+1 -1
View File
@@ -10,7 +10,7 @@ steps:
from_secret: drone_abra-bot_token from_secret: drone_abra-bot_token
fork: true fork: true
repositories: repositories:
- coop-cloud/auto-recipes-catalogue-json - toolshed/auto-recipes-catalogue-json
trigger: trigger:
event: tag event: tag
+7 -4
View File
@@ -31,6 +31,9 @@ TRAEFIK_STACK_NAME=traefik_example_com
# OPTIONAL SETTINGS # # OPTIONAL SETTINGS #
############################################################################### ###############################################################################
# Uncomment this to reënable STARTTLS, although beware the health warnings here: https://nostarttls.secvuln.info/
#PORTS=25,80,443,465,993,995,4190,110,143,587
# Name of the instance, displayed in the web UI # Name of the instance, displayed in the web UI
SITENAME=mymail SITENAME=mymail
@@ -85,8 +88,6 @@ RELAYHOST=
# Enable fetchmail # Enable fetchmail
FETCHMAIL_ENABLED=False FETCHMAIL_ENABLED=False
#COMPOSE_FILE="$COMPOSE_FILE:compose.fetchmail.yml"
#FETCHMAIL_ENABLED=True
# Fetchmail delay # Fetchmail delay
FETCHMAIL_DELAY=600 FETCHMAIL_DELAY=600
@@ -118,7 +119,7 @@ COMPRESSION_LEVEL=
# Mailman settings # Mailman settings
# NOTE(3wc): remember to also set RELAYNETS # NOTE(3wc): remember to also set RELAYNETS
#COMPOSE_FILE="$COMPOSE_FILE:compose.mailman.yml" #COMPOSE_FILE="compose.yml:compose.mailman.yml"
#MAILMAN_POSTFIX_OVERRIDES=1 #MAILMAN_POSTFIX_OVERRIDES=1
#MAILMAN_CORE_VOLUME=lists_example_com_mailman-core #MAILMAN_CORE_VOLUME=lists_example_com_mailman-core
#MAILMAN_CORE_NETWORK=lists_example_com_internal #MAILMAN_CORE_NETWORK=lists_example_com_internal
@@ -128,7 +129,7 @@ COMPRESSION_LEVEL=
# return-path: https://www.rubydoc.info/gems/actionmailer-rack-upgrade-2/2.3.15/ActionMailer/Base # return-path: https://www.rubydoc.info/gems/actionmailer-rack-upgrade-2/2.3.15/ActionMailer/Base
# logins and MAIL FROM ownership: http://www.postfix.com/postconf.5.html#smtpd_relay_restrictions # logins and MAIL FROM ownership: http://www.postfix.com/postconf.5.html#smtpd_relay_restrictions
# there is an open ticket with a further discussion also https://github.com/Mailu/Mailu/issues/1096 # there is an open ticket with a further discussion also https://github.com/Mailu/Mailu/issues/1096
#COMPOSE_FILE="$COMPOSE_FILE:compose.senderlogins.yml" #COMPOSE_FILE="compose.yml:compose.senderlogins.yml"
#SENDER_LOGINS_POSTFIX_OVERRIDES=1 #SENDER_LOGINS_POSTFIX_OVERRIDES=1
SECRET_SECRET_KEY_VERSION=v1 SECRET_SECRET_KEY_VERSION=v1
@@ -197,3 +198,5 @@ REJECT_UNLISTED_RECIPIENT=
# NOTE(3wc): Other values are not supported, as compose.yml does not contain # NOTE(3wc): Other values are not supported, as compose.yml does not contain
# configuration for them. Pull requests welcome! # configuration for them. Pull requests welcome!
DB_FLAVOR=sqlite DB_FLAVOR=sqlite
ENABLE_BACKUPS=true
+20 -3
View File
@@ -4,10 +4,10 @@ Coöp Cloud + [Mailu][Mailu] = 🥳
<!-- metadata --> <!-- metadata -->
* **Category**: Apps * **Category**: Apps
* **Status**: 1, alpha * **Status**: 2, beta
* **Image**: [`mailu/*`](https://hub.docker.com/r/mailu/), 4, upstream * **Image**: [`mailu/*`](https://hub.docker.com/r/mailu/), 4, upstream
* **Healthcheck**: No * **Healthcheck**: No
* **Backups**: No * **Backups**: Yes
* **Email**: N/A * **Email**: N/A
* **Tests**: No * **Tests**: No
* **SSO**: No * **SSO**: No
@@ -25,11 +25,28 @@ host.
4. `abra app config YOURAPPDOMAIN` - be sure to change `$WEB_DOMAIN` to something that resolves to 4. `abra app config YOURAPPDOMAIN` - be sure to change `$WEB_DOMAIN` to something that resolves to
your Docker swarm box your Docker swarm box
5. `abra app deploy YOURAPPDOMAIN` 5. `abra app deploy YOURAPPDOMAIN`
9. Create initial user: 6. Create initial user:
``` ```
abra app run YOURDOMAIN admin flask mailu admin admin YOURDOMAIN YOURPASSWORD abra app run YOURDOMAIN admin flask mailu admin admin YOURDOMAIN YOURPASSWORD
``` ```
## Upgrading the recipe
**NOTE** This section is only intended for [recipe maintainers][maintainers]
Minor/patch updates usually work OK with `abra recipe upgrade` and friends.
For major updates:
1. Go to https://setup.mailu.io/ and generate a new config
2. Download the new config and compare it to `compose.yml`. Pay attention to:
- New / removed services
- Added/removed config options
- Changes to networking
3. Test upgrading from the previous version to the new version
4. `abra recipe sync` / `abra recipe release` as normal
[Mailu]: https://mailu.io/ [Mailu]: https://mailu.io/
[abra]: https://git.autonomic.zone/autonomic-cooperative/abra [abra]: https://git.autonomic.zone/autonomic-cooperative/abra
[compose-traefik]: https://git.autonomic.zone/coop-cloud/traefik [compose-traefik]: https://git.autonomic.zone/coop-cloud/traefik
[maintainers]: https://docs.coopcloud.tech/maintainers/
+2
View File
@@ -1,3 +1,5 @@
export CERTDUMPER_POST_VERSION=v1 export CERTDUMPER_POST_VERSION=v1
export POSTFIX_OVERRIDE_VERSION=v17 export POSTFIX_OVERRIDE_VERSION=v17
export SENDER_LOGIN_VERSIONS=v2 export SENDER_LOGIN_VERSIONS=v2
export BACKUP_SQLITE_VERSION=v1
export RESTORE_SQLITE_VERSION=v1
+36
View File
@@ -0,0 +1,36 @@
#!/usr/bin/env python3
import os
import sqlite3
from pathlib import Path
source_path = Path("/data/main.db")
backup_dir = Path("/data/backup")
temporary_path = backup_dir / "main.db.tmp"
backup_path = backup_dir / "main.db"
os.umask(0o077)
backup_dir.mkdir(mode=0o700, parents=True, exist_ok=True)
temporary_path.unlink(missing_ok=True)
try:
# Read-only mode prevents silently creating an empty source database.
source = sqlite3.connect(
f"{source_path.as_uri()}?mode=ro",
uri=True,
timeout=60,
)
destination = sqlite3.connect(temporary_path)
try:
source.backup(destination, pages=256, sleep=0.1)
result = destination.execute("PRAGMA integrity_check").fetchall()
if result != [("ok",)]:
raise RuntimeError(f"SQLite integrity check failed: {result}")
finally:
destination.close()
source.close()
# Only publish a fully written, verified snapshot.
os.replace(temporary_path, backup_path)
print(f"SQLite backup ready: {backup_path}", flush=True)
except Exception:
temporary_path.unlink(missing_ok=True)
raise
-14
View File
@@ -1,14 +0,0 @@
services:
fetchmail:
image: ghcr.io/mailu/fetchmail:2.0.34
environment: *default-env
volumes:
- "fetchmail:/data"
depends_on:
- app
networks:
- default
volumes:
fetchmail:
+32 -10
View File
@@ -18,7 +18,6 @@ x-environment:
- DMARC_RUF - DMARC_RUF
- DOCKER_CONTEXT - DOCKER_CONTEXT
- DOMAIN - DOMAIN
- FETCHMAIL_ENABLED
- FETCHMAIL_DELAY - FETCHMAIL_DELAY
- FULL_TEXT_SEARCH - FULL_TEXT_SEARCH
- HOSTNAMES - HOSTNAMES
@@ -52,10 +51,11 @@ x-environment:
- WELCOME_BODY - WELCOME_BODY
- WELCOME_SUBJECT - WELCOME_SUBJECT
- TZ - TZ
- PORTS
services: services:
app: app:
image: ghcr.io/mailu/nginx:2.0.34 image: ghcr.io/mailu/nginx:2024.06.67
logging: logging:
driver: json-file driver: json-file
networks: networks:
@@ -96,15 +96,18 @@ services:
- "traefik.http.routers.${STACK_NAME}.rule=Host(`${DOMAIN}`)" - "traefik.http.routers.${STACK_NAME}.rule=Host(`${DOMAIN}`)"
- "traefik.http.routers.${STACK_NAME}.tls.certresolver=${LETS_ENCRYPT_ENV}" - "traefik.http.routers.${STACK_NAME}.tls.certresolver=${LETS_ENCRYPT_ENV}"
- "traefik.http.routers.${STACK_NAME}.entrypoints=web-secure" - "traefik.http.routers.${STACK_NAME}.entrypoints=web-secure"
- "coop-cloud.${STACK_NAME}.version=1.1.0+2.0.34" - "coop-cloud.${STACK_NAME}.version=4.0.1+2024.06.67"
- "backupbot.backup=${ENABLE_BACKUPS:-true}"
- "backupbot.backup.volumes.traefik_letsencrypt=false"
- "backupbot.backup.volumes.mailu.path=backup"
db: db:
image: redis:7.2.3-alpine image: redis:8.10.3-alpine
volumes: volumes:
- "redis:/data" - "redis:/data"
admin: admin:
image: ghcr.io/mailu/admin:2.0.34 image: ghcr.io/mailu/admin:2024.06.67
environment: *default-env environment: *default-env
healthcheck: healthcheck:
disable: true disable: true
@@ -115,9 +118,20 @@ services:
- "mailu:/data" - "mailu:/data"
networks: networks:
- default - default
configs:
- source: backup_sqlite
target: /usr/local/bin/backup_sqlite.py
mode: 0444
- source: restore_sqlite
target: /usr/local/bin/restore_sqlite.py
mode: 0444
deploy:
labels:
backupbot.backup.pre-hook: "python3 /usr/local/bin/backup_sqlite.py"
backupbot.restore.post-hook: "python3 /usr/local/bin/restore_sqlite.py"
imap: imap:
image: ghcr.io/mailu/dovecot:2.0.34 image: ghcr.io/mailu/dovecot:2024.06.67
environment: *default-env environment: *default-env
secrets: secrets:
- secret_key - secret_key
@@ -131,7 +145,7 @@ services:
- default - default
smtp: smtp:
image: ghcr.io/mailu/postfix:2.0.34 image: ghcr.io/mailu/postfix:2024.06.67
environment: *default-env environment: *default-env
secrets: secrets:
- secret_key - secret_key
@@ -143,7 +157,7 @@ services:
- app - app
antispam: antispam:
image: ghcr.io/mailu/rspamd:2.0.34 image: ghcr.io/mailu/rspamd:2024.06.67
environment: *default-env environment: *default-env
secrets: secrets:
- secret_key - secret_key
@@ -154,7 +168,8 @@ services:
disable: true disable: true
webmail: webmail:
image: ghcr.io/mailu/webmail:2.0.34 image: ghcr.io/mailu/webmail:2024.06.67
# entrypoint: "tail -f /dev/null"
environment: *default-env environment: *default-env
networks: networks:
- default - default
@@ -168,7 +183,7 @@ services:
disable: true disable: true
certdumper: certdumper:
image: ldez/traefik-certs-dumper:v2.8.1 image: ldez/traefik-certs-dumper:v2.11.4
entrypoint: sh -c ' entrypoint: sh -c '
apk add jq apk add jq
; while ! [ -e /traefik/${ACME_JSON} ] ; while ! [ -e /traefik/${ACME_JSON} ]
@@ -220,6 +235,13 @@ configs:
certdumper_post: certdumper_post:
name: ${STACK_NAME}_certdumper_post_${CERTDUMPER_POST_VERSION} name: ${STACK_NAME}_certdumper_post_${CERTDUMPER_POST_VERSION}
file: certdumper_post.sh file: certdumper_post.sh
backup_sqlite:
name: ${STACK_NAME}_backup_sqlite_${BACKUP_SQLITE_VERSION}
file: backup_sqlite.py
restore_sqlite:
name: ${STACK_NAME}_restore_sqlite_${RESTORE_SQLITE_VERSION}
file: restore_sqlite.py
secrets: secrets:
secret_key: secret_key:
+3
View File
@@ -0,0 +1,3 @@
ALERTA! 🚨 Mailu has dropped support for STARTTLS by default – see details here: https://mailu.io/2024.06/releases.html#starttls-ports-disabled-by-default
If you are relying on STARTTLS, e.g. SMTP port 587, please copy the example `PORTS` variable from `~/.abra/recipes/mailu/.env.example` BEFORE deploying.
+1
View File
@@ -0,0 +1 @@
Contains mitigation measures for php2shell
+1
View File
@@ -0,0 +1 @@
Actual mitigation for php2shell pending further alpine image upgrades
+6
View File
@@ -0,0 +1,6 @@
{
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
"extends": [
"config:recommended"
]
}
+22
View File
@@ -0,0 +1,22 @@
#!/usr/bin/env python3
"""Restore Mailu's SQLite snapshot without replacing the live database inode."""
import sqlite3
from pathlib import Path
backup_path = Path("/data/backup/main.db")
live_path = Path("/data/main.db")
# The source and destination must already exist. A missing snapshot or live
# database is a restore failure, not a reason to create an empty database.
with sqlite3.connect(
f"{backup_path.as_uri()}?mode=ro", uri=True, timeout=60
) as source:
if source.execute("PRAGMA integrity_check").fetchall() != [("ok",)]:
raise RuntimeError(f"Invalid SQLite snapshot: {backup_path}")
with sqlite3.connect(
f"{live_path.as_uri()}?mode=rw", uri=True, timeout=60
) as destination:
source.backup(destination, pages=256, sleep=0.1)
print(f"SQLite restore complete: {live_path}", flush=True)