# mx2.windy.me | Item | Value | |------|--------| | Role | Mail server (mailcow) | | SSH | `ssh -4 windy@mx2.windy.me` (pubkey; root denied; prefer IPv4 from WSL) | | Install path | `/opt/mail` | | Compose project | `cow` (`COMPOSE_PROJECT_NAME=cow`) | | Compose file | `/opt/mail/docker-compose.yml` | | Config | `/opt/mail/mailcow.conf` (`.env` → symlink) | | Hostname | `MAILCOW_HOSTNAME=mx2.windy.me` | | TZ | `Asia/Shanghai` | | IPv4 | `194.163.160.244` | | IPv6 | `2a02:c207:2284:8258::1` | | Docker network | `IPV4_NETWORK=172.22.1` | | UI | https://mx2.windy.me | ## Ports (host-published) `25`, `465`, `587` (SMTP), `110`/`995` (POP), `143`/`993` (IMAP), `4190` (Sieve), `80`/`443` (UI) ## Domain & mailboxes - Domain: `windy.me` (primary on this host) - MX for `windy.me`: `mx2.windy.me` (prio 20), `mx.windy.me` (prio 30) - Mailboxes (examples): `zhiqiang@windy.me`, `claw@windy.me`, `hermes@windy.me` - ACME / Let’s Encrypt enabled (`SKIP_LETS_ENCRYPT=n`); cert SAN includes `mx2`, `autoconfig`, `autodiscover` - PTR (v4/v6) → `mx2.windy.me` ## Ops notes - Manage with: `cd /opt/mail && docker compose …` - `SKIP_CLAMD=y` may still leave `clamd` running after updates; recreate if you need it truly skipped - Host has ~8G RAM, no swap; watch memory under load - Unrelated stopped containers may exist (`zc-*` monitoring stack) — not part of mailcow ## Client access (SMTP / IMAP) See [mailcow-smtp-client](../runbooks/mailcow-smtp-client.md). - Send: `mx2.windy.me:587` STARTTLS (or `:465` SSL), auth = full email + mailbox password - IMAP: `mx2.windy.me:993` · POP: `:995` - Webmail: https://mx2.windy.me ## Runbooks - [mailcow-health](../runbooks/mailcow-health.md) - [mailcow-update](../runbooks/mailcow-update.md) - [mailcow-smtp-client](../runbooks/mailcow-smtp-client.md) - Script: [`../scripts/check-mx2.sh`](../scripts/check-mx2.sh) ## Verified Last checked: 2026-08-01 — `./scripts/check-mx2.sh` exit 0 (compose up, watchdog 100%, empty queue, TLS LE OK, SMTP Postcow, A/AAAA/PTR/MX/SPF OK).