# Infrastructure de deploiement - Missioflow

## Serveur

- **Fournisseur** : OVH
- **IP** : 51.75.55.185
- **OS** : Linux (WSL2 en dev local)
- **Acces SSH** : `ssh taaazzz@51.75.55.185`
- **Orchestration** : Docker Swarm (single node)

## Reverse Proxy - Traefik v3.6

Traefik gere le routage par sous-domaine/domaine et les certificats SSL Let's Encrypt automatiquement.

### Configuration

- Stack Traefik : service `traefik_traefik`
- Ports exposes : 80 (HTTP) + 443 (HTTPS)
- Dashboard : accessible via Traefik
- Labels Docker pour le routage : chaque service declare ses labels Traefik dans le docker-compose

### Exemple de labels pour un service web

```yaml
deploy:
  labels:
    - "traefik.enable=true"
    - "traefik.http.routers.missioflow.rule=Host(`missioflow.fr`) || Host(`www.missioflow.fr`)"
    - "traefik.http.routers.missioflow.entrypoints=websecure"
    - "traefik.http.routers.missioflow.tls.certresolver=letsencrypt"
    - "traefik.http.services.missioflow.loadbalancer.server.port=80"
    # Redirection HTTP -> HTTPS
    - "traefik.http.routers.missioflow-http.rule=Host(`missioflow.fr`) || Host(`www.missioflow.fr`)"
    - "traefik.http.routers.missioflow-http.entrypoints=web"
    - "traefik.http.routers.missioflow-http.middlewares=redirect-to-https"
```

### Redirection .com vers .fr

Ajouter dans les labels Traefik :
```yaml
    - "traefik.http.routers.missioflow-com.rule=Host(`missioflow.com`) || Host(`www.missioflow.com`)"
    - "traefik.http.routers.missioflow-com.entrypoints=websecure"
    - "traefik.http.routers.missioflow-com.tls.certresolver=letsencrypt"
    - "traefik.http.routers.missioflow-com.middlewares=redirect-to-fr"
    - "traefik.http.middlewares.redirect-to-fr.redirectregex.regex=^https?://(?:www\\.)?missioflow\\.com/(.*)"
    - "traefik.http.middlewares.redirect-to-fr.redirectregex.replacement=https://missioflow.fr/$${1}"
    - "traefik.http.middlewares.redirect-to-fr.redirectregex.permanent=true"
```

## CI/CD - GitLab

- **Instance GitLab** : https://gitlab.taaazzz-prog.fr (self-hosted, port SSH 2224)
- **Registry Docker** : registry.taaazzz-prog.fr
- **Runner** : GitLab Runner installe sur le serveur OVH (conteneur `gitlab-runner`)

### Pipeline type pour un site statique

```yaml
stages:
  - build
  - deploy

build:
  stage: build
  image: node:20-alpine
  script:
    - npm ci
    - npm run build
  artifacts:
    paths:
      - dist/

deploy:
  stage: deploy
  image: docker:latest
  script:
    - docker build -t registry.taaazzz-prog.fr/root/missioflow-site:$CI_COMMIT_SHORT_SHA .
    - docker push registry.taaazzz-prog.fr/root/missioflow-site:$CI_COMMIT_SHORT_SHA
    - docker service update --image registry.taaazzz-prog.fr/root/missioflow-site:$CI_COMMIT_SHORT_SHA missioflow_web
  only:
    - main
```

## DNS - Configuration requise

Une fois les domaines actifs sur OVH, configurer les enregistrements DNS :

### missioflow.fr
```
A       @           51.75.55.185
A       www         51.75.55.185
MX      @           Selon config Zimbra OVH
```

### missioflow.com
```
A       @           51.75.55.185
A       www         51.75.55.185
```

## Services actuellement en production sur ce serveur

| Service | Image | Ports |
|---------|-------|-------|
| traefik_traefik | traefik:v3.6 | 80, 443 |
| coolcare_coolcare | registry.taaazzz-prog.fr/root/coolcare_app | 80 (interne) |
| coolcare_gotenberg | gotenberg/gotenberg:8 | 3000 (interne) |
| gitlab_gitlab | gitlab/gitlab-ce:latest | 22, 80, 443 (internes) |
| rollerlogic_* | ghcr.io/taaazzz-prog/rollerlogic-* | 3000 (interne) |
| faildaily_* | registry.taaazzz-prog.fr/root/faildaily/* | divers |
| sonarqube | sonarqube:community | 9000 (interne) |

## Docker Compose type pour le site Missioflow

```yaml
version: "3.8"

services:
  web:
    image: registry.taaazzz-prog.fr/root/missioflow-site:latest
    networks:
      - traefik-public
    deploy:
      replicas: 1
      labels:
        - "traefik.enable=true"
        - "traefik.http.routers.missioflow.rule=Host(`missioflow.fr`) || Host(`www.missioflow.fr`)"
        - "traefik.http.routers.missioflow.entrypoints=websecure"
        - "traefik.http.routers.missioflow.tls.certresolver=letsencrypt"
        - "traefik.http.services.missioflow.loadbalancer.server.port=80"

networks:
  traefik-public:
    external: true
```

## Dockerfile type (site statique Nginx)

```dockerfile
FROM nginx:alpine
COPY dist/ /usr/share/nginx/html/
COPY nginx.conf /etc/nginx/conf.d/default.conf
EXPOSE 80
```

## Commandes utiles

```bash
# Deployer la stack
docker stack deploy -c missioflow-stack.yml missioflow

# Voir les services
docker service ls | grep missioflow

# Voir les logs
docker service logs missioflow_web

# Mettre a jour l'image
docker service update --image registry.taaazzz-prog.fr/root/missioflow-site:NEW_TAG missioflow_web
```
