From 5f56d250b666211c7f0cafd42cbabb4a2b7112b3 Mon Sep 17 00:00:00 2001 From: Maniack Crudelis Date: Thu, 8 Sep 2016 13:40:03 +0200 Subject: [PATCH] Lets encrypt et upgrade lock --- demo_lxc_build.sh | 3 -- demo_lxc_build_init.sh | 75 +++++++++++++++++++++++++++++++++++++----- demo_lxc_remove.sh | 11 ++++++- demo_stop.sh | 4 +++ demo_switch.sh | 6 +++- demo_upgrade.sh | 7 ++-- 6 files changed, 91 insertions(+), 15 deletions(-) diff --git a/demo_lxc_build.sh b/demo_lxc_build.sh index 7472434..ae2ec41 100755 --- a/demo_lxc_build.sh +++ b/demo_lxc_build.sh @@ -93,9 +93,6 @@ USER_DEMO_CLEAN=${USER_DEMO//"_"/""} echo "> Ajout de l'utilisateur de demo" | tee -a "$LOG_BUILD_LXC" ssh $ARG_SSH $LXC_NAME1 "sudo yunohost user create --firstname \"$USER_DEMO_CLEAN\" --mail \"$USER_DEMO_CLEAN@$DOMAIN\" --lastname \"$USER_DEMO_CLEAN\" --password \"$PASSWORD_DEMO\" \"$USER_DEMO\" --admin-password=\"$YUNO_PWD\"" -# echo "> Ajout du certificat SSL via Let's encrypt" | tee -a "$LOG_BUILD_LXC" -# ssh $ARG_SSH $LXC_NAME1 "sudo yunohost app install https://github.com/YunoHost-Apps/letsencrypt_ynh -a \"domain=$DOMAIN&admin=$USER_DEMO&installForAllDomains=Yes\"" - echo -e "\n> Vérification de l'état de Yunohost" | tee -a "$LOG_BUILD_LXC" ssh $ARG_SSH $LXC_NAME1 "sudo yunohost -v" | tee -a "$LOG_BUILD_LXC" 2>&1 diff --git a/demo_lxc_build_init.sh b/demo_lxc_build_init.sh index 5416ab2..70457c3 100755 --- a/demo_lxc_build_init.sh +++ b/demo_lxc_build_init.sh @@ -13,6 +13,7 @@ LXC_NAME2=$(cat "$script_dir/demo_lxc_build.sh" | grep LXC_NAME2= | cut -d '=' - PLAGE_IP=$(cat "$script_dir/demo_lxc_build.sh" | grep PLAGE_IP= | cut -d '=' -f2) IP_LXC1=$(cat "$script_dir/demo_lxc_build.sh" | grep IP_LXC1= | cut -d '=' -f2) IP_LXC2=$(cat "$script_dir/demo_lxc_build.sh" | grep IP_LXC2= | cut -d '=' -f2) +MAIL_ADDR=$(cat "$script_dir/demo_lxc_build.sh" | grep MAIL_ADDR= | cut -d '=' -f2) # Check root # CHECK_ROOT=$EUID @@ -29,9 +30,9 @@ echo "$DOMAIN" > "$script_dir/domain.ini" # Créer le dossier de log sudo mkdir -p $(dirname $LOG_BUILD_LXC) -echo "> Update et install lxc lxctl" | tee "$LOG_BUILD_LXC" +echo "> Update et install lxc, lxctl et mailutils" | tee "$LOG_BUILD_LXC" sudo apt-get update >> "$LOG_BUILD_LXC" 2>&1 -sudo apt-get install -y lxc lxctl >> "$LOG_BUILD_LXC" 2>&1 +sudo apt-get install -y lxc lxctl mailutils >> "$LOG_BUILD_LXC" 2>&1 echo "> Autoriser l'ip forwarding, pour router vers la machine virtuelle." | tee -a "$LOG_BUILD_LXC" echo "net.ipv4.ip_forward=1" | sudo tee /etc/sysctl.d/lxc_demo.conf >> "$LOG_BUILD_LXC" 2>&1 @@ -74,7 +75,7 @@ EOF echo "> Mise en place du reverse proxy et du load balancing" | tee -a "$LOG_BUILD_LXC" echo | sudo tee /etc/nginx/conf.d/$DOMAIN.conf <> "$LOG_BUILD_LXC" 2>&1 upstream $DOMAIN { - server $IP_LXC1:443 ; + server $IP_LXC1:80 ; server $IP_LXC2:443 ; } @@ -83,12 +84,12 @@ server { listen [::]:80; server_name $DOMAIN; - location '/.well-known/acme-challenge' { - default_type "text/plain"; - root /tmp/letsencrypt-auto; - } + location '/.well-known/acme-challenge' { + default_type "text/plain"; + root /tmp/letsencrypt-auto; + } - if (\$scheme = http) { + if (\$scheme = http) { rewrite ^ https://\$server_name\$request_uri? permanent; } @@ -101,6 +102,15 @@ server { listen [::]:443 ssl; server_name $DOMAIN; + ssl_certificate /etc/letsencrypt/live/$DOMAIN/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/$DOMAIN/privkey.pem; + ssl_session_timeout 5m; + ssl_session_cache shared:SSL:50m; + ssl_prefer_server_ciphers on; + ssl_protocols TLSv1 TLSv1.1 TLSv1.2; + ssl_ciphers ALL:!aNULL:!eNULL:!LOW:!EXP:!RC4:!3DES:+HIGH:+MEDIUM; + add_header Strict-Transport-Security "max-age=31536000;"; + location / { proxy_pass https://$DOMAIN; proxy_redirect off; @@ -118,6 +128,55 @@ EOF sudo service nginx reload +echo "> Installation de let's encrypt et création du certificat SSL." | tee -a "$LOG_BUILD_LXC" +cd ~ +# Télécharge let's encrypt +git clone https://github.com/letsencrypt/letsencrypt +cd letsencrypt/ +# Installe les dépendances de let's encrypt +./letsencrypt-auto --help +sudo mkdir /etc/letsencrypt + +# Créer le fichier de config +echo | sudo tee /etc/letsencrypt/conf.ini <> "$LOG_BUILD_LXC" 2>&1 +################################# +# Let's encrypt configuration # +################################# + +# Taille de la clef +rsa-key-size = 4096 + +# Email de notification / contact si necessaire dans le futur +email = $MAIL_ADDR + +# Utiliser l'interface texte +text = True +# Accepter les Conditions d'Utilisation du service +agree-tos = True + +# Utiliser la methode d'authentification webroot +# avec le contenu dans /tmp/letsencrypt-auto +authenticator = webroot +webroot-path = /tmp/letsencrypt-auto + +# (Serveur de test uniquement : si vous l'utilisez, +# votre certificat ne sera pas vraiment valide) +# server = https://acme-staging.api.letsencrypt.org/directory +EOF + +mkdir -p /tmp/letsencrypt-auto +# Créer le certificat +./letsencrypt-auto certonly --config /etc/letsencrypt/conf.ini -d $DOMAIN + +# Route l'upstream sur le port 443. Le port 80 servait uniquement à let's encrypt +sudo sed -i "s/server $IP_LXC1:80 ;/server $IP_LXC1:443 ;/" /etc/nginx/conf.d/$DOMAIN.conf + +# Mise en place du cron de renouvellement. +wget https://raw.githubusercontent.com/YunoHost-Apps/letsencrypt_ynh/master/sources/certificateRenewer +sed -i "s/DOMAIN_NAME/$DOMAIN/" certificateRenewer +sed -i "s/ADMIN_EMAIL/$MAIL_ADDR/" certificateRenewer +sudo mv certificateRenewer /etc/cron.weekly/ + echo "\nLe serveur est prêt à déployer les conteneurs de demo." echo "Exécutez le script demo_lxc_build.sh pour créer les conteneurs et mettre en place la demo." # Déploie les conteneurs de demo diff --git a/demo_lxc_remove.sh b/demo_lxc_remove.sh index a9f8a7e..37cf24d 100755 --- a/demo_lxc_remove.sh +++ b/demo_lxc_remove.sh @@ -28,7 +28,6 @@ sudo sysctl -p echo "> Supprime le brige réseau" sudo rm /etc/network/interfaces.d/lxc_demo -# LXC était déjà installé sur le serveur de demo actuel. On ne l'enlève pas. echo "> Remove lxc lxctl" sudo apt-get remove lxc lxctl @@ -39,5 +38,15 @@ BEGIN_LINE=$(cat $HOME/.ssh/config | grep -n "^# ssh $LXC_NAME1" | cut -d':' -f sed -i "$BEGIN_LINE,/^# End ssh $LXC_NAME1/d" $HOME/.ssh/config # Suppression du reverse proxy +echo "> Suppression de la config nginx" sudo rm /etc/nginx/conf.d/$DOMAIN.conf sudo service nginx reload + +# Suppression du certificat Let's encrypt +echo "> Suppression de Let's encrypt" +sudo rm -r /etc/letsencrypt +sudo rm -r ~/.local/share/letsencrypt +sudo rm -r ~/letsencrypt +sudo rm -r /var/lib/letsencrypt +# Supprime la tache cron +sudo rm /etc/cron.weekly/certificateRenewer diff --git a/demo_stop.sh b/demo_stop.sh index c13630c..8338bfe 100755 --- a/demo_stop.sh +++ b/demo_stop.sh @@ -36,4 +36,8 @@ if sudo ifquery lxc_demo --state > /dev/null; then sudo ifdown --force lxc_demo fi +echo "Suppression des lock." +sudo rm /var/lib/lxc/$LXC_NAME1/lock_file +sudo rm /var/lib/lxc/$LXC_NAME2/lock_file + sudo lxc-ls -f diff --git a/demo_switch.sh b/demo_switch.sh index 10728bb..4fc5cef 100755 --- a/demo_switch.sh +++ b/demo_switch.sh @@ -22,13 +22,17 @@ else # Sinon, on suppose que c'est la machine 2 qui est en cours. # Si aucune machine ne tourne, la première démarrera. fi +while sudo test -e /var/lib/lxc/$LXC_B/lock_file; do + sleep 5 # Attend que le conteneur soit libéré par le script upgrade, le cas échéant. +done + # Démarre le conteneur B et arrête le conteneur A. sudo lxc-start -n $LXC_B -o "$script_dir/demo_switch.log" -d > /dev/null # Démarre l'autre machine sleep 10 # Attend 10 seconde pour s'assurer du démarrage de la machine. if [ "$(sudo lxc-info --name $LXC_B | grep -c "STOPPED")" -eq "1" ] then # Le conteneur n'a pas réussi à démarrer. On averti un responsable par mail... - mail -a "Content-Type: text/plain; charset=UTF-8" -s "Demo Yunohost" $MAIL_ADDR "Échec du démarrage du conteneur $LXC_B sur le serveur de demo!" + mail -a "Content-Type: text/plain; charset=UTF-8" -s "Demo Yunohost" $MAIL_ADDR <<< "Échec du démarrage du conteneur $LXC_B sur le serveur de demo!" exit 1 else # Bascule sur le conteneur B avec le load balancing de nginx... diff --git a/demo_upgrade.sh b/demo_upgrade.sh index 24afed6..e9c8afe 100755 --- a/demo_upgrade.sh +++ b/demo_upgrade.sh @@ -26,9 +26,11 @@ UPGRADE_DEMO_CONTAINER () { # Démarrage, upgrade et snapshot sudo lxc-wait -n $MACHINE -s 'STOPPED' -t $TIME_OUT while sudo test -e /var/lib/lxc/$MACHINE/lock_file; do - sleep 1 # Attend que le conteneur soit libéré par le script switch. + sleep 5 # Attend que le conteneur soit libéré par le script switch. done + sudo touch /var/lib/lxc/$MACHINE/lock_file # Met en place un fichier pour indiquer que la machine est indisponible pendant l'upgrade + # Restaure le snapshot sudo lxc-snapshot -r snap0 -n $MACHINE @@ -63,7 +65,7 @@ UPGRADE_DEMO_CONTAINER () { # Démarrage, upgrade et snapshot if [ "$?" -ne 0 ]; then # Si le script a échoué, le snapshot est annulé. echo "Échec du script $LIGNE" mv -f "$script_dir/upgrade.d/$LIGNE" "$script_dir/upgrade.d/$LIGNE.fail" - mail -a "Content-Type: text/plain; charset=UTF-8" -s "Demo Yunohost" $MAIL_ADDR "Échec d'exécution du script d'upgrade $LIGNE sur le conteneur $MACHINE sur le serveur de demo!\nLe script a été renommé en .fail, il ne sera plus exécuté tant que le préfixe ne sera pas retiré." + mail -a "Content-Type: text/plain; charset=UTF-8" -s "Demo Yunohost" $MAIL_ADDR <<< "Échec d'exécution du script d'upgrade $LIGNE sur le conteneur $MACHINE sur le serveur de demo!\nLe script a été renommé en .fail, il ne sera plus exécuté tant que le préfixe ne sera pas retiré." update_apt=0 fi done @@ -93,6 +95,7 @@ UPGRADE_DEMO_CONTAINER () { # Démarrage, upgrade et snapshot done fi fi + sudo rm /var/lib/lxc/$MACHINE/lock_file # Libère le lock, la machine est à nouveau disponible } UPGRADE_DEMO_CONTAINER $LXC_NAME1 $IP_LXC1