Mise en production
Closed this issue · 18 comments
- Ajout du monitoring
- Mettre en place UptimeRobot
et SetCronJobsur le VPS - Copie DB
- Bascule upstream avec one-liner rollback
- Suivi de production rapproché pendant une journée
- Diagnostic et corrections des problèmes identifiés
- Mise en commun des différentes DBs
- Redirection du flux de production vers le VPS 09/05/2017 - 9h
- Test du déploiement automatique via une modification simple de Mes-Aides-UI
- Test du déploiement automatique via une modification de Mes-Aides-API/UI
-
Récupération des données Let's Encrypt du serveur dédié sur une tierce machine -
Création d'une image du serveur dédié actuel (?) -
Réinitialisation du VPS pour servir directement le domaine mes-aides.gouv.fr-
Réinitialisation de base -
Copie manuelle des données Let's Encrypt -
Activation du SSL -
Relance du provisioning -
Copie légère de la DB -
Mise à jour du DNS pour servir en production en direct
-
- Ajout d'un serveur mes-aides.gouv.fr sur le VPS
- Ajout d'un certificat SSL pour mes-aides.gouv.fr sur le VPS
- Mise à jour du DNS pour pointer mes-aides.gouv.fr directement vers le VPS
- Sauvegarde des données du serveur dédié
- (/etc, /bin, /lib)
- DBs
- Réinitialisation du serveur dédié
- Ajout d'un utilisateur
main
car l'image utilisée sur le serveur dédié n'a pas l'utilisateurubuntu
- Déploiement via Puppet
- Erreur de provisioning à cause d'un problème de permissions sur des fichiers systèmes - bloquant pour MongoDB
-
Utilisation des données sauvegardées de Let's Encrypt -
Récupération des données Let's Encrypt du serveur dédié - Copie complète (sans les toutes nouvelles données créées sur le VPS)
- Ajout d'un certificat SSL sur le serveur dédié
- Mise à jour du DNS pour à nouveau pointer mes-aides.gouv.fr vers le serveur dédié
- Copie des données du VPS sur le serveur dédié
- Amélioration de la stratégie de monitoring
Bascule upstream
J'ai réalisé des tests pour la redirection via un upstream mais en fait les choses peuvent être simplifiées car il n'y a qu'un serveur dans le upstream.
J'ai donc préparé les fichiers :
/etc/nginx/conf.d/dds.conf_PRE_UPSTREAM_CHANGE
/etc/nginx/conf.d/dds.conf_POST_UPSTREAM_CHANGE
Dont le diff
est le suivant :
44c44
< proxy_pass http://dds/tests;
---
> proxy_pass https://vps.mes-aides.gouv.fr/tests;
66c66
< proxy_pass http://dds;
---
> proxy_pass https://vps.mes-aides.gouv.fr;
Le script de déploiement est donc :
cp -f /etc/nginx/conf.d/dds.conf_POST_UPSTREAM_CHANGE /etc/nginx/conf.d/dds.conf && sudo service nginx restart
Celui de rollback :
cp -f /etc/nginx/conf.d/dds.conf_PRE_UPSTREAM_CHANGE /etc/nginx/conf.d/dds.conf && sudo service nginx restart
@MattiSG cela te semble bon/pertinent ?
👍
Mise en commun des différentes DBs
J'ai en tête ces DBs :
/var/lib/mongodb/dds.*
/home/mongodb/data/dds.*
@MattiSG Penses-tu à d'autres ?
Faut-il mettre en commun avec les autres DBs (/home/mongodb/data/mes-aides-aah/rennes) ?
Celle du VPS si elle est utilisée. Oui, intégrer mes-aides-aah
me semblerait pertinent. rennes
a été il me semble déjà intégrée.
Copie de la base de données
Etant donné le problème de dimensionnement du VPS (espace disque) et comme suggéré par @MattiSG , j'ai limité l'exportation des situations à celles utilisées par les tests.
J'ai utilisé le script suivant largement inspiré du script d'importation des tests :
USER=root
DATABASE=dds
NOW=$(date +"%F-%H-%M-%S")
#NOW=2017-05-04-10-06-03 # Hardcoded value used to safely repeat parts of the script
DISTANT_DUMP_FOLDER="~/dumps/dump-$NOW"
LOCAL_DUMP_FOLDER='./dump-migration'
DEST_DUMP_FOLDER="/var/tmp"/$(basename $DISTANT_DUMP_FOLDER)
echo $NOW
ssh $USER@mes-aides.gouv.fr "mongodump --db $DATABASE && mongodump --db dds --collection situations --query '{status:\"test\"}' && mkdir -p `dirname $DISTANT_DUMP_FOLDER` && mv dump $DISTANT_DUMP_FOLDER/ && gzip -rv $DISTANT_DUMP_FOLDER"
scp -r $USER@mes-aides.gouv.fr:$DISTANT_DUMP_FOLDER/$DATABASE $LOCAL_DUMP_FOLDER
ssh $USER@vps274040.ovh.net "mkdir -p $DEST_DUMP_FOLDER"
scp -r $LOCAL_DUMP_FOLDER/* $USER@vps274040.ovh.net:$DEST_DUMP_FOLDER/
ssh $USER@vps274040.ovh.net "gunzip -r $DEST_DUMP_FOLDER && mongorestore --db $DATABASE $DEST_DUMP_FOLDER"
Tentative de copie entière vers le VPS
Script utilisé
USER=root
DATABASE=dds
for iter in 0 1 2 3 4 5 6 7 8
do
NOW=$(date +"%F-%H-%M-%S")
DISTANT_DUMP_FOLDER="~/dumps/dump-$NOW"
LOCAL_DUMP_FOLDER="./dump-migration-$NOW"
DEST_DUMP_FOLDER="/var/tmp"/$(basename $DISTANT_DUMP_FOLDER)
SKIP=$(expr $iter \* 100000)
HIGH=$(ssh $USER@mes-aides.gouv.fr "mongo dds --eval \"db.situations.find().skip($SKIP).limit(1).sort({dateDeValeur:1})[0]._id\" --quiet")
if [[ $? -ne 0 ]]
then
HIGH=''
fi
echo $HIGH
if [ $LOW ]
then
echo now: $NOW - iter: $iter - high: $HIGH - low: $LOW
if [ $HIGH ]
then
QUERY="{_id: {\$gte: $LOW, \$lte: $HIGH}}"
else
QUERY="{_id: {\$gte: $LOW}}"
fi
echo $QUERY
ssh $USER@mes-aides.gouv.fr "mongodump --db dds --collection situations --query '$QUERY' && mkdir -p `dirname $DISTANT_DUMP_FOLDER` && mv dump $DISTANT_DUMP_FOLDER/ && gzip -rv $DISTANT_DUMP_FOLDER" &&
scp -r $USER@mes-aides.gouv.fr:$DISTANT_DUMP_FOLDER/$DATABASE $LOCAL_DUMP_FOLDER &&
ssh $USER@vps274040.ovh.net "mkdir -p $DEST_DUMP_FOLDER" &&
scp -r $LOCAL_DUMP_FOLDER/* $USER@vps274040.ovh.net:$DEST_DUMP_FOLDER/ &&
ssh $USER@vps274040.ovh.net "gunzip -r $DEST_DUMP_FOLDER && mongorestore --db $DATABASE $DEST_DUMP_FOLDER && rm -fr $DEST_DUMP_FOLDER"
fi
LOW=$HIGH
done
Pas possible avec le VPS de 10Go.
Revert vers le serveur dédié et extraction des données dans la DB du VPS.
Suivi du service sur le VPS
-
Pas de problème majeure
-
Specs du VPS actuel sous-dimensionnées
-
RAM usage 98%
-
10Go d'espace disque limitant
-
Certains usagers ont essayé de simuler des situations absentes de la DB à cause de la migration partielle (seules les situations de test ayant été importées). C'est un "problème" plus large que cela cf. betagouv/aides-jeunes#548.
Mise en commun des différentes DBs
@MattiSG @fpagnoux Puis-je considérer que mes-aides-aah et mes-aides-rennes ne sont plus utilisées/alimentées ?
Je souhaite tirer un trait et considérer qu'une fois les migrations vers la base de donnée principale faites, les fichiers des base de données importées peuvent être supprimés.
@MattiSG Peux-on imaginer mes-aides sur un VPS avec des specs acceptables, à la place du serveur dédié ?
Voici les possibilités données par OVH :
- 1 vCore RAM 2 Gio Disk 10 Gio Configuration actuelle (2.99 €)
- 1 vCore RAM 4 Gio Disk 20 Gio 5.99 € / mois
- 2 vCores RAM 8 Gio Disk 40 Gio 11.99 € / mois
Mise en commun des DBs
J'ai importé hier soir les base de données /var/lib/mongodb/*
.
Détails des tests récupérés dans mes-aides-aah :
{ "_id" : ObjectId("573acf0f67831ca264e93d31"), "scenario" : { "situationId" : "573acc4e67831ca264e93d13" }, "state" : "unclaimed" }
{ "_id" : ObjectId("5783568267831ca264e93d3e"), "scenario" : { "situationId" : "5783561c67831ca264e93d3b" }, "state" : "unclaimed" }
{ "_id" : ObjectId("579a615367831ca264e93d75"), "scenario" : { "situationId" : "579a610567831ca264e93d5a" }, "state" : "unclaimed" }
{ "_id" : ObjectId("579b27b367831ca264e93d7e"), "scenario" : { "situationId" : "579b27af67831ca264e93d7c" }, "state" : "unclaimed" }
{ "_id" : ObjectId("57a88c2167831ca264e93da6"), "scenario" : { "situationId" : "57a88b8367831ca264e93d8b" }, "state" : "unclaimed" }
{ "_id" : ObjectId("582b06f467831ca264e93def"), "scenario" : { "situationId" : "582b06e667831ca264e93de5" }, "state" : "validated" }
{ "_id" : ObjectId("582b0cb067831ca264e93e2b"), "scenario" : { "situationId" : "582b0c8e67831ca264e93e1b" }, "state" : "unclaimed" }
{ "_id" : ObjectId("582b0d0167831ca264e93e3a"), "scenario" : { "situationId" : "582b0ce367831ca264e93e36" }, "state" : "validated" }
{ "_id" : ObjectId("58bd27044aa60a680a741e7a"), "scenario" : { "situationId" : "58bd260d4aa60a680a741e68" }, "state" : "validated" }
{ "_id" : ObjectId("582b113667831ca264e93e72"), "scenario" : { "situationId" : "582b111867831ca264e93e6e" }, "state" : "validated" }
{ "_id" : ObjectId("58bd2b774aa60a680a741ea2"), "scenario" : { "situationId" : "58bd2b214aa60a680a741e97" }, "state" : "validated" }
{ "_id" : ObjectId("58bd2e7e4aa60a680a741ec0"), "scenario" : { "situationId" : "58bd2de64aa60a680a741eb4" }, "state" : "validated" }
{ "_id" : ObjectId("58bd31f84aa60a680a741ef3"), "scenario" : { "situationId" : "58bd31944aa60a680a741ee3" }, "state" : "validated" }
VPS avec des specs acceptables, à la place du serveur dédié ?
Absolument, mais gardons une marge pour supporter un pic ×10.
Puis-je considérer que mes-aides-aah et mes-aides-rennes ne sont plus utilisées/alimentées ?
Ok pour Rennes. Pour l'AAH, le dernier test date du 6 mars, je pense que c'est bon. On est bien d'accord que les tests existant seront migrés et pas supprimés ? Il y aura peut être un coup de migration à faire pour ces tests d'aileurs.
Oui bien sûr, pas de suppressions mais des migrations !
J'ai installé nvm sur le serveur dédié pour tester le passage en Node V6.
La commande suivante permet d'utiliser NVM dans les scripts de lancement de services :
sed --in-place 's/exec node server/exec bash -c \x27source \/home\/deploy\/.nvm\/nvm.sh \&\& exec node server\x27/' *.conf
L'idée est de modifier la version de Node par défaut en même temps que mes-aides-ui est déployé.
Création certificat SSL sur le VPS via un proxy sur le serveur dédié
root@sgmap1:~> diff /etc/nginx/conf.d/dds.conf_PRE_WELL_KNOWN_CHANGE /etc/nginx/conf.d/dds.conf_POST_WELL_KNOWN_CHANGE
15c15,23
< return 301 https://mes-aides.gouv.fr$request_uri;
---
>
> location /.well-known {
> proxy_pass http://vps.mes-aides.gouv.fr;
> proxy_redirect off;
> }
>
> location / {
> return 301 https://mes-aides.gouv.fr$request_uri;
> }
Le script de déploiement est donc :
cp -f /etc/nginx/conf.d/dds.conf_POST_WELL_KNOWN_CHANGE /etc/nginx/conf.d/dds.conf && sudo service nginx restart
Celui de rollback :
cp -f /etc/nginx/conf.d/dds.conf_PRE_WELL_KNOWN_CHANGE /etc/nginx/conf.d/dds.conf && sudo service nginx restart
@MattiSG cela te semble bon/pertinent ?
Diff de la zone DNS pre/post
Use VPS IP for root item and VPS name for everything else.
6c6
< IN A 37.187.147.133
---
> IN A 51.255.164.228
20c20
< monitor IN A 37.187.147.133
---
> monitor IN CNAME vps274040.ovh.net.
24c24
< simuler IN A 37.187.147.133
---
> simuler IN CNAME vps274040.ovh.net.
31c31
< www.simuler 60 IN TXT "4|https://simuler.mes-aides.gouv.fr"
---
> www.simuler 60 IN TXT "4|http://simuler.mes-aides.gouv.fr"
Note: Redirection de www.simuler vers root.
root@sgmap1:~# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/root 20G 15G 3.5G 82% /
devtmpfs 32G 4.0K 32G 1% /dev
none 4.0K 0 4.0K 0% /sys/fs/cgroup
none 6.3G 940K 6.3G 1% /run
none 5.0M 0 5.0M 0% /run/lock
none 32G 0 32G 0% /run/shm
none 100M 0 100M 0% /run/user
/dev/md3 1.8T 47G 1.7T 3% /home
Je déclare cet issue officieusement fermé 💃