betagouv/aides-jeunes-ops

Mise en production

Closed this issue · 18 comments

  • Ajout du monitoring
  • Mettre en place UptimeRobot et SetCronJob sur 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'utilisateur ubuntu
  • 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é 💃