Funk-lab/admin/infra/email.md

172 lines
4.6 KiB
Markdown

# Email — Relay SMTP via Postfix → Gmail
## Architecture
```
Hermes / AlertManager / cron / kubectl
Postfix (storage-01 :25)
smtp_generic_maps → réécrit l'expéditeur en aliyesilkaya93@gmail.com
│ SASL + TLS (App Password)
smtp.gmail.com:587
aliyesilkaya93@gmail.com
```
Postfix est configuré en **relay-only** sur storage-01 : aucune livraison locale, tous les mails transitent vers Gmail SMTP. Les réseaux autorisés à relayer : `127.0.0.0/8`, `192.168.10.0/24`, pods k8s (`10.42.0.0/16`), services k8s (`10.43.0.0/16`).
**Pourquoi Gmail et pas Brevo ?** Brevo exige de posséder un domaine vérifié (SPF/DKIM) pour relayer. Gmail SMTP avec App Password ne nécessite aucun domaine.
---
## Prérequis — Google App Password
La vérification en 2 étapes Google doit être activée sur le compte.
1. `myaccount.google.com` → Sécurité → Validation en 2 étapes → Activer
2. `myaccount.google.com/apppasswords` → Nouveau → nom `funk-postfix` → Créer
3. Google génère un code 16 caractères (ex: `abcd efgh ijkl mnop`) — c'est le mot de passe SMTP
---
## Installation
### 1. Ajouter le App Password dans le vault
```bash
make vault-edit
```
Modifier ou ajouter :
```yaml
vault_postfix_relay_password: "xxxx xxxx xxxx xxxx" # App Password Google 16 caractères (avec espaces, OK)
```
```bash
make vault-encrypt
```
### 2. Vérifier les vars gateway
Dans `ansible/group_vars/gateway/vars.yml` :
```yaml
postfix_relay_host: smtp.gmail.com
postfix_relay_port: 587
postfix_relay_user: "aliyesilkaya93@gmail.com"
postfix_sender_email: "aliyesilkaya93@gmail.com"
```
### 3. Déployer
```bash
make apply-storage
# ou cibler uniquement le rôle :
ansible-playbook -i inventory.yml playbooks/storage-01.yml --tags postfix_relay
```
---
## Vérification
### Test depuis storage-01
```bash
echo "Test Funk Lab - $(date)" | sudo mail -s "[Funk] Test postfix" aliyesilkaya93@gmail.com
```
### Suivre les logs en temps réel
```bash
sudo journalctl -u postfix -f --no-pager --output=cat
```
Résultat attendu : `status=sent (250 2.0.0 OK ... - gsmtp)`
### Vérifier / vider la file d'attente
```bash
sudo mailq # lister les mails en attente
sudo postqueue -f # forcer le flush
sudo postsuper -d ALL # vider la queue (mails échoués)
```
### Vérifier la réécriture expéditeur
```bash
sudo postconf smtp_generic_maps
sudo cat /etc/postfix/generic
```
---
## Utilisation depuis les services
### Depuis storage-01 (shell / cron / Hermes)
```bash
echo "Corps du mail" | sudo mail -s "[Funk] Sujet" aliyesilkaya93@gmail.com
```
Via Python (dans un skill Hermes) :
```python
import smtplib
from email.message import EmailMessage
msg = EmailMessage()
msg['Subject'] = '[Funk] Alerte'
msg['From'] = 'aliyesilkaya93@gmail.com'
msg['To'] = 'aliyesilkaya93@gmail.com'
msg.set_content('Contenu du mail')
with smtplib.SMTP('127.0.0.1', 25) as s:
s.send_message(msg)
```
### Depuis AlertManager (k8s)
Dans `k8s/infra/monitoring/values.yaml` :
```yaml
alertmanager:
config:
receivers:
- name: email
email_configs:
- to: aliyesilkaya93@gmail.com
from: aliyesilkaya93@gmail.com
smarthost: "192.168.10.1:25"
require_tls: false # TLS géré par Postfix vers Gmail, pas sur le LAN interne
route:
receiver: email
```
### Depuis n'importe quel pod k8s
SMTP relay accessible sur `192.168.10.1:25` depuis tout le cluster.
---
## Dépannage
| Symptôme | Cause probable | Action |
|---|---|---|
| `Connection refused` sur :25 | postfix non démarré | `sudo systemctl status postfix` |
| `Relay access denied` | IP source hors mynetworks | `sudo postconf mynetworks` |
| `Authentication failed` | App Password révoqué ou 2FA désactivé | Régénérer dans `myaccount.google.com/apppasswords` |
| Mail jamais reçu | Réécriture expéditeur manquante | Vérifier `/etc/postfix/generic` et `postconf smtp_generic_maps` |
| Mail en spam | Expéditeur non reconnu | Normal si From ≠ aliyesilkaya93@gmail.com |
| Queue bloquée | Ancien mail échoué en retry | `sudo postsuper -d ALL` puis retester |
---
## Configuration Ansible
- **Rôle** : `ansible/roles/postfix_relay/`
- **Vars** : `ansible/group_vars/gateway/vars.yml``postfix_relay_*`, `postfix_sender_email`
- **Secret** : `vault_postfix_relay_password` dans `ansible/group_vars/all/vault.yml`
- **Templates** : `main.cf.j2`, `sasl_passwd.j2`
- **Sender rewrite** : `/etc/postfix/generic` (déployé par le rôle, postmap automatique)
- **nftables** : port 25 ouvert automatiquement depuis `192.168.10.0/24`