fix(mailserver): Use LMDB maps instead of hash for Alpine Postfix

Alpine Linux's Postfix is compiled with LMDB support, not BerkeleyDB
hash support. This caused "Temporary lookup failure" errors on send.

Changes:
- Changed virtual_alias_maps and virtual_mailbox_maps to lmdb: prefix
- Copy resolv.conf to Postfix chroot for DNS resolution
- Added `mailctl fix-postfix` command to repair existing installations

Root cause: virtual_alias_maps was configured as hash:/etc/postfix/virtual
but the hash map type is not supported on Alpine, only lmdb.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
CyberMind-FR 2026-02-05 12:27:00 +01:00
parent 44493ebfe3
commit ae26317815
3 changed files with 46 additions and 2 deletions

View File

@ -63,6 +63,13 @@ _Last updated: 2026-02-06_
- Fix: Changed to use socat proxy at `172.17.0.1:10143` (plaintext, internal)
- Updated `mailctl webmail configure` to use proxy instead of direct SSL
- **Mail Send 451 "Temporary lookup failure"** — RESOLVED (2026-02-06)
- Root cause: Alpine Postfix uses LMDB, not BerkeleyDB hash maps
- `virtual_alias_maps = hash:/etc/postfix/virtual` was invalid
- Postfix chroot `/var/spool/postfix/etc/resolv.conf` was missing
- Fix: Changed setup.sh to use `lmdb:` prefix and copy resolv.conf to chroot
- Added `mailctl fix-postfix` command to repair existing installations
### Just Completed
- **Unified Backup Manager** — DONE (2026-02-05)

View File

@ -88,9 +88,13 @@ postconf -e 'smtpd_tls_key_file = /etc/ssl/mail/privkey.pem'
postconf -e 'smtpd_tls_security_level = may'
postconf -e 'smtp_tls_security_level = may'
postconf -e 'virtual_mailbox_domains = /etc/postfix/vdomains'
postconf -e 'virtual_mailbox_maps = hash:/etc/postfix/vmailbox'
postconf -e 'virtual_alias_maps = hash:/etc/postfix/valias'
# Alpine Postfix uses LMDB, not BerkeleyDB hash
postconf -e 'virtual_mailbox_maps = lmdb:/etc/postfix/vmailbox'
postconf -e 'virtual_alias_maps = lmdb:/etc/postfix/valias'
postconf -e 'virtual_mailbox_base = /var/mail'
# Copy resolv.conf to Postfix chroot for DNS lookups
mkdir -p /var/spool/postfix/etc
cp /etc/resolv.conf /var/spool/postfix/etc/
postconf -e 'virtual_uid_maps = static:1000'
postconf -e 'virtual_gid_maps = static:1000'
# Create vmail user

View File

@ -284,6 +284,37 @@ cmd_mesh() {
esac
}
# ============================================================================
# Fix / Repair
# ============================================================================
cmd_fix_postfix() {
local container=$(uci_get main.container)
container="${container:-mailserver}"
log "Fixing Postfix configuration..."
# Fix LMDB maps (Alpine doesn't support hash maps)
lxc-attach -n "$container" -- sh -c '
postconf -e "virtual_mailbox_maps = lmdb:/etc/postfix/vmailbox"
postconf -e "virtual_alias_maps = lmdb:/etc/postfix/virtual"
# Regenerate LMDB databases
[ -f /etc/postfix/vmailbox ] && postmap lmdb:/etc/postfix/vmailbox
[ -f /etc/postfix/virtual ] && postmap lmdb:/etc/postfix/virtual
# Fix Postfix chroot DNS resolution
mkdir -p /var/spool/postfix/etc
cp /etc/resolv.conf /var/spool/postfix/etc/
# Reload Postfix
postfix reload
'
log "Postfix configuration fixed"
log "If you still see 'Temporary lookup failure', restart the container: mailctl restart"
}
# ============================================================================
# Logs & Diagnostics
# ============================================================================
@ -509,6 +540,7 @@ Diagnostics:
logs [lines] View mail logs
test <email> Send test email
ssl-status Show SSL cert info
fix-postfix Fix LMDB maps and DNS resolution
Examples:
mailctl install
@ -540,6 +572,7 @@ case "${1:-}" in
logs) shift; cmd_logs "$@" ;;
test) shift; cmd_test "$@" ;;
report) shift; cmd_report "$@" ;;
fix-postfix) shift; cmd_fix_postfix "$@" ;;
help|--help|-h|'') show_help ;;
*) error "Unknown command: $1"; show_help >&2; exit 1 ;;
esac