# traefik-vps

Configuration Traefik v3.6 du VPS OVH (141.94.42.172). Single source of truth versionnee
en local de la stack Swarm Traefik qui sert toutes les apps du VPS.

> Ce repo est un miroir local de `/home/ubuntu/traefik-stack.yml` sur le VPS. Toute
> modification doit etre faite ici, puis pushee vers le VPS via `scp` et redeployee
> via `docker stack deploy`. Le fichier sur le VPS est l'execution, ce fichier-ci est
> la reference.

## Cible

VPS OVH Roubaix : `141.94.42.172` (Ubuntu 25.04, user `ubuntu`)
SSH : `ssh ubuntu@141.94.42.172`

## Architecture

- **Traefik v3.6** en stack Swarm (1 replica, contrainte `node.role==manager`)
- **2 entrypoints** : `web` (port 80) et `websecure` (port 443), en mode host
- **Volume** : `traefik-certificates` (persiste les certs LE entre redeploys)
- **Reseau** : `traefik-public` (overlay partage avec toutes les apps)
- **Credentials OVH** : `/home/ubuntu/.ovh-api-credentials` (env_file, chmod 600)

## Certificats Let's Encrypt — deux resolvers

| Resolver | Mode | Storage | Usage |
|---|---|---|---|
| `letsencrypt` | DNS-01 OVH | `/certificates/acme.json` | Domaines `*.taaazzz-prog.fr` (zone OVH dont je controle l'API). Permet wildcards. |
| `letsencrypt-http` | HTTP-01 | `/certificates/acme-http.json` | Domaines hors zone OVH controlee (ex: `*.coolcare.fr` chez le client). Ne supporte pas wildcards. |

### Pourquoi deux resolvers ?

A l'origine il n'y avait que `letsencrypt` (DNS-01 OVH). Mais le 2026-05-15 on a
migre coolcare vers le domaine reel `coolcare.fr` (DNS chez le compte OVH du client,
pas le mien). L'API OVH avec mes credentials a renvoye `403 Forbidden: This call has
not been granted` → impossible de generer en DNS-01.

Solution : ajouter `letsencrypt-http` en HTTP-01. Chaque stack choisit son resolver
via le label Traefik `tls.certresolver=...`.

## Redirect HTTP → HTTPS

Redirect au niveau entrypoint actif (`--entrypoints.web.http.redirections.entrypoint.to=websecure`).
Coexiste avec HTTP-01 : Traefik insère un router interne pour `/.well-known/acme-challenge/`
en priorité maximale qui intercepte AVANT la redirection entrypoint level.

Note : certaines stacks (iliacloud, faildaily) définissent aussi leur propre middleware
`redirectscheme`. Quand le provider du middleware (`@docker` vs `@swarm`) ne matche pas,
le middleware échoue silencieusement mais le redirect entrypoint level prend le relais →
c'est OK. C'est pourquoi ces stacks fonctionnaient malgré l'erreur des logs.

## Deploy

```bash
# 1. Editer traefik-stack.yml localement
# 2. Push sur VPS
scp traefik-stack.yml ubuntu@141.94.42.172:/home/ubuntu/traefik-stack.yml

# 3. Redeploy
ssh ubuntu@141.94.42.172 'docker stack deploy -c /home/ubuntu/traefik-stack.yml traefik'

# 4. Verifier
ssh ubuntu@141.94.42.172 'docker service ps traefik_traefik'
```

## Rollback

```bash
ssh ubuntu@141.94.42.172 'cp /home/ubuntu/traefik-stack.yml.bak.<date> /home/ubuntu/traefik-stack.yml && docker stack deploy -c /home/ubuntu/traefik-stack.yml traefik'
```

Backups sur le VPS : `/home/ubuntu/traefik-stack.yml.bak.YYYYMMDD-HHMMSS`.

## Apps qui dependent de cette stack

- **coolcare** (coolcare_coolcare) → `*.coolcare.fr` (LE HTTP-01) + ex `*.coolcare.taaazzz-prog.fr` (LE DNS-01)
- **missioflow-prod** → `*.missioflow.fr` wildcard (LE DNS-01)
- **missioflow-demo** → `demo.missioflow.fr` (LE DNS-01)
- **missioflow-superadmin** → `sysop.missioflow.fr` (LE DNS-01)
- **missioflow-com** → `missioflow.fr`, `www.missioflow.fr` (LE DNS-01)
- **faildaily** → `*.faildaily.fr` ou similaire (LE DNS-01)
- **iliacloud** + **iliacloud-dev** + **iliacloud-site** → `*.iliacloud.fr` (LE DNS-01)
- **registry** → registry interne (LE DNS-01)

## Credentials OVH

Format `/home/ubuntu/.ovh-api-credentials` :

```
OVH_ENDPOINT=ovh-eu
OVH_APPLICATION_KEY=...
OVH_APPLICATION_SECRET=...
OVH_CONSUMER_KEY=...
```

Genere depuis https://eu.api.ovh.com/createToken/ avec droits :
- `GET /domain/zone/taaazzz-prog.fr/*`
- `POST /domain/zone/taaazzz-prog.fr/record`
- `DELETE /domain/zone/taaazzz-prog.fr/record/*`
- (et idem pour les zones missioflow.fr, faildaily.fr, iliacloud.fr — toutes les zones que je gere)

NE PAS commit ce fichier. Backup secret dans un coffre-fort externe.
