Files
infrastructure/docs/08-deploiement-consul-registrator.md

400 lines
8.9 KiB
Markdown

# Deploiement de Consul et Registrator (mode production)
Ce guide explique comment deployer Consul et Registrator avec ACL sur l'infrastructure existante **sans perturber les services en production**.
## Prerequis
- Infrastructure existante fonctionnelle (Gitea, Woodpecker, PostgreSQL)
- Acces SSH au serveur
- Reseau Docker `gitgit_syoul_fr_gitea_net` existant
## Vue d'ensemble
```
AVANT (actuel) APRES (avec Consul + ACL)
---------------- -------------------------
[Gitea] [Gitea] <-+
| | |
v v |
[gitea:3000] [gitea:3000]
^ ^ |
| | |
[Woodpecker] [Woodpecker]
| |
v v
[Consul + ACL] <-- [Registrator + Token]
```
## Etape 1 : Copier les fichiers sur le serveur
```bash
# Depuis votre machine locale
scp -r consul/ portainer2:/opt/
scp -r registrator/ portainer2:/opt/
```
## Etape 2 : Deployer Consul
### Demarrer Consul
```bash
ssh portainer2
cd /opt/consul
docker compose up -d
```
### Verifier le demarrage
```bash
# Attendre quelques secondes
sleep 10
# Verifier que le conteneur est lance
docker ps | grep consul
# Verifier les logs
docker logs consul
# Tester l'API (sans token, certaines routes sont accessibles)
curl -s http://localhost:8500/v1/status/leader
```
### Verifier l'interface web
Acceder a : `http://[IP-serveur]:8500`
**Note** : Avec les ACL activees, vous verrez un message demandant un token pour acceder aux services.
## Etape 3 : Initialiser les ACL
### Bootstrap des ACL
```bash
# Generer le token administrateur
docker exec consul consul acl bootstrap
```
**IMPORTANT** : Notez le `SecretID` retourne. C'est votre token administrateur.
Exemple de sortie :
```
AccessorID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
SecretID: abcdef12-3456-7890-abcd-ef1234567890 <-- NOTEZ CE TOKEN !
Description: Bootstrap Token (Global Management)
Local: false
Create Time: 2025-01-01 00:00:00.000000000 +0000 UTC
Policies:
00000000-0000-0000-0000-000000000001 - global-management
```
### Stocker le token admin
```bash
# Sur le serveur, creer le fichier .env pour Consul
cd /opt/consul
echo "CONSUL_HTTP_TOKEN=abcdef12-3456-7890-abcd-ef1234567890" > .env
chmod 600 .env
# Exporter pour les commandes suivantes
export CONSUL_TOKEN="abcdef12-3456-7890-abcd-ef1234567890"
```
### Creer la policy pour Registrator
```bash
docker exec consul consul acl policy create \
-name "registrator" \
-description "Policy pour Registrator - enregistrement des services" \
-rules '
service_prefix "" {
policy = "write"
}
node_prefix "" {
policy = "read"
}
agent_prefix "" {
policy = "read"
}
' \
-token "$CONSUL_TOKEN"
```
### Creer le token Registrator
```bash
docker exec consul consul acl token create \
-description "Token Registrator" \
-policy-name "registrator" \
-token "$CONSUL_TOKEN"
```
Notez le `SecretID` du token Registrator.
Exemple :
```
AccessorID: yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy
SecretID: registr8-or12-3456-7890-tokenexample <-- TOKEN REGISTRATOR
Description: Token Registrator
...
```
## Etape 4 : Deployer Registrator
### Configurer le token
```bash
cd /opt/registrator
# Creer le fichier .env avec le token Registrator
echo "CONSUL_HTTP_TOKEN=registr8-or12-3456-7890-tokenexample" > .env
chmod 600 .env
```
### Demarrer Registrator
```bash
docker compose up -d
```
### Verifier le demarrage
```bash
# Verifier que le conteneur est lance
docker ps | grep registrator
# Verifier les logs (pas d'erreur ACL)
docker logs registrator
```
## Etape 5 : Verifier les services enregistres
```bash
# Via l'API (avec token admin)
curl -s -H "X-Consul-Token: $CONSUL_TOKEN" \
http://localhost:8500/v1/catalog/services | python3 -m json.tool
```
Vous devriez voir les services existants :
```json
{
"consul": [],
"gitea-3000": [],
"woodpecker-server-8000": [],
"gitea_db-5432": []
}
```
**Note** : Les noms de services sont automatiques. Pour des noms propres, ajoutez des labels (etape suivante).
## Etape 6 : Ajouter les labels aux services (optionnel mais recommande)
Pour avoir des noms de services propres et des health checks, modifier les docker-compose existants.
### Gitea
Modifier `/opt/gitea/docker-compose.yml` :
```yaml
services:
gitea:
container_name: gitea
image: gitea/gitea:latest
restart: always
# Ajouter ces labels
labels:
- "SERVICE_NAME=gitea"
- "SERVICE_TAGS=web,git"
- "SERVICE_3000_CHECK_HTTP=/api/v1/version"
- "SERVICE_3000_CHECK_INTERVAL=15s"
# ... reste de la configuration inchangee ...
```
### PostgreSQL
Modifier `/opt/postgres/docker-compose.yml` :
```yaml
services:
gitea_db:
container_name: gitea_db
image: postgres:14
restart: always
# Ajouter ces labels
labels:
- "SERVICE_NAME=gitea-db"
- "SERVICE_TAGS=postgres,database"
- "SERVICE_5432_CHECK_TCP=true"
- "SERVICE_5432_CHECK_INTERVAL=10s"
# ... reste de la configuration inchangee ...
```
### Woodpecker
Modifier `/opt/woodpecker/docker-compose.yml` :
```yaml
services:
woodpecker-server:
# ...
labels:
- "SERVICE_NAME=woodpecker"
- "SERVICE_TAGS=ci,web"
- "SERVICE_8000_CHECK_HTTP=/healthz"
- "SERVICE_8000_CHECK_INTERVAL=15s"
woodpecker-agent:
# ...
labels:
- "SERVICE_NAME=woodpecker-agent"
- "SERVICE_TAGS=ci,agent"
```
### Appliquer les changements
```bash
# Pour chaque service modifie
cd /opt/[service]
docker compose up -d
```
**Note** : Cette operation redemarrera les conteneurs. Effectuer pendant une periode de faible activite.
## Etape 7 : Tester la resolution DNS (optionnel)
### Depuis le serveur
```bash
dig @localhost -p 8600 gitea.service.consul
dig @localhost -p 8600 woodpecker.service.consul
dig @localhost -p 8600 gitea-db.service.consul
```
### Depuis un conteneur
```bash
docker exec consul dig @127.0.0.1 -p 8600 gitea.service.consul
```
## Verification finale
### Tous les services sont enregistres
```bash
curl -s -H "X-Consul-Token: $CONSUL_TOKEN" \
http://localhost:8500/v1/catalog/services | python3 -m json.tool
```
Resultat attendu (avec labels) :
```json
{
"consul": [],
"gitea": ["web", "git"],
"gitea-db": ["postgres", "database"],
"woodpecker": ["ci", "web"],
"woodpecker-agent": ["ci", "agent"]
}
```
### Health checks sont verts
Dans l'interface Consul : `http://[IP-serveur]:8500/ui/dc1/services`
Utilisez le token admin pour voir les services. Tous devraient avoir un statut "passing" (vert).
### Resolution DNS fonctionne
```bash
dig @localhost -p 8600 gitea.service.consul +short
# Devrait retourner l'IP du conteneur gitea
```
### Tokens fonctionnels
```bash
# Test token admin
curl -s -H "X-Consul-Token: $CONSUL_TOKEN" \
http://localhost:8500/v1/acl/tokens | head -20
# Test token Registrator (via logs)
docker logs registrator 2>&1 | grep -i error
# Pas d'erreur = token OK
```
## Resume des tokens
| Token | Fichier | Usage |
|-------|---------|-------|
| Admin (bootstrap) | `/opt/consul/.env` | Administration Consul |
| Registrator | `/opt/registrator/.env` | Enregistrement des services |
## Rollback
Si vous rencontrez des problemes et souhaitez desactiver Consul/Registrator :
```bash
# Arreter Registrator et Consul
cd /opt/registrator && docker compose down
cd /opt/consul && docker compose down
# Les services existants continueront de fonctionner normalement
# via le reseau Docker classique
```
Pour repartir de zero (supprimer les donnees Consul) :
```bash
docker volume rm consul_consul-data
```
## Securite - Bonnes pratiques
### 1. Proteger les fichiers .env
```bash
chmod 600 /opt/consul/.env
chmod 600 /opt/registrator/.env
```
### 2. Ne pas exposer le port 8500 sur Internet
Utiliser un firewall ou n'exposer que sur localhost :
```yaml
ports:
- "127.0.0.1:8500:8500"
```
### 3. Rotation des tokens
Periodiquement (ex: tous les 3 mois) :
1. Creer un nouveau token Registrator
2. Mettre a jour `/opt/registrator/.env`
3. Redemarrer Registrator
4. Revoquer l'ancien token
### 4. Sauvegardes
```bash
# Sauvegarder Consul
docker exec consul consul snapshot save /consul/data/backup.snap -token "$CONSUL_TOKEN"
docker cp consul:/consul/data/backup.snap ./consul_backup_$(date +%Y%m%d).snap
# Sauvegarder les tokens (fichiers .env)
cp /opt/consul/.env ./consul_env_backup_$(date +%Y%m%d)
cp /opt/registrator/.env ./registrator_env_backup_$(date +%Y%m%d)
```
## Prochaines etapes
1. **Surveillance** : Ajouter des alertes basees sur les health checks Consul
2. **Configuration distribuee** : Utiliser le Key/Value store de Consul
3. **Haute disponibilite** : Deployer plusieurs noeuds Consul
4. **TLS** : Activer le chiffrement des communications