SmartPot-Mail es el servidor de correo de SmartPot, basado en Mailpit. Recibe los correos que envía SmartPot-API —bienvenida y recuperación de contraseña— y los muestra en una interfaz web protegida. Si se configura un relay, además los reenvía a un SMTP real para que lleguen a los usuarios.
| Puerto | Uso | Producción |
|---|---|---|
| 1025 | SMTP con autenticación | Solo la red interna de Docker |
| 8025 | Interfaz web y API de Mailpit, con usuario y contraseña | https://mail.smartpot.app a través de Nginx |
- SMTP exige usuario y contraseña (
MAIL_USERNAME,MAIL_PASSWORD); la autenticación sin TLS solo se permite porque el tráfico no sale de la red interna. - La interfaz web exige su propio usuario y contraseña (
MAILPIT_UI_USERNAME,MAILPIT_UI_PASSWORD). Antes era pública. - Las credenciales se pasan a Mailpit por variables de entorno: no se escriben en archivos ni aparecen en los logs.
- Corre como el usuario
1000, con sistema de archivos de solo lectura; los mensajes viven en/tmpy se descartan a los 30 días o al superar 500.
SmartPot-Mail/
├── .github/
│ ├── dependabot.yml
│ └── workflows/
│ ├── ci.yml # Construye la imagen y corre la prueba de seguridad
│ ├── packaging.yml # Publica la imagen en GHCR con SBOM y procedencia (y en Docker Hub con credenciales)
│ └── deploy.yml # Pide el despliegue al workflow central de SmartPotTech/.github
├── tests/
│ └── smoke.sh # Autenticación SMTP e interfaz, entrega y logs sin secretos
├── compose.yaml
├── Dockerfile # axllent/mailpit sin privilegios
├── entrypoint.sh # Traduce las credenciales a la configuración de Mailpit
└── .env.example
La imagen es pública: ghcr.io/smartpottech/smartpot-mail. La plataforma completa, con este servicio incluido, se
levanta con un solo comando y sin descargar el código:
curl -fsSL https://raw.githubusercontent.com/SmartPotTech/.github/main/docker/demo/compose.yaml | docker compose -f - up -d --waitAbre http://localhost:5173 e ingresa con demo@smartpot.app / SmartPot2026. Se detiene con
docker compose -p smartpot-demo down (con -v borra también los datos). Más detalle en la
demo.
El mismo servicio corre en la demo beta del stack nuevo: cambia demo por demo-beta
en la URL y en el nombre del proyecto.
Solo este servicio, con la imagen publicada:
docker run -d --name smartpot-mail --read-only --tmpfs /tmp --cap-drop ALL \
-p 127.0.0.1:1025:1025 -p 127.0.0.1:8025:8025 \
-e MAIL_USERNAME=smartpot -e MAIL_PASSWORD=<contraseña-smtp> \
-e MAILPIT_UI_USERNAME=admin -e MAILPIT_UI_PASSWORD=<contraseña-de-la-interfaz> \
ghcr.io/smartpottech/smartpot-mail:latestcp .env.example .env # define las dos contraseñas
docker compose up -dAbre http://localhost:8025 con el usuario de la interfaz. La API se conecta con:
MAIL_HOST=localhost MAIL_PORT=1025 MAIL_USERNAME=smartpot MAIL_PASSWORD=<MAIL_PASSWORD> MAIL_SMTP_AUTH=true
Mailpit puede reenviar todos los mensajes a un proveedor SMTP. Descomenta las variables MP_SMTP_RELAY_* del
.env.example con los datos del proveedor (por ejemplo, una contraseña de aplicación de Gmail) y deja
MP_SMTP_RELAY_ALL=true.
docker build -t smartpot-mail:ci .
sh tests/smoke.sh smartpot-mail:cidocker pull ghcr.io/smartpottech/smartpot-mail:latestCada cambio en main pasa por el CI, publica la imagen en GHCR (y en Docker Hub como réplica cuando el repositorio
tiene credenciales) y pide el despliegue al workflow central
de SmartPotTech/.github, que actualiza producción de a uno y verifica
/health.
El correo cubre la bienvenida y la recuperación de la contraseña; los avisos del cultivo van por la PWA y Telegram. Su
documentación propia está en docs/ (también
en DOCX y PDF), con sus diagramas en
docs/diagrams: el general de la imagen y el flujo de los correos.
La documentación técnica
describe la red de producción y cómo se protege la bandeja. Los diagramas generales muestran la plataforma completa en
una sola imagen ampliable:
- Arquitectura completa: dónde vive Mailpit y cómo se publica su bandeja
- Operación completa: el registro con su correo de bienvenida y la recuperación de la contraseña
Este proyecto está bajo la licencia MIT. Consulta el archivo LICENSE para más detalles.