pkiapi/DEPLOYMENT.md

5.2 KiB

Guide de Déploiement - PKI API

Déploiement Local (Développement)

Mode MemoryStore (en mémoire)

export STORAGE_TYPE=memory
export PORT=8080
export JWT_SECRET_KEY=dev-key-change-in-prod

go build -o pkiapi ./cmd/main.go
./pkiapi

L'API démarre sur http://localhost:8080

Mode MongoDB Local

  1. Démarrer MongoDB (via Docker):
docker run -d -p 27017:27017 \
  -e MONGO_INITDB_ROOT_USERNAME=admin \
  -e MONGO_INITDB_ROOT_PASSWORD=password \
  --name pkiapi-mongo \
  mongo:latest
  1. Configurer les variables d'environnement:
export STORAGE_TYPE=mongodb
export MONGO_URI=mongodb://admin:password@localhost:27017
export MONGO_DB=pkiapi
export JWT_SECRET_KEY=super-secret-key
  1. Lancer l'API:
go build -o pkiapi ./cmd/main.go
./pkiapi

Déploiement Docker Compose (Recommandé)

Prérequis

  • Docker et Docker Compose installés
  • Port 8080 et 27017 libres

Lancer le déploiement complet

# Copier la configuration d'exemple
cp .env.example .env

# Éditer .env si nécessaire
nano .env

# Lancer les services
docker compose up -d

# Vérifier l'état
docker compose ps

# Voir les logs de l'API
docker compose logs api -f

# Voir les logs de MongoDB
docker compose logs mongo -f

Arrêter les services

docker compose down

# Avec suppression du volume MongoDB
docker compose down -v

Vérifier le déploiement

1. Vérifier que l'API est accessible

curl http://localhost:8080/api/v1/login \
  -H "Content-Type: application/json" \
  -d '{"username":"admin","password":"admin"}'

Réponse attendue:

{
  "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
  "expires_in": 86400
}

2. Obtenir un token et tester un endpoint protégé

# Obtenir le token
TOKEN=$(curl -s -X POST http://localhost:8080/api/v1/login \
  -H "Content-Type: application/json" \
  -d '{"username":"admin","password":"admin"}' | jq -r '.token')

# Lister les certificats (endpoint protégé)
curl -H "Authorization: Bearer $TOKEN" \
  http://localhost:8080/api/v1/certificates

3. Créer une CA et un certificat signé

# Obtenir le token
TOKEN=$(curl -s -X POST http://localhost:8080/api/v1/login \
  -H "Content-Type: application/json" \
  -d '{"username":"admin","password":"admin"}' | jq -r '.token')

# Créer une CA root
CA_ID=$(curl -s -X POST http://localhost:8080/api/v1/ca \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"subject":"CN=Root CA","validityDays":3650}' | jq -r '.id')

echo "CA créée: $CA_ID"

# Créer un certificat signé par la CA
curl -X POST http://localhost:8080/api/v1/certificates/sign \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d "{\"caId\":\"$CA_ID\",\"subject\":\"CN=test.example.com\",\"validityDays\":365}" | jq .

Configuration de Production

Variables d'environnement recommandées

# Sécurité
JWT_SECRET_KEY=<générer-une-clé-forte-aléatoire>

# MongoDB
MONGO_URI=mongodb://<user>:<password>@<host>:27017
MONGO_DB=pkiapi-prod

# API
PORT=8080
STORAGE_TYPE=mongodb

# Gin
GIN_MODE=release

Recommandations de sécurité

  1. MongoDB:

    • Utiliser MongoDB Atlas ou un cluster MongoDB géré
    • Activer l'authentification avec credentials forts
    • Utiliser SSL/TLS pour les connexions
    • Restreindre les accès par IP
  2. API:

    • Générer une clé JWT forte et aléatoire
    • Utiliser HTTPS en production
    • Placer derrière un reverse proxy (nginx, Apache)
    • Configurer les CORS si nécessaire
    • Utiliser un WAF (Web Application Firewall)
  3. Infrastructure:

    • Exécuter dans un conteneur avec ressources limitées
    • Utiliser des secrets manager (Vault, AWS Secrets Manager)
    • Configurer les logs centralisés
    • Mettre en place la surveillance et alertes

Troubleshooting

Docker Compose ne démarre pas

# Vérifier les erreurs de build
docker compose build --no-cache

# Voir les logs détaillés
docker compose up --abort-on-container-exit

Erreur de connexion MongoDB

# Vérifier que MongoDB est accessible
docker compose exec mongo mongosh --authenticationDatabase admin -u admin -p password

# Vérifier la connectivité réseau
docker compose exec api ping mongo

API retourne erreur d'authentification

# Vérifier le token JWT
curl -X POST http://localhost:8080/api/v1/login \
  -H "Content-Type: application/json" \
  -d '{"username":"admin","password":"admin"}'

# Ajouter le token dans les headers
curl -H "Authorization: Bearer <token>" http://localhost:8080/api/v1/certificates

Performance et Scaling

  • MemoryStore: Idéal pour développement et tests (single instance)
  • MongoStore: Adapté pour production avec replica set MongoDB
  • Scaling horizontal: Lancer plusieurs instances de l'API derrière un load balancer

Maintenance

Sauvegarde MongoDB

docker compose exec mongo mongodump --authenticationDatabase admin -u admin -p password -o /dump

Restauration MongoDB

docker compose exec mongo mongorestore --authenticationDatabase admin -u admin -p password /dump

Nettoyage des volumes

docker compose down -v  # ⚠️ Supprime TOUS les données !